重启Docker守护进程后,如何维持Docker Service的容器副本数?
你已经在mach1、mach2、mach3三台机器上搭好了Docker Swarm集群,还创建了带3个副本的mysql-galera服务——担心重启Docker后副本数掉链子?别慌,咱们一步步来搞定这个问题:
先搞明白核心逻辑
Docker Swarm的服务调度是集群级管控的,只要集群里的管理节点(manager)能正常运行,哪怕某台节点重启Docker,Swarm会自动检测节点状态变化,照着你当初设置的--replicas 3配置,自动调度新容器补上,保证副本数达标。不过咱们可以做些配置让这个过程更稳妥。
1. 把Swarm集群搞成高可用(重中之重!)
要是你只有一个管理节点,那这个节点重启Docker的时候,整个集群的调度就暂时歇菜了。既然你有三台机器,不如把mach2和mach3都升级成管理节点:
# 在当前管理节点mach1上执行,把mach2提升为manager docker node promote mach2 # 再把mach3也升级成manager docker node promote mach3
这样哪怕其中一台manager重启Docker,另外两台还能正常干活,服务副本数不会出问题。
2. 让Docker守护进程开机自启
每台机器上都得把Docker设成开机自动启动,不然机器重启后Docker没起来,Swarm节点也没法归队:
# 针对systemd系统(比如Ubuntu 16.04+、CentOS 7+) sudo systemctl enable docker
要是你的系统用的是upstart,就执行sudo update-rc.d docker defaults。
3. 确认服务的重启策略(可选但更稳妥)
Docker Swarm服务默认的重启策略是any——不管容器是正常退出还是崩溃,都会自动重启。不过咱们可以显式更新这个策略,让它更贴合Galera集群的需求:
# 更新已有的mysql-galera服务的重启配置 docker service update --restart-condition any --restart-delay 5s mysql-galera
--restart-condition any保证任何退出场景都会重启容器,--restart-delay 5s是让它重启前等5秒,避免短时间内反复重启搞崩集群同步。
4. 重启后的检查步骤
重启某台机器的Docker后,咱们可以用这几个命令确认状态:
- 查看所有节点状态:
docker node ls,确保所有节点都是Ready状态 - 查看服务副本情况:
docker service ps mysql-galera,你会看到3个副本,可能有一个是新调度的(如果重启节点上的容器被销毁了),等一会儿状态就会变成Running - 查看集群日志:
docker service logs mysql-galera,检查有没有集群同步的错误信息,确保Galera集群正常运行
额外要注意的点
- 你配置的
DISCOVERY_SERVICE是10.0.0.2:2379(应该是etcd吧?),这个服务也得保证高可用,而且Docker重启后能正常运行,不然Galera节点没法互相发现,集群启动会出问题。 - 如果某个节点重启后一直没法加入Swarm,可以先在该节点执行
docker swarm leave --force,然后用manager节点生成的token重新加入:docker swarm join --token <你的节点加入token> <任意manager节点IP>:2377(token可以在manager节点用docker swarm join-token worker或manager查看)
内容的提问来源于stack exchange,提问作者Manjunath PV

