摘自:https://blog.csdn.net/weixin_46152207/article/details/127533584

在升级前确定几个重点:

原配置文件备份一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
[root@localhost ~]# cat /usr/lib/systemd/system/docker.service 
[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.com
After=network.target
Wants=docker-storage-setup.service
Requires=docker-cleanup.timer

[Service]
Type=notify
NotifyAccess=main
EnvironmentFile=-/run/containers/registries.conf
EnvironmentFile=-/etc/sysconfig/docker
EnvironmentFile=-/etc/sysconfig/docker-storage
EnvironmentFile=-/etc/sysconfig/docker-network
Environment=GOTRACEBACK=crash
Environment=DOCKER_HTTP_HOST_COMPAT=1
Environment=PATH=/usr/libexec/docker:/usr/bin:/usr/sbin
ExecStart=/usr/bin/dockerd-current \
--add-runtime docker-runc=/usr/libexec/docker/docker-runc-current \
--default-runtime=docker-runc \
--exec-opt native.cgroupdriver=systemd \
--userland-proxy-path=/usr/libexec/docker/docker-proxy-current \
--init-path=/usr/libexec/docker/docker-init-current \
--seccomp-profile=/etc/docker/seccomp.json \
$OPTIONS \
$DOCKER_STORAGE_OPTIONS \
$DOCKER_NETWORK_OPTIONS \
$ADD_REGISTRY \
$BLOCK_REGISTRY \
$INSECURE_REGISTRY \
$REGISTRIES
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity
TimeoutStartSec=0
Restart=on-abnormal
KillMode=process

[Install]
WantedBy=multi-user.target

停止当前所有容器运行,并记录下container-id

1
docker stop $(docker ps -a -q) 

清楚知道Docker的存储目录在哪里

默认目录:/var/lib/docker

如果有配置到其它存储目录,记得额外注意下以下两个地方

  • /etc/docker/daemon.json文件
1
2
3
4
5
{
"insecure-registries": ["xxx:5000"],
"registry-mirrors": ["https://mirror.ccs.tencentyun.com"],
"data-root": "/mnt/datadisk0/docker" # 这里多注意下
}
  • /usr/lib/systemd/system/docker.service 文件中的graph参数【默认可能是不带的】 --graph=/mnt/datadisk0/docker

进行升级高版本docker

将低版本Docker卸载

不删除 /var/lib/docker 目录 就不会删除已安装的镜像及容器

1
2
3
4
5
[root@localhost docker]# yum list installed | grep docker
docker.x86_64 2:1.13.1-209.git7d71120.el7.centos @extras
docker-client.x86_64 2:1.13.1-209.git7d71120.el7.centos @extras
docker-common.x86_64 2:1.13.1-209.git7d71120.el7.centos @extras
[root@localhost ~]# yum -y remove docker*

安装yum管理工具和必备工具包

1
yum install -y yum-utils device-mapper-persistent-data lvm2

添加国内镜像源

1
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

刷新仓库信息

1
yum repolist

查看软件版本

1
2
3
4
5
6
7
8
yum list docker-ce --showduplicates|sort -r

docker-ce.x86_64 3:18.09.6-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.5-3.el7 docker-ce-stable
docker-ce.x86_64 18.03.1.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 18.03.0.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.12.1.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.03.3.ce-1.el7 docker-ce-stable

安装指定版本的docker

1
2
3
4
5
6
7
8
9
# 安装docker-ce-18.03.1.ce-1.el7。若要安装其他版本则按照以下格式进行安装:docker-ce-,其它版本还有去掉“3:”
yum -y install docker-ce-18.03.1.ce-1.el7.centos
[root@localhost ~]# systemctl start docker
[root@localhost ~]# systemctl status docker
# 将docker服务设置为开机启动。
[root@ChatDevOps-01 ~]# systemctl enable docker
# Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[root@localhost ~]# docker --version
# Docker version 18.03.1-ce, build 9ee9f40

查看容器和镜像依然存在

启动容器报错处理:

报错①Error response from daemon: Unknown runtime specified docker-runc

这是因为低版本升级到高版本之后不兼容 修改参数进行解决

报错①解决方法:

更改/var/lib/docker/containers目录中的文件参数,把docker-runc替换为runc

命令:

1
grep -rl 'docker-runc' /var/lib/docker/containers/ | xargs sed -i 's/docker-runc/runc/g'

注:grep -rl:递归搜索目录和子目录,只列出含有匹配的文本行的文件名,而不显示具体的匹配内容
xargs:衔接执行之前得到的值

总体意思是把/var/lib/docker/containers中含有‘docker-runc’的文件搜索出来,并把‘docker-runc’字符为runc

重新启动docker

1
systemctl restart docker

报错②Error response from daemon: error creating overlay mount to /var/lib/docker/overlay2/09f8444f734ca18130ac4e2dafdcd3a19dd2986c9474bd0a50c87c0af559a831/merged: invalid argument

报错②解决方法:

解决方案无非是SELINUX要么都关闭,要么都开启

推荐修改CentOS下的/etc/selinux/config 将SELINUX=disabled 改成 SELINUX=permissive

1
2
3
4
5
vi /etc/selinux/config
# 找到SELINUX=enable修改为SELINUX=permissive
SELINUX=permissive
# 保存
:wq

或者修改docker关闭selinux

1
2
3
4
5
6
vi /etc/sysconfig/docker
# 找到OPTIONS="--selinux-enabled --log-driver=journald --signature-verification=false"
# 删除 --selinux-enabled
OPTIONS="--log-driver=journald --signature-verification=false"
# 保存
:wq

另外docker-18.03已经废弃使用overlay1了,overlay2存储才是今后所支持的,因此不建议按照网上某文章的教程那样将docker的存储驱动改回overlay1。改回overlay1的方式只是治标不治本,正解是修改selinux配置。

重启所有旧容器

拿到之前记录下container-id

1
docker restart {xxx,xxx,xxx}