问题背景
因为使用docker
的时候还未配置过防火墙,前段时间手欠开启了防火墙配置,当然也不算手欠,这是安全标配。
那这跟我重启Docker
有毛线的关系呢,且听我给你叨叨。不想听的直接滑到底部查看结果即可。
因为redis
最开始未设置密码,导致被扫存在严重安全风险(由上可见安全意识多差😠)。所以想要重新启动一个容器并开启密码配置,结果报错了
[docker@VM_0_8 ~]# docker run -d --name docker_redis -p 6379:6379 redis:latest --requirepass "docker6379"
72911593e322bc4bcafxxxxxxxxxxxx386c2e88008c0354cd055dfe94b15b
docker: Error response from daemon: driver failed programming external connectivity on endpoint redis (6fb5b584085d6012d2d108c71xxxxxxxxxx1549f188db812efd1578): (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 6379 -j DNAT --to-destination 172.18.0.7:16701 ! -i docker0: iptables: No chain/target/match by that name.
(exit status 1)).
至此就需要重启Docker
了,终于回到正文了。如果有线上应用的话,这么直接重启dockerd
内心怕是慌得一批吧。所以就需要优雅重启。
优雅重启
配置了docker live-restore
之后,再次重启dockerd
,不会重启容器的。
配置docker daemon
参数
打开 /etc/docker/daemon.json
,追加如下配置
{
// ....
"live-restore": true
}
配置生效并验证
给dockerd
发送SIGHUP
信号,dockerd
收到信号后会reload
配置
kill -SIGHUP $(pidof dockerd)
检查配置是否生效
docker info | grep -i live
# Live Restore Enabled: true
安心重启docker
systemctl restart docker
执行docker ps
可以发现之前运行的容器状态未发生改变,优雅重启dockerd
生效了。
后续
我们可以愉快的重启我们的redis
容器了。
如果需要升级docker版本
也是支持此特性的。相较17.06
之前的版本容易出现dockerd
内存泄漏的问题。我们可以直接升级对生产环境不会产生任何影响。