CentOS 系统升级时的 Docker 处理指南
一、升级前的准备与影响
- 明确范围:区分是系统小版本更新(如 7.x → 7.y)还是跨大版本(如 CentOS 7 → 8/9)。跨大版本通常需要全新安装 Docker,旧版二进制与配置不保证兼容。
- 备份关键数据:优先备份**/var/lib/docker**(镜像、容器、卷元数据)、/etc/docker/daemon.json 及业务编排文件(如 docker-compose.yml)。
- 梳理现状:记录当前 Docker/Containerd 版本、存储驱动(如 overlay2)、自定义启动参数与网络配置,便于回滚与比对。
- 选择策略:
- 小版本系统升级:优先采用就地升级 Docker 引擎并验证兼容性;
- 跨大版本系统升级:建议并行部署新系统 + 新 Docker,通过导出/导入镜像或重建容器完成迁移,降低风险。
二、就地升级 Docker 的标准步骤(适用于 CentOS 7 小版本升级)
- 停止服务并清理旧包:
- systemctl stop docker docker.socket containerd
- 卸载旧版(避免冲突):yum remove -y 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 list docker-ce --showduplicates | sort -r
- 安装指定或最新版本:yum install -y docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io docker-compose-plugin
- 启动与自启:
- systemctl daemon-reload
- systemctl start docker && systemctl enable docker
- 验证:
- docker version、docker info、docker run --rm hello-world
说明:上述流程覆盖卸载旧版、添加官方仓库、指定版本安装与启动验证,适合在系统小版本升级时就地升级 Docker。
三、升级后的兼容性处理与常见问题
- 旧容器无法启动(runtime 不兼容):
- 典型报错:Error response from daemon: Unknown runtime specified docker-runc
- 处理(先备份 /var/lib/docker/containers):
- grep -rl ‘docker-runc’ /var/lib/docker/containers/ | xargs sed -i ‘s/docker-runc/runc/g’
- systemctl restart docker
- 原因:新旧版本中 runc 可执行文件命名/路径变化导致配置残留不兼容。
- 服务启动失败排查:
- 使用 systemctl status docker.service 与 journalctl -xe 定位错误;
- 若曾自定义 /etc/systemd/system/docker.service.d/override.conf,必要时重置 ExecStart 并重新加载:
- 在 override.conf 中设置 ExecStart= 与 ExecStart=/usr/bin/dockerd,然后 systemctl daemon-reload && systemctl restart docker。
- 升级后容器不兼容:
- 多数场景下,已存在的容器可正常启动且数据不受影响;若个别镜像/应用因 API/运行时变更异常,优先重建容器并更新镜像版本。
四、跨大版本或紧急场景的可选方案
- 使用官方安装脚本快速部署:
- curl -fsSL https://get.docker.com | sh(适合全新环境快速落地,随后按需配置 daemon.json 与存储驱动)。
- 二进制静态包强制安装(版本可控,适合紧急修复):
- 下载并校验 Docker、Containerd、runc 的官方静态包,解压至 /usr/local/bin,编写 systemd 服务文件(ExecStart 指向 /usr/local/bin/dockerd,配置 containerd 套接字与存储驱动为 overlay2),然后 systemctl daemon-reload && systemctl enable --now docker。
- 注意:此方式需自行维护依赖与升级路径,生产环境务必充分测试。