CentOS 7下Docker从18.09.8升级到20.10.12完整避坑指南

对于仍在运行CentOS 7的系统管理员而言,将Docker从18.09.8升级到20.10.12是一个需要谨慎操作的过程。这不仅关系到容器服务的稳定性,还涉及复杂的依赖管理和配置调整。本文将深入解析升级过程中的关键步骤和常见陷阱,帮助你在生产环境中顺利完成升级。

1. 升级前的准备工作

在开始升级之前,必须做好充分的准备工作,这可以避免升级过程中出现意外情况导致服务中断。

备份关键数据是首要任务:

  • 使用docker ps -a命令列出所有容器,记录运行状态和配置
  • 备份/etc/docker/daemon.json配置文件(如果存在)
  • 备份重要的容器数据卷

检查系统环境

# 查看当前Docker版本
docker --version
# 检查系统内核版本
uname -r
# 验证yum源可用性
yum repolist

注意:确保系统时间正确,错误的系统时间可能导致证书验证失败,影响软件包下载。

停止相关服务

# 停止所有运行中的容器
docker stop $(docker ps -q)
# 停止Docker服务
systemctl stop docker

2. 清理旧版本和安装依赖

Docker的升级不是简单的版本替换,而是需要先清理旧版本再安装新版本,这过程中可能会遇到依赖冲突问题。

移除旧版本

yum remove docker \
           docker-client \
           docker-client-latest \
           docker-common \
           docker-latest \
           docker-latest-logrotate \
           docker-logrotate \
           docker-engine

安装必要工具

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

配置稳定的仓库

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

如果遇到网络问题,可以考虑使用国内镜像源:

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

3. 安装指定版本的Docker

在CentOS 7上安装特定版本的Docker需要精确控制软件包版本,避免自动安装最新版带来的兼容性问题。

查看可用版本

yum list docker-ce --showduplicates | sort -r

安装20.10.12版本

yum install -y docker-ce-20.10.12 docker-ce-cli-20.10.12 containerd.io

安装过程中可能会遇到依赖冲突,典型错误及解决方案:

错误类型解决方案
包冲突使用yum history查看冲突,必要时回滚操作
依赖缺失添加EPEL仓库:yum install -y epel-release
GPG密钥错误导入Docker官方GPG密钥

4. 解决SELinux和存储驱动问题

升级到Docker 20.10.12后,SELinux配置和存储驱动的变化可能导致容器无法正常启动。

调整SELinux策略

# 临时设置为permissive模式
setenforce 0
# 永久修改配置
sed -i 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/selinux/config

检查存储驱动

docker info | grep "Storage Driver"

如果显示为overlayoverlay2,通常无需调整。但若遇到以下错误:

Error response from daemon: error creating overlay mount to...

需要清理旧的存储数据:

systemctl stop docker
rm -rf /var/lib/docker/*
systemctl start docker

5. 处理容器运行时兼容性问题

从Docker 18.x升级到20.x,容器运行时接口发生了变化,可能导致旧容器无法启动。

常见错误及修复方法

  1. 运行时配置不兼容
# 查找并替换旧的运行时配置
grep -rl 'docker-runc' /var/lib/docker/containers/ | xargs sed -i 's/docker-runc/runc/g'
  1. 网络配置冲突
# 清理旧的网络配置
docker network prune -f
# 重启Docker服务
systemctl restart docker
  1. 容器启动顺序问题
# 查看容器依赖关系
docker inspect --format='{{.HostConfig.Links}}' 容器名
# 按依赖顺序手动启动容器

6. 验证升级结果

完成所有步骤后,需要全面验证升级是否成功以及系统是否正常运行。

基础验证

# 检查Docker版本
docker --version
# 验证服务状态
systemctl status docker
# 测试基本功能
docker run hello-world

高级验证

# 检查容器日志
docker logs 容器名
# 验证网络功能
docker run --rm alpine ping -c 4 google.com
# 检查存储卷挂载
docker inspect -f '{{ .Mounts }}' 容器名

性能基准测试

# 测试容器启动速度
time docker run --rm alpine echo "test"
# 测试IO性能
docker run --rm -it alpine dd if=/dev/zero of=test bs=64k count=16k conv=fdatasync

7. 升级后的优化建议

成功升级后,可以考虑以下优化措施提升Docker环境的稳定性和性能。

配置调优

// /etc/docker/daemon.json
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  },
  "storage-driver": "overlay2",
  "live-restore": true
}

资源限制

# 限制容器内存使用
docker run -it --memory=512m alpine
# 限制CPU使用
docker run -it --cpus=1 alpine

安全加固

# 启用用户命名空间
echo "dockremap:165536:65536" >> /etc/subuid
echo "dockremap:165536:65536" >> /etc/subgid
# 在daemon.json中添加
"userns-remap": "dockremap"

监控设置

# 安装cAdvisor监控
docker run \
  --volume=/:/rootfs:ro \
  --volume=/var/run:/var/run:ro \
  --volume=/sys:/sys:ro \
  --volume=/var/lib/docker/:/var/lib/docker:ro \
  --volume=/dev/disk/:/dev/disk:ro \
  --publish=8080:8080 \
  --detach=true \
  --name=cadvisor \
  google/cadvisor:latest

在实际生产环境中升级Docker时,建议先在测试环境验证所有步骤,并确保有完整的回滚方案。升级过程中如遇到特殊问题,可以查看Docker日志获取详细信息:

journalctl -u docker.service -n 100 --no-pager

更多推荐