运维日常踩坑——Docker

Docker 版本更新

CYQ July 25, 2019 views 901 words

起因

由于17.12.0-ce的Docker存在一个严重bug,会导致各种操作显示

1
connection error: desc = "transport: dial unix /var/run/docker/containerd/docker-containerd.sock: connect: connection refused": unknown

而实验室的若干台机器都是装的这个版本,就导致用户和管理员无法进入、重启、停止正在某些运行的container。

这个问题#36002被一万个人遇到过,虽然可以通过一些临时措施解决,但最好的解决方案还是将docker升级到已修复这个bug的最新版本。然而一部分用户的container仍然是正常可用的,因此升级时希望能够尽可能多的保留这些container。

解决方案

此方法不会清除任何container,但对container内运行的程序有影响,建议做好备份。

更新源

如果没有添加过docker的源,需要先加一遍

1
2
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-add-repository 'deb https://apt.dockerproject.org/repo ubuntu-xenial main'

注意:此处的由于使用的是Ubuntu 16.04,源为xenial,如果其他版本需要做对应的修改。

卸载旧版本docker

1
sudo apt-get purge -y docker.io docker-engine

安装新版本

1
2
sudo apt-get update
sudo apt-get install -y docker-ce

恢复旧版本容器

经过上面的步骤,新版本的docker应该正常运行了,但是所有旧版本的时建立的container都无法访问了。此时需要重启host,之后各用户就可以进入各自的容器了。

此时的容器丢失了许多信息(如挂载目录),这只需要用户在容器内强制重启,初始化容器即可

1
sudo reboot -f