教大家怎样运行多进程Docker容器

教大家怎样运行多进程Docker容器,第1张

1. 安装 Docker在开始前,我们首先得确保在Linux主机中已经安装了Docker。这里,我运行的是CentOS 7 主机,我们将运行yum管理器和下面的命令来安装Docker。# yum install docker# systemctl restart docker.service2. 创建 Dockerfile现在,Docker守护进程已经在运行中了,我们现在准备创建自己的Firefox Docker容器。我们要创建一个Dockerfile,在其中我们要输入需要的配置来创建一个可以工作的Firefox容器。为了运行 Docker 镜像我们需要使用最新版本的CentOS。要创建 Docker 镜像,我们需要用文本编辑器创建一个名为Dockerfile的文件。# nano Dockerfile

2.1 在测试机启动容器,安装ssh

docker run -i -t ubuntu /bin/bash #此方式运行的容器,退出后容器就会关闭。

apt-get install openssh-server #安装ssh

#需要修改/etc/sshd/sshd_config文件中内容

PermitRootLogin yes

UsePAM no

2.2 启动ssh,容器以后台方式运行

docker run -d -p 50001:22 <容器id>/usr/sbin/sshd-D

#容器id可通过 docker ps-a查看,最上面的为最新的。

2.3 通过ssh连接到容器安装软件

ssh root@127.0.0.1-p 50001

#连上后想装什么就装什么,可使用exit退出容器,但后台还会运行。

2.4 服务安装完成后,停止容器。

docker stop <容器id>#停止运行的容器

2.5 把容器提交生成最新的镜像

docker commit <容器id>debian02 #把这个容器提交生成新的debian02镜像(该镜像是原始镜像与容器的整合)

2.6 打包镜像

docker save debian02 >/root/debian02.tar #debian02镜像打包

2.7 在另外的机器上导入镜像

docker load <debian02.tar #导入镜像

docker images #查看存在的镜像

2.8 启动容器

docker run -h="redis-test" --name redis-test -d -p 51000:22 -p51001:3306 -p 51003:6379 -p 51004:6381 -p 51005:80 -p 51006:8000 -p 51007:8888 debian02 /etc/rc.local

#此处是我测试机器启动命令,指定主机名与端口映射。

#启动后,后面又装了程序,开机自启动命令可放在/etc/rc.local文件中。

docker容器迁移简单方便,可以任意的拷贝部署,以后再也不怕新部署环境了,一堆依赖装的想死有木有。

3、关于docker容器的端口映射

由于docker容器的IP地址每次启动都会变,所以不适用于手动添加端口映射(难道每次重启都来查看容器的IP么?),所以需要每次启动容器时由docker程序自动添加NAT规则,前期尽可能的把需要映射的端口在创建容器时配置好,如下:docker run -h="activemq" --name activemq -d -p 51000:22 -p 51001:3306-p 51003:6379 -p 51004:6381 -p 51005:80-p 51006:8000 -p 51007:8888 debian/base/etc/rc.local

#此处我把mysql,redis,nginx,ssh都进行了映射。

后续对于docker容器的管理,记住容器的名称,如上述名称是activemq,则使用docker stop,start来控制容器进程。docker stop activemq

docker start activemq

当然,也可以不让docker每次启动容器修改容器的IP地址,参考如下:

docker网络配置:http://www.open-open.com/lib/view/open1404896485747.html

4、关于docker容器的多程序开机自动运行

docker容器每次启动时,开机自启动的命令都要在启动容器前指定。如 docker run -I -t debian /bin/bash命令,只会运行/bin/bash程序,其它的程序都不会运行,对于要跑多个程序的容器特别纠结。

多程序开机自动运行方法:

可把前面所说的启动命令换成dockerrun -I -t debian /etc/rc.local,在容器中把所有需要开机自的启动命令放在/etc/rc.local中,就可以达到多程序开机自启动了。

后台运行则是:docker run -d -p 50001:22 debian /etc/rc.local。注意:run命令是创建一个新的容器,如果要启动一个曾经运行过的容器,则用命令docker ps -a中找对应的容器ID,然后使用docker start <容器ID>即可。

1.shell方式启动

如dockerfile中定义

CMD "./run"

则容器内的PID为1的进程为/bin/sh -c "./run"

另外又有个进程./run

2.exec方式启动

如dockerfile中定义

CMD ["./run"]

则容器内的PID为1的进程直接就是./run

有何不同?退出机制可能大不相同

背景: docker stop的时候,会向PID为1的进程发送SIGTERM信号,通知进程关闭。如果10秒钟依然没有关闭,将会发送SIGKILL强制kill进程。

不同之处:

1.exec启动的进程会接收到SIGTERM信号,程序自行处理该信号,清理资源,优雅关闭。

2.shell启动的进程会接收到SIGTERM信号,但是shell进程没有处理该信号的逻辑,所以直接忽略该信号。

一直等到10秒后超时,收到了SIGKILL信号,强制kill所有的进程。

这时资源来不及释放,会导致各种数据不一致的问题。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11992784.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存