尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Docker版本升级与数据迁移:零风险运维实战指南

Docker版本升级与数据迁移:零风险运维实战指南 在容器化部署的日常运维中Docker 版本的升级、降级以及整个 Docker 环境的迁移与备份是开发者或运维工程师必须掌握的核心技能。很多朋友在操作时往往因为步骤不清晰、关键配置未备份导致升级失败后无法回退或者迁移后服务异常丢失了辛苦调试的镜像、容器和网络配置。本文将为你梳理一套从理论到实践的完整操作流程涵盖 Docker 引擎的升级与降级、数据目录的迁移、以及关键配置的备份与恢复。只要你按着步骤来就能实现零风险操作确保宝贵的容器化资产不丢失。1. Docker 版本管理、迁移与备份的核心概念在进行任何操作之前理解 Docker 的核心数据构成至关重要。这能帮助你在操作时明确目标知道哪些是必须保护的。Docker 引擎这是 Docker 的核心负责创建和运行容器。它的版本如 20.10.x, 24.0.x决定了其功能和 API 兼容性。升级通常是为了获取新特性、安全补丁和性能改进降级则通常是因为新版本存在兼容性问题或 Bug需要回退到稳定版本。Docker 数据根目录默认情况下Docker 将所有运行时数据镜像、容器、卷、网络配置、构建缓存等存储在/var/lib/dockerLinux或C:\ProgramData\DockerWindows下。这是 Docker 的“状态”所在是迁移和备份的主要对象。Docker 服务配置文件在 Linux 系统上Docker 守护进程dockerd的配置通常位于/etc/docker/daemon.json。这个文件定义了镜像仓库地址、日志驱动、存储驱动、数据根目录等关键运行时参数。备份此文件可以快速恢复服务配置。容器与镜像镜像是只读的模板容器是镜像的运行实例。迁移时我们既可以直接迁移原始的镜像文件/var/lib/docker/image和容器层数据也可以更优雅地通过docker save/docker load或docker commit/docker export来处理。卷Docker 卷是持久化容器数据的最佳实践。卷的数据独立于容器的生命周期通常存储在宿主机的特定路径下例如/var/lib/docker/volumes/。迁移卷数据是保证应用数据不丢失的关键。理解了这些概念我们就知道整个操作的核心是安全地变更 Docker 引擎二进制文件并完整地保护/var/lib/docker和/etc/docker/daemon.json中的数据与配置。2. 环境准备与操作前检查在开始任何升级、降级或迁移操作前充分的准备工作是“零风险”的基石。请务必在测试环境先行验证整个流程。2.1 系统环境与当前状态确认首先登录你的服务器确认当前 Docker 和环境的状态。检查当前 Docker 版本和详细信息# 查看 Docker 客户端和服务端版本 docker version # 查看更详细的系统信息包括存储驱动、根目录等 docker info记录下Server Version如24.0.7和Docker Root Dir如/var/lib/docker。docker info的输出信息在排查迁移后问题时非常有用。确认操作系统版本# 对于 CentOS/RHEL cat /etc/redhat-release # 对于 Ubuntu/Debian lsb_release -aDocker 不同版本对操作系统内核有最低要求确保目标版本与系统兼容。检查磁盘空间# 查看当前 Docker 数据目录占用空间 sudo du -sh /var/lib/docker/ # 查看系统磁盘空间 df -h迁移和备份需要额外的磁盘空间确保有足够的空间建议至少是当前/var/lib/docker大小的 2 倍。2.2 制定回滚计划与备份这是保证“零风险”最关键的一步。假设任何操作都可能失败我们必须有退路。备份 Docker 数据目录 这是最彻底的备份方式。在 Docker 服务停止后直接打包整个数据目录。# 1. 停止 Docker 服务 sudo systemctl stop docker # 也可以停止 containerd如果独立运行 sudo systemctl stop containerd # 2. 创建备份使用 tar 压缩节省空间 sudo tar -czvf /opt/docker_backup_$(date %Y%m%d).tar.gz -C /var/lib docker # 3. 备份 Docker 服务配置文件 sudo cp /etc/docker/daemon.json /etc/docker/daemon.json.backup_$(date %Y%m%d) 2/dev/null || echo daemon.json not exist, skip.重要备份文件不要放在/var/lib/docker目录下最好放到另一个磁盘或远程存储。备份关键容器与镜像 除了全量备份对于最重要的容器和镜像可以单独备份作为快速恢复的手段。# 备份单个镜像为文件 docker save -o /opt/backup/my_app_image.tar my_app:latest # 备份所有镜像列表 docker images --format {{.Repository}}:{{.Tag}} /opt/backup/docker_images_list.txt # 对于正在运行的重要容器可以先提交为镜像再备份 docker commit my_running_container my_container_backup:snapshot docker save -o /opt/backup/my_container_backup.tar my_container_backup:snapshot记录当前运行容器和卷# 查看所有运行中的容器 docker ps # 查看所有容器包括停止的 docker ps -a # 查看所有卷 docker volume ls # 记录容器的启动命令非常重要 docker inspect --format{{.Name}} {{.Config.Cmd}} {{.Config.Entrypoint}} $(docker ps -aq) /opt/backup/container_commands.txt完成以上备份和记录后你就拥有了一个完整的恢复快照。现在我们可以根据目标开始操作。3. Docker 引擎升级与降级实战升级和降级的本质是替换 Docker 引擎的二进制文件包。不同 Linux 发行版的包管理工具不同下面以最常见的Ubuntu/Debian和CentOS/RHEL为例。3.1 在 Ubuntu/Debian 上升级/降级 Docker添加 Docker 官方 Apt 仓库如果尚未添加# 安装依赖工具 sudo apt-get update sudo apt-get install -y ca-certificates curl gnupg # 添加 Docker 官方 GPG 密钥 sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod ar /etc/apt/keyrings/docker.gpg # 添加仓库 echo \ deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(. /etc/os-release echo $VERSION_CODENAME) stable | \ sudo tee /etc/apt/sources.list.d/docker.list /dev/null sudo apt-get update查看可用的 Docker 版本# 列出所有可用的版本 apt-cache madison docker-ce | awk {print $3} # 列出可用的 CLI 版本 apt-cache madison docker-ce-cli | awk {print $3} # 列出可用的 containerd 版本 apt-cache madison containerd.io | awk {print $3}你会看到类似5:24.0.7-1~ubuntu.22.04~jammy,5:20.10.24-1~ubuntu.22.04~jammy的列表。安装指定版本 假设你要安装20.10.24版本降级或24.0.7版本升级。# 格式sudo apt-get install docker-ceVERSION_STRING docker-ce-cliVERSION_STRING containerd.io # 示例安装 20.10.24 sudo apt-get install -y docker-ce5:20.10.24-1~ubuntu.22.04~jammy \ docker-ce-cli5:20.10.24-1~ubuntu.22.04~jammy \ containerd.io # 示例安装 24.0.7 sudo apt-get install -y docker-ce5:24.0.7-1~ubuntu.22.04~jammy \ docker-ce-cli5:24.0.7-1~ubuntu.22.04~jammy \ containerd.io关键点docker-ce,docker-ce-cli,containerd.io三个包的版本最好保持一致或兼容否则可能启动失败。验证安装sudo systemctl start docker sudo systemctl enable docker docker version确认Server Version已变为你安装的版本。3.2 在 CentOS/RHEL 上升级/降级 Docker添加 Docker 官方 Yum 仓库sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo查看可用的 Docker 版本yum list docker-ce --showduplicates | sort -r yum list docker-ce-cli --showduplicates | sort -r输出格式如docker-ce-3:24.0.7-1.el7,docker-ce-3:20.10.24-1.el7。安装指定版本# 格式sudo yum install docker-ce-VERSION_STRING docker-ce-cli-VERSION_STRING containerd.io # 示例安装 20.10.24 sudo yum install -y docker-ce-20.10.24 docker-ce-cli-20.10.24 containerd.io # 示例安装 24.0.7 sudo yum install -y docker-ce-24.0.7 docker-ce-cli-24.0.7 containerd.io如果提示依赖冲突可以尝试先卸载当前版本再安装但务必确保你已经完成了第 2 步的数据备份。sudo yum remove docker-ce docker-ce-cli containerd.io # 然后再执行上面的 install 命令启动并验证sudo systemctl start docker sudo systemctl enable docker docker version3.3 版本切换后的注意事项存储驱动兼容性高版本 Docker 可能默认使用overlay2而低版本可能使用devicemapper。如果启动失败检查/etc/docker/daemon.json中的storage-driver配置或查看docker info输出确保与数据目录兼容。在极端情况下可能需要清理数据目录/var/lib/docker并重新拉取镜像这就是备份如此重要的原因。API 兼容性某些 Docker CLI 命令或 API 在版本间可能有变化。如果你有使用 Docker API 的脚本或工具如 CI/CD 流水线升级后需进行测试。重启容器Docker 服务重启后需要重新启动之前运行的容器。你可以使用脚本或docker start命令。4. Docker 数据目录迁移实战迁移通常发生在磁盘空间不足、更换硬盘或优化 I/O 性能时。核心步骤是停止服务 - 复制数据 - 修改配置 - 重启服务。4.1 迁移到新目录例如/data/docker假设我们要将 Docker 数据从默认的/var/lib/docker迁移到新的、空间更大的/data/docker目录。停止 Docker 服务sudo systemctl stop docker sudo systemctl stop containerd复制数据使用rsync保留权限和属性比cp更安全# 创建目标目录 sudo mkdir -p /data/docker # 使用 rsync 同步数据 sudo rsync -avxP /var/lib/docker/ /data/docker/-a归档模式保留所有属性-v详细输出-x不跨越文件系统边界-P显示进度。备份原目录可选但推荐sudo mv /var/lib/docker /var/lib/docker.old修改 Docker 配置指向新目录 编辑/etc/docker/daemon.json文件如果不存在则创建。{ data-root: /data/docker }如果文件已有其他配置只需添加或修改data-root这一项。重启 Docker 服务sudo systemctl start docker验证迁移docker info | grep Docker Root Dir应该显示Docker Root Dir: /data/docker。运行docker images和docker ps -a确认镜像和容器列表与迁移前一致。清理旧数据确认新目录运行完全正常后sudo rm -rf /var/lib/docker.old4.2 迁移到新的物理机或虚拟机这种跨主机迁移更推荐使用镜像仓库和声明式配置但直接复制数据目录在某些离线或特定环境下也是可行的。源主机操作按照2.2 节的方法停止 Docker 并备份整个/var/lib/docker目录。将备份的压缩包如docker_backup.tar.gz和/etc/docker/daemon.json拷贝到目标主机使用scp,rsync等工具。目标主机操作安装相同或兼容版本的 Docker参考第 3 节。停止目标主机 Docker 服务。解压备份文件到目标目录默认/var/lib/docker或自定义的>sudo tar -xzvf docker_backup.tar.gz -C /var/lib/ # 如果解压后是 docker 文件夹它应该位于 /var/lib/docker将源主机的daemon.json配置文件复制到/etc/docker/下并根据目标主机环境调整如镜像仓库地址。启动 Docker 服务并验证。注意跨主机迁移时需要特别注意网络配置如自定义网桥、存储驱动、以及主机名、IP等可能硬编码在容器配置中的信息。最稳健的方式还是通过docker-compose.yml或 Kubernetes 清单文件来定义服务然后在新主机上重新部署。5. Docker 配置与状态备份恢复策略除了全量数据目录备份我们还需要更精细、更频繁的备份策略。5.1 镜像备份与恢复 (docker save/docker load)这是最常用的镜像迁移方法生成的是一个 tar 归档文件。备份镜像# 备份单个镜像 docker save -o /path/to/backup/my_image.tar my_image:tag # 备份多个镜像到一个文件 docker save -o /path/to/backup/all_images.tar image1:tag1 image2:tag2恢复镜像docker load -i /path/to/backup/my_image.tar加载后使用docker images查看镜像名和标签会保留。5.2 容器备份与恢复容器是运行态备份方式有多种docker commitdocker save将容器当前状态保存为镜像再备份镜像。# 将运行中的容器提交为新镜像 docker commit my_container my_container_backup:snapshot # 备份该镜像 docker save -o my_container_backup.tar my_container_backup:snapshot # 恢复时先 load 镜像再 run 容器 docker load -i my_container_backup.tar docker run -d --name my_container_restored my_container_backup:snapshot这种方式会保存容器的文件系统变化但不包含容器的网络、卷、端口映射等运行时配置。docker exportdocker import导出容器的文件系统快照。# 导出容器文件系统 docker export my_container my_container_fs.tar # 导入为镜像 cat my_container_fs.tar | docker import - my_imported_image:tag这种方式得到的镜像丢失了所有历史记录和元数据不推荐作为主要备份手段。最佳实践对于需要持久化运行的容器应使用Dockerfile和docker-compose.yml来定义其构建和运行方式。备份这些配置文件结合数据卷才是真正的“基础设施即代码”恢复时只需docker-compose up -d。5.3 卷数据备份卷是持久化数据的核心其数据在宿主机目录中如/var/lib/docker/volumes/volume_name/_data。直接备份卷目录# 找到卷的实际路径 docker volume inspect my_volume | grep Mountpoint # 假设路径是 /var/lib/docker/volumes/my_volume/_data sudo tar -czvf my_volume_backup.tar.gz -C /var/lib/docker/volumes/my_volume/_data .在容器内备份对于数据库等应用最好在容器内使用原生工具备份如mysqldump,pg_dump这样备份出的数据更干净、可移植。# 示例备份 MySQL 容器内的数据库 docker exec my_mysql_container sh -c exec mysqldump --all-databases -uroot -p$MYSQL_ROOT_PASSWORD all_databases_backup.sql5.4 使用脚本自动化定期备份可以编写一个 Shell 脚本定期执行全量或增量备份。#!/bin/bash # backup_docker.sh BACKUP_DIR/opt/docker_backups DATE$(date %Y%m%d_%H%M%S) echo [$DATE] Starting Docker backup... # 1. 停止 Docker生产环境慎用可能导致服务中断。可以考虑只备份停止的容器或使用 --volumes-from 在运行中备份 # sudo systemctl stop docker # 2. 备份数据目录 sudo tar -czvf $BACKUP_DIR/docker_data_$DATE.tar.gz -C /var/lib docker # 3. 备份配置文件 sudo cp /etc/docker/daemon.json $BACKUP_DIR/daemon.json_$DATE 2/dev/null || true # 4. 备份镜像列表 docker images --format {{.Repository}}:{{.Tag}} $BACKUP_DIR/images_list_$DATE.txt # 5. 备份所有运行中容器的启动命令 docker ps --format table {{.Names}}\t{{.Command}} $BACKUP_DIR/running_containers_$DATE.txt # 6. 启动 Docker如果停止了 # sudo systemctl start docker echo [$DATE] Backup completed to $BACKUP_DIR # 7. 清理旧备份保留最近7天 find $BACKUP_DIR -name *.tar.gz -mtime 7 -delete find $BACKUP_DIR -name *.txt -mtime 7 -delete find $BACKUP_DIR -name daemon.json_* -mtime 7 -delete echo [$DATE] Old backups cleanup done.将此脚本加入crontab即可实现定期备份。注意脚本中停止 Docker 的操作会影响服务生产环境需要设计更优雅的方案如在业务低峰期进行或采用存储级快照。6. 常见问题与排查思路在升级、降级、迁移过程中你可能会遇到以下问题。问题现象可能原因排查与解决思路docker version显示客户端和服务端版本不一致只升级了docker-ce-cli包未升级docker-ce包。使用apt-get install或yum install同时安装docker-ce和docker-ce-cli的相同版本。Failed to start docker.service: Unit not found.Docker 安装不完整或服务文件丢失。重新安装 Docker 包。对于 Ubuntu可尝试sudo apt-get install --reinstall docker-ce。Error response from daemon: ... permission deniedDocker 守护进程启动失败或用户无docker组权限。1. 检查 Docker 服务状态sudo systemctl status docker查看日志sudo journalctl -u docker。2. 将用户加入 docker 组sudo usermod -aG docker $USER并重新登录。迁移后docker ps看不到之前的容器数据目录 (>1. 确认 docker info升级后容器无法启动报存储驱动错误新旧版本存储驱动不兼容。1. 检查/etc/docker/daemon.json中的storage-driver。2. 查看docker info确认当前驱动。3.严重情况如果数据损坏可能需要从备份恢复/var/lib/docker或清理后重新拉取镜像。docker load镜像后REPOSITORY和TAG为none备份的 tar 文件中镜像元数据可能不完整。使用docker load时可以用docker tag手动为镜像打标签docker tag image_id new_name:tag。更好的方式是使用docker save时指定镜像名:tag。磁盘空间不足无法备份或迁移/var/lib/docker过大可能包含无用缓存。1. 清理无用资源docker system prune -a谨慎会删除所有停止的容器、未使用的镜像、网络和构建缓存。2. 只备份必要镜像和卷数据而非整个目录。7. 最佳实践与工程建议遵循以下原则可以让你的 Docker 运维工作更加稳健。版本控制与基础设施即代码将Dockerfile和docker-compose.yml纳入 Git 版本控制。避免在容器内手动修改配置所有配置应通过环境变量、配置文件挂载或构建过程注入。这样恢复服务只需重新构建和运行不依赖不确定的容器快照。分层备份策略黄金镜像将经过测试的基础镜像和应用镜像推送到私有镜像仓库如 Harbor, Nexus。数据卷定期对卷数据进行备份数据库类应用使用其原生工具导出逻辑备份。编排配置备份 Kubernetes YAML 或 Docker Compose 文件。全量快照在重大变更前对虚拟机或物理机做一次全量快照或文件系统级备份。变更管理先在测试环境验证任何 Docker 版本升级或配置变更先在测试环境完整走一遍流程。制定回滚计划明确每一步失败后的回滚步骤并准备好备份。窗口期操作在生产环境操作选择业务低峰期并通知相关方。监控与告警升级或迁移后密切监控容器运行状态、资源使用率和应用日志。为 Docker 守护进程设置监控确保其健康运行。安全考量定期更新 Docker 引擎以修复安全漏洞。使用非 root 用户运行 Docker 守护进程rootless mode以增强安全性。备份文件应妥善保管设置适当的访问权限避免敏感数据泄露。通过将上述流程和原则融入你的运维体系Docker 的升级、降级、迁移和备份将从一个令人焦虑的任务转变为一项可预测、可重复、零风险的常规操作。记住备份是最后的防线在任何可能改变系统状态的操作前花几分钟执行备份能为你节省数小时的故障排查甚至数据恢复时间。
返回列表