原来版本 1.10
更新后的版本 19.03.1
更新 Docker 版本需要注意的问题:
注意系统是否支持新版本的储存驱动.
19.03.01 版本默认使用的储存驱动是 overlay2.
overlay2 存储驱动使用需要满足以下条件:
一, 暂停原有的容器并导出
Docker 版本更新:
暂停所有 docker, 现有的镜像和容器都导出成 tar 包
导出容器
docker export container id -o d.tar
导出镜像
docker image save container -o a.tar
二, 移除原来的 Docker 并安装新的版本
移除老版本的 Docker
- yum remove docker \
- docker-client \
- docker-client-latest \
- docker-common \
- docker-latest \
- docker-latest-logrotate \
- docker-logrotate \
- docker-engine
安装新版本 Docker
- # yum-utils 提供了命令 yum-config-manager,device-mapper-persistent-data 和 lvm2 由需要 devicemapper 存储驱动程序.
- yum install -y yum-utils \
- device-mapper-persistent-data \
- lvm2
- # 设置 yum 源为 稳定的版本
- # 阿里的源, 国内使用较快
- yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- # 官方的源 (国内使用比较慢)
- yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
- # 生成缓存
- yum makecache
- # 如果要安装指定的版本
- yum list docker-ce --showduplicates | sort -r
- # 填入版本号到下面的命令 (docker-ce-19.03.0-3.el7)
- yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
- # 安装最新稳定版本 Docker CE
- yum install docker-ce docker-ce-cli containerd.io
三, 使用原来的数据目录, 或者 创建新的数据目录.
使用原来的数据目录
使用之前的数据目录, 也就是之前版本的数据目录, 这样 之前的镜像和容器就可以不用再导入了, 直接使用就行了.
指定之前的 储存目录, 我们之前 Docker 的储存目录是 /opt/docker.
- cat <<EOF>>/etc/docker/daemon.JSON
- {
- "data-root": "/opt/docker"
- }
- EOF
启动 docker
- systemctl start docker
- docker images # 我们可以看到之前的镜像都存在
- docker info # 我们可以看到
更新后改变的东西
日志驱动之前是 journal 现在是 logfile
数据目录:
- [root@iz23nb5ujp69 docker]# ls -l
- total 48
- drwx------ 2 root root 4096 Aug 6 15:58 builder
- drwx------ 4 root root 4096 Aug 6 15:58 buildkit
- drwxrwxrwx 5 root root 4096 Aug 6 16:31 containers
- drwxrwxrwx 5 root root 4096 Oct 13 2016 devicemapper
- drwxrwxrwx 3 root root 4096 Oct 13 2016 image
- drwxrwxrwx 3 root root 4096 Oct 13 2016 network
- drwx------ 4 root root 4096 Aug 6 15:58 plugins
- drwx------ 2 root root 4096 Aug 6 16:41 runtimes
- drwx------ 2 root root 4096 Aug 6 15:58 swarm
- drwx------ 2 root root 4096 Aug 6 16:41 tmp
- drwxrwxrwx 2 root root 4096 Oct 13 2016 trust
- drwxrwxrwx 2 root root 4096 Aug 6 15:58 volumes
原来的 1.10 版本 是 默认驱动 devicemapper , 使用上一个版本的 Docker 目录的话, 会使用上一个版本的默认的驱动 (为了兼容), 如果使用的是新的目录, 则会使用官方当前版本默认的储存驱动和日志引擎.
创建新的目录, 导入镜像
使用新的数据目录 /opt/docker-ce.
- cat <<EOF>>/etc/docker/daemon.JSON
- {
- "data-root": "/opt/docker-ce"
- }
- EOF
- systemctl restart docker
导入镜像
docker image import jenkins.tar fy:jenkins
导入的镜像会使用 Docker 的默认的驱动, 也就是 overlay2, 会使用默认的日志驱动. 不管原来镜像使用的什么驱动, 导入后会使用当前的默认储存驱动.
四, 更新过程中遇到的问题
我们按照上面步骤更新, 使用的是创建新的目录的方式. 当我们启动我们的 Jenkins 容器后, 执行构建后, 发现有下面的报错.
升级之后的问题. 删除文件夹报错. 命令是没有问题的.
进入容器我执行下面的命令, 也是报错.
- [root@491c264aea0d target]# rm -rf ./*
- rm: cannot remove `./classes/com/ugou88/wx/interceptor': Invalid argument
- rm: cannot remove `./classes/com/ugou88/wx/i/controller': Invalid argument
问题, 很有可能是驱动导致的, 就是储存驱动.
我们升级后 Docker 默认使用的驱动是 overlay2, 那么如果要使用该驱动需要满足以下条件.
overlay2`Docker CE 和 Docker EE 17.06.02-ee5 及更高版本支持该驱动程序, 是推荐的存储驱动程序.
需要 Linux 内核版本在 4.0 更高的版本或者使用 RHEL/CentOS 版本号大于 3.10.0-514.
在 overlay 和 overlay2 驱动程序支持 xfs 的文件系统, 但需要 d_type=true 启用.
使用 xfs_info 验证 ftype 选项设置为 1. 要 xfs 正确格式化 文件系统, 请使用该标志 - n ftype=1.
我们使用的 ext4 文件系统, Docker 的版本也高于 17.06.02, 但是我们的 CentOS 版本号是 低于 3.10.0-514 的, 所以我推测是由于 版本号过低, 导致储存驱动使用不了, 我们对系统进行快照后, 进行升级内核.
升级内核之后, 我们重启主机, 发现是可以正常使用的.
来源: https://www.cnblogs.com/operationhome/p/11322150.html