
1. 为什么需要升级到Docker-CE很多使用CentOS系统的开发者可能都遇到过这样的场景当你兴冲冲地想要拉取一个最新镜像时终端却突然报错missing signature key。这种情况往往是因为你正在使用CentOS自带的旧版Docker它已经停止维护无法兼容最新的镜像签名机制。我去年在部署一个微服务项目时就踩过这个坑当时花了大半天时间才找到问题根源。Docker-CECommunity Edition作为官方维护的社区版本不仅修复了旧版的安全漏洞还提供了更多实用功能。比如更高效的构建缓存机制、改进的容器网络性能以及对最新Linux内核特性的支持。最重要的是它能完美兼容Docker Hub上的所有最新镜像。不过很多开发者担心升级会导致现有容器和镜像数据丢失这确实是个合理的顾虑——毕竟谁都不想重做那些精心配置的容器环境。2. 升级前的准备工作2.1 检查当前Docker环境在开始升级前建议先用以下命令查看当前Docker版本和运行状态docker version systemctl status docker记录下正在运行的容器列表也很重要docker ps -a我习惯把这些信息保存到文本文件作为备份docker version docker_info.txt docker ps -a docker_info.txt2.2 完整备份策略虽然后续步骤会保留数据但多一层保护总没错。除了备份/var/lib/docker目录外我推荐额外导出关键容器的配置# 备份容器为镜像 docker commit container_id backup_container_name # 导出镜像为文件 docker save -o /backup/container_backup.tar backup_container_name对于使用docker-compose的项目记得备份yml文件。有次我升级后就发现有个容器的环境变量配置没记清楚幸亏提前备份了compose文件。3. 分步升级指南3.1 安全停止服务首先优雅地停止Docker服务systemctl stop docker这里有个小技巧可以先执行docker pause $(docker ps -q)暂停所有容器再执行stop命令。这样能确保所有写入操作都已完成避免数据损坏。3.2 数据目录迁移重命名docker数据目录是关键步骤mv /var/lib/docker /var/lib/docker-bak如果你使用自定义数据目录通过graph配置项指定记得替换对应路径。我曾经帮一个客户升级时就是因为没注意到自定义路径导致后续步骤出错。3.3 彻底卸载旧版本执行以下命令确保完全卸载yum -y remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine注意不要使用yum remove docker*这种通配符方式可能会误删其他软件包。4. 安装Docker-CE4.1 设置仓库先安装必要工具yum install -y yum-utils然后添加官方仓库yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo4.2 选择合适版本虽然可以直接安装最新版但生产环境我建议指定稳定版本yum install -y docker-ce-24.0.2 docker-ce-cli-24.0.2 containerd.io可以通过以下命令查看可用版本yum list docker-ce --showduplicates | sort -r5. 数据恢复与验证5.1 恢复数据目录安装完成后系统会自动创建新的/var/lib/docker目录。我们需要rm -rf /var/lib/docker mv /var/lib/docker-bak /var/lib/docker重要提示此时千万不要启动Docker服务5.2 处理兼容性问题新版Docker可能不兼容旧配置需要修改runtime设置grep -rl docker-runc /var/lib/docker/containers/ | xargs sed -i s/docker-runc/runc/g这个命令会批量替换容器配置中的runtime参数。我在升级到Docker 20.10时就遇到过这个问题导致所有容器无法启动。6. 启动与测试6.1 启动服务现在可以安全启动服务了systemctl start docker建议设置开机自启systemctl enable docker6.2 验证数据完整性检查容器和镜像是否完好docker images docker ps -a我通常会运行几个简单的测试命令docker run hello-world docker exec existing_container echo test7. 常见问题排查7.1 容器启动失败如果容器启动时报错可以尝试docker inspect container_id | grep -i error常见问题包括存储驱动变更aufs改为overlay2或网络配置冲突。7.2 权限问题升级后可能会遇到权限错误chmod -R 755 /var/lib/docker systemctl restart docker7.3 网络异常如果容器网络不通尝试重置网络配置systemctl stop docker rm -rf /var/lib/docker/network systemctl start docker8. 升级后的优化建议8.1 配置调优编辑/etc/docker/daemon.json添加性能优化参数{ log-driver: json-file, log-opts: { max-size: 10m, max-file: 3 }, storage-driver: overlay2 }8.2 安全加固建议启用用户命名空间隔离echo dockremap:165536:65536 /etc/subuid echo dockremap:165536:65536 /etc/subgid然后在daemon.json中添加{ userns-remap: dockremap }9. 回滚方案虽然升级过程很安全但准备好回滚方案总是明智的。最简单的办法就是保留之前备份的/var/lib/docker-bak目录。如果新版本出现问题可以systemctl stop docker rm -rf /var/lib/docker mv /var/lib/docker-bak /var/lib/docker yum downgrade docker-ce-old_version systemctl start docker记得回滚后要重新执行runtime的替换操作。