docker容器随随docker服务启动而启动

2020-12-29 Views970字5 min read

原文链接

一、我们的需求

让Docker容器跟随宿主机启动而启动

二、Restart policy机制

Docker提供了Restart policy机制,可以在容器退出或者Docker重启时控制容器能够自启动。这种Restart policy可以保证相关容器按照正确顺序启动。虽然也可以通过进程监控的方式(如systemd)来完成这种动作,但Docker还是建议尽量避免使用进程监控的方式来"自启动" 容器。

Docker的 Restart policy与dockerd命令的--live-restore启动标志还有区别:–live-restore标志可以在Docker升级的时候保证容器继续运行,但是网络以及用户终端输入会被中断。
那到底什么是restart policy呢?我们来看看实际的情况吧。

三、docker run的restart参数

在使用docker run启动容器时,使用–restart参数来设置:

docker run -m 512m --memory-swap 1G-it -p 58080:8080 --restart=always --name bvrfis --volumes -from logdata mytomcat:4.0 /root/run.sh
1
–restart具体参数值详细信息:

no - 容器不自动重启
on-failure - 容器退出状态不为0时自动重启
on-failure:[n] - 容器退出状态不为0时自动重启,最大尝试n次
always - 始终尝试自动重启
如果创建时未指定 --restart=always ,可通过update 命令设置

docker update --restart=always 容器名称
1
在使用on - failure参数时,指定Docker将尝试重新启动容器的最大次数。

默认情况下,Docker将尝试永远重新启动容器。

尝试重启redis容器10次

docker run --restart=on-failure:10 redis
1

四、举例验证

接下来我们通过举例来验证

[root@docker ~]# docker run -i -t -d --name centos_aways --restart=always centos
e278cabec91e36f5582d92ba3ddb95ac17a0c2c59d8cdcc60791a28075e8abce
[root@docker ~]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e278cabec91e centos "/bin/bash" 5 seconds ago Up 4 seconds
[root@docker ~]# init 6 #重启机器
[root@docker ~]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e278cabec91e centos "/bin/bash" 3 minutes ago Up About a minute
1
2
3
4
5
6
7
8
9
Docker服务重启后,查看添加了--restart=always参数的容器能否自动启动

[root@docker ~]# /etc/init.d/docker stop
Stopping docker: [ OK ]
[root@docker ~]# /etc/init.d/docker start
Starting docker: [ OK ]
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
14caa9ab03a9 dockerui/dockerui "/dockerui" 11 minutes ago Up 3 seconds 0.0.0.0:9000->9000/tcp dockerui_qinwen
e278cabec91e centos "/bin/bash" About an hour ago Up 3 seconds centos_aways
1
2
3
4
5
6
7
8
在这里我们看到两台容器的状态还是up

五、Restart policy细节

使用Restart policies时需要注意如下细节:

容器只有在成功启动后restart policy才能生效。这里的"成功启动"是指容器处于up至少10秒且已经处于docker监管。这是避免没有成功启动的容器陷入restart的死循环。
如果手动(manually)的stop(与前面的explicitly stopped有何区别)一个容器,容器设置的restart policy将会被忽略,除非Docker daemon重启或者容器手动重启。这是避免了另外一种死循环。
restart policies只能用于容器,对于swarm services其restart policies有不通过的配置。
六、多个容器使用时的注意事项
1.用docker自带的--link把多个容器链接在一起,有重启或升级的问题,比如很多容器都依赖于 db 这个容器,然后db容器重启了,重启时docker分配的ip会变,导致其他依赖于db的容器都要重启。
2.–link 链接的容器还有启动顺序的问题, 需要先启动db容器再启动其他依赖于db的容器, 这样导致 --link和--restart=always 不能一起用, 如果一起用会发现宿主机重启了, docker容器并没有全部重启。
3.因为这时候docker容器是同时被启动的,并不知道启动顺序。 最后决定不用 --link 链接容器了

EOF