系统上原有docker版本:17.09.0-ce,因业务需要使用 18 版本,本文档记录了docker升级的基本步骤。

特别提醒⚠️:操作前请现将重要数据文件进行备份,以免造成数据丢失!

系统环境

系统信息和内核信息:

# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
# uname -r
3.10.0-514.26.2.el7.x86_64

Docker版本信息:

# docker version
Client:
 Version:      17.09.0-ce
 ....
Server:
 Version:      17.09.0-ce
 ....

升级docker前数据信息统计

  • (1)统计当前系统上镜像数量和名称:docker images|wc -l && docker images|awk 'OFS=":" {print $1,$2}' > docker_images.txt

  • (2)统计当前正在运行的容器数量和ID:docker ps |wc -l && docker ps -q > run_docker.txt

说明⚠️:

如升级完docker版本之后,发现有镜像丢失可以使用如下方法进行恢复操作:

for i in $(cat docker_images.txt);do docker pull $i;done

如升级完成后,重启原来运行的容器:

for i in $(cat run_docker.txt);do docker restart $i;done

停止运行中的docker

systemctl stop docker 
systemctl status docker

卸载17.09版本docker

yum remove -y docker-ce
rpm -e container-selinux

安装18版本docker

添加Docker源

# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

如果本步报错,内容如下:

-bash: yum-config-manager: 未找到命令

报错原因:

yum-config-manager 命令是在 yum-utils 软件包中的。某些发行版本中默认是不安装的!

处理方法:

# yum install -y yum-utils

更新源

# yum makecache

安装docker-ce

# yum install -y docker-ce

启动Docker

# systemctl start docker

开机自启动docker

# systemctl enable docker

查看docker版本

# docker version
Client:
 Version:           18.09.0
 API version:       1.39
 ....
Server: Docker Engine - Community
 Engine:
  Version:          18.09.0
  API version:      1.39 (minimum version 1.12)
  ....

扩展

可能会出现的问题

当完成 docker 版本升级之后,我这边启动 docker stack 服务。但是出现报错,系统给出错误提示如下:

fails: error="starting container failed: subnet sandbox join failed for \"10.0.0.0/24\": error creating VXLAN interface: file exists" module="node/agent/taskmanager" task.id=lns5iscwnbvh0yjeutq6tsj4q

这意味着,已经存在希望加入覆盖网络的新容器的网络VXLAN接口。

问题分析

我们先来看一下,使用覆盖网络的容器(由dockerd驱动)的启动顺序如下:

  • (1) Create a VXLAN interface which uses the VXLAN id of the associated Docker network (docker network create --driver=overlay ...) - at this point the VXLAN interface is visible on the host(ip -d link show);

  • (2)Then dockerd puts the VXLAN interface into the namespace of the container - at this point the VXLAN interface is not visible anymore on the host;

  • (3)When the container stops, the device is given back to the host;

  • (4)The device is deleted by the dockerd;

可能的原因:在3)和4)之间发生竞争条件并且不删除网络设备。

接着,我们查看下升级之前 swarm 使用的 overlay 网络信息:

docker network ls得到的信息==>rfw8buocv3x7 ov_net2 overlay swarm

然后,查看这个 overlay 的网络命名空间,网络命名空间文件不再操作系统默认的/var/run/netns下,可以手动通过软连接的方式查看:

ln -s/var/run/docker/netns /var/run/netns && ip netns得到的信息==>1-rfw8buocv3 (id: 2)

可以看见 host 有这个1-xx的namespace:ip netns exec 1-rfw8buocv3 brctl show

最后,查看主机上所有vx-*(看上面命令得到的结果,每个人可能不同,以自己的为准)设备状态:

ip -d link show | grep vx得到的信息==>

ip -d link show | grep vx
302: vx-001026-clblt: <BROADCAST,MULTICAST> mtu 1450 qdisc noop state DOWN mode DEFAULT group default 
    vxlan id 4134 srcport 0 0 dstport 4789 proxy l2miss l3miss ageing 300 addrgenmode eui64 
5958: vx-00103a-rtu2q: <BROADCAST,MULTICAST> mtu 1450 qdisc noop state DOWN mode DEFAULT group default 
    vxlan id 4154 srcport 0 0 dstport 4789 proxy l2miss l3miss ageing 300 addrgenmode eui64 
1869: vx-001048-tzm7a: <BROADCAST,MULTICAST> mtu 1450 qdisc noop state DOWN mode DEFAULT group default 
    vxlan id 4168 srcport 0 0 dstport 4789 proxy l2miss l3miss ageing 300 addrgenmode eui64 
7014: vx-00100d-cajmu: <BROADCAST,MULTICAST> mtu 1450 qdisc noop state DOWN mode DEFAULT group default 
    vxlan id 4109 srcport 0 0 dstport 4789 proxy l2miss l3miss ageing 300 addrgenmode eui64 
124: vx-00101d-muh5b: <BROADCAST,MULTICAST> mtu 1450 qdisc noop state DOWN mode DEFAULT group default 
    vxlan id 4125 srcport 0 0 dstport 4789 proxy l2miss l3miss ageing 300 addrgenmode eui64 
177: vx-001011-dr80h: <BROADCAST,MULTICAST> mtu 1450 qdisc noop state DOWN mode DEFAULT group default 
    vxlan id 4113 srcport 0 0 dstport 4789 proxy l2miss l3miss ageing 300 addrgenmode eui64 
1230: vx-001012-qyjw6: <BROADCAST,MULTICAST> mtu 1450 qdisc noop state DOWN mode DEFAULT group default 
    vxlan id 4114 srcport 0 0 dstport 4789 proxy l2miss l3miss ageing 300 addrgenmode eui64 
9438: vx-001057-r4tv3: <BROADCAST,MULTICAST> mtu 1450 qdisc noop state DOWN mode DEFAULT group default 
    vxlan id 4183 srcport 0 0 dstport 4789 proxy l2miss l3miss ageing 300 addrgenmode eui64 
1252: vx-00100f-drzik: <BROADCAST,MULTICAST> mtu 1450 qdisc noop state DOWN mode DEFAULT group default 
    vxlan id 4111 srcport 0 0 dstport 4789 proxy l2miss l3miss ageing 300 addrgenmode eui64 
9447: vx-00106c-qsonr: <BROADCAST,MULTICAST> mtu 1450 qdisc noop state DOWN mode DEFAULT group default 
    vxlan id 4204 srcport 0 0 dstport 4789 proxy l2miss l3miss ageing 300 addrgenmode eui64 
245: vx-00100b-307v6: <BROADCAST,MULTICAST> mtu 1450 qdisc noop state DOWN mode DEFAULT group default 
    vxlan id 4107 srcport 0 0 dstport 4789 proxy l2miss l3miss ageing 300 addrgenmode eui64 

所有这些设备都死了(state DOWN)但没有删除!这意味着在这个Docker主机上,将无法启动想要加入其中一个受影响的覆盖网络的容器(查看id)。

解决方法

如:ip link delete vx-00100f-drzik

参考文档

Centos 7.5 安装Docker 18

CentOS yum-config-manager command not found

Docker Swarm Network – Down the Rabbit Hole