docker常用容器部署命令总结
总结一下Docker常用镜像 , 容器以及部署命令
docker常用命令
拉取镜像
docker pull ${image}:${version}
如果不写version默认为latest
查看日志
docker logs ${container}
docker logs -f ${container}
持续查看容器日志
进入容器内部
docker exec -it ${container} /bin/bash
设置docker自动启动
systemctl enable docker.service
设置容器自动启动
docker update ${container} --restart=always
docker常用容器部署命令
注意 , 如果使用-v 参数进行主机与容器的数据挂载 , 需要在主机里面提前创建好对应的目录 , 否则创建容器失败
举例
这里主机中并没有
/mydata
目录, 因此创建容器失败
1
2
3
4
5
6
7
8 [root@192 usr]# docker run --restart=always -d \
> -v /mydata/mysql/conf.d/my.cnf:/etc/mysql/my.cnf \
> -v/mydata/mysql/logs:/logs \
> -v /mydata/mysql/data/mysql:/var/lib/mysql \
> -p 3306:3306 --name mysqltest \
> -e MYSQL_ROOT_PASSWORD=root mysql:5.7
a0c1120e96b2d8b124e8c1b325f3518c21d240aca4a75c1739f0c7ffb5092847
docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error mounting "/mydata/mysql/conf.d/my.cnf" to rootfs at "/etc/mysql/my.cnf": mount /mydata/mysql/conf.d/my.cnf:/etc/mysql/my.cnf (via /proc/self/fd/6), flags: 0x5000: not a directory: unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type.
MySQL
A
1 | mkdir /mydata/mysql/conf.d/my.cnf; |
注释版
1 | docker run \ |
Elasticsearch
创建目录
mkdir -p /mydata/elasticsearch/config
mkdir -p /mydata/elasticsearch/data
echo "http.host: 0.0.0.0" >/mydata/elasticsearch/config/elasticsearch.yml
将mydata/elasticsearch/文件夹中文件都可读可写
chmod -R 777 /mydata/elasticsearch/
启动容器
一定要注意提前创建好目录
- -Xms64m -Xmx512m 设置最小和最大堆大小为64M 512M
1 | docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \ |
1 | docker run \ |
Nginx
-
随便启动一个nginx实例,只是为了复制出配置
1
2docker pull nginx:1.10;
docker run -p 8081:80 --name nginx -d nginx:1.10 -
将容器内的配置文件拷贝到/mydata/nginx/conf/ 下
1
2
3
4
5
6
7mkdir -p /mydata/nginx/html
mkdir -p /mydata/nginx/logs
mkdir -p /mydata/nginx/conf
docker container cp nginx:/etc/nginx . #拷贝到当前文件夹
由于拷贝完成后会在config中存在一个nginx文件夹,所以需要将它的内容移动到conf中
mv /mydata/nginx/conf/nginx/* /mydata/nginx/conf/
rm -rf /mydata/nginx/conf/nginx -
终止原容器:
1
docker stop nginx
-
执行命令删除原容器:
1
docker rm nginx
-
创建新的Nginx,执行以下命令
1
2
3
4
5
6
7
8docker run \
-p 80:80 \
--name nginx \
--restart=always \
-v /mydata/nginx/html:/usr/share/nginx/html \
-v /mydata/nginx/logs:/var/log/nginx \
-v /mydata/nginx/conf/:/etc/nginx \
-d nginx:1.10 -
设置开机启动nginx
1
docker update nginx --restart=always
-
创建*/mydata/nginx/html/index.html*文件,测试是否能够正常访问
1
echo '<h2>hello nginx!</h2>' >/mydata/nginx/html/index.html
访问:
http://${VirtualMachineIP}/index.html
Redis
创建配置文件
1 | mkdir -p /mydata/redis |
docker hub官方文档教程提到redis.conf
, docker-redis
默认没有配置文件,自己在宿主机建立后挂载映射
下面以6.2.6版本redis 示例, 配置redis.conf
A
https://raw.githubusercontent.com/redis/redis/6.2/redis.conf 完整redis 6.2配置文件
B
我们先从Redis官网下载最新Redis-6.2.6的源码包,解压出来,在 redis-6.2.6 目录里面复制 redis.conf 配置文件到 /mydata/redis/conf 目录下。
- 下载源码包
wget https://download.redis.io/releases/redis-6.2.6.tar.gz
- 解压
tar -xzf redis-6.2.6.tar.gz
- 复制redis.conf
cp redis-6.2.6/redis.conf /mydata/redis/conf/
- 更改 /mydata/redis 目录下所有文件的权限为可读可写可执行
chmod 777 -R /mydata/redis
- 删除下载的源码包以及redis
rm -rf redis-6.2.6
修改配置文件
修改*/mydata/redis/redis.conf*
1 | bind 0.0.0.0 开启远程权限 |
创建容器
1 | docker run \ |
Rabbitmq
拉取镜像
- management版本,不指定默认为最新版本latest
1 | docker pull rabbitmq:management |
运行MQ容器:
1 | docker run \ |
Nacos
简易版
docker pull nacos/nacos-server
Xmx
指定应用程序可用的最大堆大小Xms
指定应用程序可用的最小堆大小
1 | docker run \ |
接着访问http://${virtualMachineIP}:8848/nacos
即可, 账号密码均为nacos
详细版
上面的容器没有使用挂载, 如果我们在开发环境去写配置文件, 部署的时候会很不方便, 这里直接把nacos的数据持久化, 等到项目部署可以直接打包
拉取镜像
docker pull nacos/nacos-server
如果下载速度过慢可以往下滑查看 修改Docker镜像服务器
创建本地的映射文件
1 | mkdir -p /mydata/nacos/init.d /root/nacos/logs |
在文件中写入 management.endpoints.web.exposure.include=*
启动容器
这里具体的配置信息可以参考官方文档nacos/nacos-server - Docker Image | Docker Hub
版本为nacos2.2.0
1
2
3
4
5 [root@192 ~]# docker image inspect nacos/nacos-server:latest |grep -i version
"DockerVersion": "",
"org.label-schema.schema-version": "1.0",
"org.opencontainers.image.version": "v2.2.0"
1 | docker run \ |
在浏览器输入 http://${virtualMachineIP}/nacos , 默认登录密码为nacos / nacos
准备数据库
执行官网给的sql文件 , 创建数据库以及表结构
1 | /******************************************/ |
创建数据库,库名为 nacos-config
,并执行sql脚本
测试持久化
访问nacos控制台 Nacos
简单的添加一个配置信息
查看数据库config_info
表 , 可以看到配置已经持久化到MySQL
Oracle
Docker 安装 oracle - 黑质白章 - 博客园 (cnblogs.com)
使用docker安装Oracle 11g,因为使用docker 直接pull启动的话没办法做到数据持久化
首先pull镜像docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g
这里可以看到是aliyun的镜像, 因为Oracle官方没有Oracle的Docker镜像。
创建容器
启动临时容器获取初始化数据
1 | docker run \ |
创建目录
1 | mkdir -p /mydata/oracle/ |
把文件赋权给容器内Oracle用户
1 | chown -R 500.500 helowin |
删除临时容器
1 | docker rm -f oracle |
启动容器
1 | docker run \ |
进入镜像进行配置(root用户)
1 | docker exec -it -u root oracle11g /bin/bash |
切换root用户后修改配置文件,root密码为helowin
1 | vi /etc/profile |
内部新增如下配置信息:
1 | # oracle home目录 |
刷新环境变量
1 | source /etc/profile |
ps: 直接复制配置内容可能会出现乱码问题, 需要清除export 所在行的乱码, 变为空格 , 否则可能配置文件报错
创建软连接
1 | ln -s $ORACLE_HOME/bin/sqlplus /usr/bin |
切换oracle环境
1 | su - oracle |
登录sqlplus,修改sys、system用户密码,创建用户
1 | #登录 |
MongoDB
docker pull mongo
拉取最新版本镜像
创建并运行容器
注意 , 需要把–auth放到最后, 否则不会会创建失败
1 | docker run -d \ |
MongoDB数据库角色说明
- 数据库用户角色:read、readWrite;
- 数据库管理角色:dbAdmin、dbOwner、userAdmin;
- 集群管理角色:clusterAdmin、clusterManager、4. clusterMonitor、hostManage;
- 备份恢复角色:backup、restore;
- 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
- 超级用户角色:root
- 内部角色:__system
MongoDB中的role详解
- Read:允许用户读取指定数据库
- readWrite:允许用户读写指定数据库
- dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
- userAdmin:允许用户向system.users集合写入,可以在指定数据库里创建、删除和管理用户
- clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限
- readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
- readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
- userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
- dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限
- root:只在admin数据库中可用。超级账号,超级权限
补充
Linux目录结构及含义
-
/bin:
bin 是 Binaries (二进制文件) 的缩写, 这个目录存放着最经常使用的命令。 -
/boot:
这里存放的是启动 Linux 时使用的一些核心文件,包括一些连接文件以及镜像文件。 -
/dev :
dev 是 Device(设备) 的缩写, 该目录下存放的是 Linux 的外部设备,在 Linux 中访问设备的方式和访问文件的方式是相同的。 -
/etc:
etc 是 Etcetera(等等) 的缩写,这个目录用来存放所有的系统管理所需要的配置文件和子目录。 -
/home:
用户的主目录,在 Linux 中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的,如上图中的 alice、bob 和 eve。 -
/lib:
lib 是 Library(库) 的缩写这个目录里存放着系统最基本的动态连接共享库,其作用类似于 Windows 里的 DLL 文件。几乎所有的应用程序都需要用到这些共享库。 -
/lost+found:
这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。 -
/media:
linux 系统会自动识别一些设备,例如U盘、光驱等等,当识别后,Linux 会把识别的设备挂载到这个目录下。 -
/mnt:
系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在 /mnt/ 上,然后进入该目录就可以查看光驱里的内容了。 -
/opt:
opt 是 optional(可选) 的缩写,这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。默认是空的。 -
/proc:
proc 是 Processes(进程) 的缩写,/proc 是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。
这个目录的内容不在硬盘上而是在内存里,我们也可以直接修改里面的某些文件,比如可以通过下面的命令来屏蔽主机的ping命令,使别人无法ping你的机器:1
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
-
/root:
该目录为系统管理员,也称作超级权限者的用户主目录。 -
/sbin:
s 就是 Super User 的意思,是 Superuser Binaries (超级用户的二进制文件) 的缩写,这里存放的是系统管理员使用的系统管理程序。 -
/selinux:
这个目录是 Redhat/CentOS 所特有的目录,Selinux 是一个安全机制,类似于 windows 的防火墙,但是这套机制比较复杂,这个目录就是存放selinux相关的文件的。 -
/srv:
该目录存放一些服务启动之后需要提取的数据。 -
/sys:
这是 Linux2.6 内核的一个很大的变化。该目录下安装了 2.6 内核中新出现的一个文件系统 sysfs 。
sysfs 文件系统集成了下面3种文件系统的信息:针对进程信息的 proc 文件系统、针对设备的 devfs 文件系统以及针对伪终端的 devpts 文件系统。
该文件系统是内核设备树的一个直观反映。
当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中被创建。
-
/tmp:
tmp 是 temporary(临时) 的缩写这个目录是用来存放一些临时文件的。 -
/usr:
usr 是 unix shared resources(共享资源) 的缩写,这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于 windows 下的 program files 目录。 -
/usr/bin:
系统用户使用的应用程序。 -
/usr/sbin:
超级用户使用的比较高级的管理程序和系统守护程序。 -
/usr/src:
内核源代码默认的放置目录。 -
/var:
var 是 variable(变量) 的缩写,这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。
Linux常用命令
禁用防火墙
1 | # 关闭防火墙 |
修改Docker 镜像服务器
编辑 /etc/docker/daemon.json 配置文件
编辑文件vi /etc/docker/daemon.json
把以下配置信息放到文件中
1 | { |
重启docker
1 | systemctl daemon-reload |
检验
docker info
如果显示下面的信息, 说明配置成功