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目录所在分区) - 建议在系统负载较低的时间段执行升级(如凌晨)
- 确保有至少2GB的可用磁盘空间(特别是
备份策略:
# 备份重要容器配置 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 docker2.2 备份Docker数据目录
Docker的所有数据(包括镜像、容器和卷)都存储在/var/lib/docker目录中。我们通过重命名而非删除来保留这些数据:
mv /var/lib/docker /var/lib/docker-bak2.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-engine2.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.el72.5 恢复数据目录
安装完成后,系统会自动创建新的/var/lib/docker目录,我们需要用备份替换它:
# 删除新创建的目录 rm -rf /var/lib/docker # 恢复备份数据 mv /var/lib/docker-bak /var/lib/docker3. 解决常见升级问题
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 docker3.2 容器网络异常处理
升级后部分容器可能出现网络连接问题,可尝试:
# 重建Docker的iptables规则 systemctl stop docker iptables -t nat -F systemctl start docker3.3 存储驱动兼容性问题
如果使用devicemapper存储驱动,可能需要迁移到overlay2:
# 修改daemon.json cat > /etc/docker/daemon.json <<EOF { "storage-driver": "overlay2" } EOF # 重启服务 systemctl restart docker4. 升级后的验证与优化
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 -p4.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 } EOF5. 回滚方案设计
尽管我们力求升级过程平滑,但仍需准备回滚预案:
- 快速回滚脚本:
#!/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回滚验证清单:
- 确认所有容器状态与升级前一致
- 检查数据卷完整性
- 验证网络连接和端口映射
回滚后的清理:
# 清除Docker-CE残留配置 rm -f /etc/yum.repos.d/docker-ce.repo yum clean all