环境说明
- 操作系统: Centos 7.9.2009
- Docker Version: 18.09.9
模拟复现
rancher 安装
1
2
3
4
5
6
7
8
|
docker pull rancher/rancher:v2.3.5
docker run -d \
--restart=unless-stopped \
--name rancher \
-p 80:80 -p 443:443 \
--privileged \
rancher/rancher:v2.3.5
|
升级 rancher
示例将 v2.3.5
升级至 v2.5.0
创建备份
1
2
3
4
5
|
docker stop rancher
docker create --volumes-from rancher --name rancher-data rancher/rancher:v2.5.0
docker run --volumes-from rancher-data -v $PWD:/backup busybox tar zcvf /backup/rancher-data-backup-rancher2.3.5-20210116.tar.gz /var/lib/rancher
|
重新启动新容器
1
2
3
4
5
6
7
8
9
10
11
|
docker rename rancher rancher_old
docker run -d --name rancher --volumes-from rancher-data \
--restart=unless-stopped \
-p 80:80 -p 443:443 \
--privileged \
rancher/rancher:v2.5.0
docker logs -f --tail 100 rancher
docker update --restart=no rancher_old
|
问题表现
系统重启 或 手动重启 docker 服务时,docker 卡死无法启动
1
2
3
4
5
6
|
/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock # 手动启动,报错
Error starting daemon: pid file found, ensure docker is not running or delete /var/run/docker.pid
ps -ef|grep dockerd # 存在 僵尸进程
root 4081 1 0 13:49 ? 00:00:00 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
|
修复问题方法
此问题的原因,应该一个是 docker 中存在的一个 bug
,解决方法就是: 删掉系统其他无关的容器即可,只保留有用容器
,此示例中如:rancher_old
及 创建数据卷备份时使用的容器
。
清理容器
清理僵尸进程
先执行停止 docker 服务命令, 还是会卡住,不过没关系 使用 ctrl + c
,终止即可,目的已达到
1
2
3
4
5
6
|
service docker stop
yum install psmisc # 安装工具 ,使用 killall
killall dockerd
ps -ef|grep dockerd # 再次检查僵尸进程
|
进入 docker 对应数据卷的 containers
目录下,如未修改路径默认则为: /var/lib/docker/containers
1
2
|
cd /var/lib/docker/containers\
&& ls
|
可以看到我这里系统中存在有四个容器,我这里演示的只保留名为 rancher
的容器
查找名为 rancher
的容器 id ,并只将其做 保留
。
1
2
3
4
5
6
|
cd /var/lib/docker/containers
for i in `ls */config.v2.json`;do grep -l '"Name":"/rancher"' "$i";done|awk -F '/' '{print $1}'
96d6ea117475ffab7c5651812163ca45feded54463d93e992f9195964ae81282 # 找到 id
rm -rf !(96d6ea117475ffab7c5651812163ca45feded54463d93e992f9195964ae81282) # 谨慎确认后 执行
|
再次启动 docker 时,已可以正常启动
总结
此 docker bug 在 18.x 中 测试存在
,如在升级和使用 docker 的版本时应注意留意此问题。升级完容器后,及时清理无用旧容器,并在升级过程中做好相应的 备份
,避免导致数据的丢失。