CentOS 7下Docker无损升级实战:从旧版到Docker-CE 18.06.3的完整方案

在CentOS 7的生产环境中,系统自带的Docker版本往往过于陈旧,不仅功能受限,还可能遇到各种兼容性问题。最近一位同事在拉取镜像时遭遇了 missing signature key 错误,这正是我们需要升级Docker的典型信号。本文将分享一套经过实战检验的无损升级方案,确保您的容器服务不中断,所有镜像和数据完好无损。

1. 升级前的关键准备

升级Docker看似简单,但稍有不慎就可能导致容器服务中断或数据丢失。在开始之前,我们需要做好以下准备工作:

  • 系统环境检查

    cat /etc/redhat-release  # 确认是CentOS 7
    uname -r                # 检查内核版本(建议3.10以上)
    docker version          # 记录当前Docker版本
    
  • 资源评估

    • 确保有至少2GB的可用磁盘空间(特别是 /var/lib/docker 目录所在分区)
    • 建议在系统负载较低的时间段执行升级(如凌晨)
  • 备份策略

    # 备份重要容器配置
    docker ps -a > /opt/docker_backup/containers_list.txt
    docker images > /opt/docker_backup/images_list.txt
    
    # 备份容器数据卷(如果有)
    tar -czvf /opt/docker_backup/volumes.tar.gz /var/lib/docker/volumes/
    

提示:即使采用无损升级方案,也强烈建议在执行前创建完整的系统快照,特别是对运行关键业务的服务器。

2. 分步升级操作指南

2.1 安全停止Docker服务

首先需要优雅地停止所有容器和Docker服务:

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

# 停止Docker服务
systemctl stop docker

2.2 备份Docker数据目录

Docker的所有数据(包括镜像、容器和卷)都存储在 /var/lib/docker 目录中。我们通过重命名而非删除来保留这些数据:

mv /var/lib/docker /var/lib/docker-bak

2.3 彻底移除旧版Docker

CentOS 7默认安装的是 docker 而非 docker-ce ,需要完全卸载:

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

2.4 安装指定版本的Docker-CE

我们将安装经过验证的稳定版本18.06.3:

# 添加Docker官方仓库
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 安装指定版本
yum install -y docker-ce-18.06.3.ce-3.el7

2.5 恢复数据目录

安装完成后,系统会自动创建新的 /var/lib/docker 目录,我们需要用备份替换它:

# 删除新创建的目录
rm -rf /var/lib/docker

# 恢复备份数据
mv /var/lib/docker-bak /var/lib/docker

3. 解决常见升级问题

3.1 "docker-runc"运行时错误

启动服务后可能会遇到如下错误:

Error response from daemon: Unknown runtime specified docker-runc

这是因为新旧版本对运行时名称的变更导致的,修复方法:

# 批量替换容器配置中的运行时名称
grep -rl 'docker-runc' /var/lib/docker/containers/ | xargs sed -i 's/docker-runc/runc/g'

# 重启Docker服务
systemctl restart docker

3.2 容器网络异常处理

升级后部分容器可能出现网络连接问题,可尝试:

# 重建Docker的iptables规则
systemctl stop docker
iptables -t nat -F
systemctl start docker

3.3 存储驱动兼容性问题

如果使用devicemapper存储驱动,可能需要迁移到overlay2:

# 修改daemon.json
cat > /etc/docker/daemon.json <<EOF
{
  "storage-driver": "overlay2"
}
EOF

# 重启服务
systemctl restart docker

4. 升级后的验证与优化

4.1 基础功能验证

# 检查Docker版本
docker version

# 测试镜像拉取
docker pull alpine

# 验证容器运行
docker run --rm alpine echo "升级成功"

4.2 性能调优建议

升级后可以调整一些参数以获得更好性能:

# 编辑系统配置文件
cat >> /etc/sysctl.conf <<EOF
# Docker性能优化
net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
vm.swappiness=0
EOF

# 应用配置
sysctl -p

4.3 监控与维护

建议设置定期维护任务:

# 每周自动清理无用镜像
(crontab -l 2>/dev/null; echo "0 3 * * 0 docker image prune -af") | crontab -

# 日志轮转配置
cat > /etc/logrotate.d/docker <<EOF
/var/lib/docker/containers/*/*.log {
  rotate 7
  daily
  compress
  missingok
  delaycompress
  copytruncate
}
EOF

5. 回滚方案设计

尽管我们力求升级过程平滑,但仍需准备回滚预案:

  1. 快速回滚脚本
#!/bin/bash
systemctl stop docker
rm -rf /var/lib/docker
mv /var/lib/docker-bak /var/lib/docker
yum -y remove docker-ce
yum -y install docker-$(rpm -q --queryformat '%{VERSION}' docker-ce)
systemctl start docker
  1. 回滚验证清单

    • 确认所有容器状态与升级前一致
    • 检查数据卷完整性
    • 验证网络连接和端口映射
  2. 回滚后的清理

# 清除Docker-CE残留配置
rm -f /etc/yum.repos.d/docker-ce.repo
yum clean all

更多推荐