docker迁移SOP
发布时间:2026/10/14 7:05:10 锦皓数字建站

整体流程目录一、先确认当前环境二、先解决数据盘开机挂载三、创建新的 Docker 数据目录四、确认 rsync五、记录当前运行中的容器六、停止业务容器七、停止 Docker 和 containerd八、复制 Docker 数据九、配置 containerd 新目录十、配置 Docker 新目录十一、增加 systemd 数据盘依赖十二、先启动 containerd十三、启动 Docker十四、确认原来的资源还在十五、恢复迁移前运行的容器十六、确认新数据盘正在使用十七、重启机器验证十八、确认无误后删除旧数据1. 查数据盘 UUID ↓2. 写 /etc/fstab ↓3.mount-a验证 ↓4. 创建 /mnt/data/docker、containerd ↓5. 记录正在运行的容器 ↓6.dockerstop ↓7. 停 Docker containerd ↓8.rsync两个目录 ↓9. containerd root → /mnt/data/containerd ↓10. Docker>11. systemdRequiresMountsFor/mnt/data ↓12. 启动 containerd 并验证 ↓13. 启动 Docker 并验证 ↓14. 恢复容器 ↓15.reboot↓16. 再次验证 ↓17. 删除 /var/lib/docker、/var/lib/containerd一、先确认当前环境先看磁盘df-hfindmnt /mnt/data 确认 Docker 当前目录dockerinfo|grep-EDocker Root Dir|Storage Driver|driver-type查看 Docker/containerd 占用du-sh/var/lib/dockerdu-sh/var/lib/containerd2/dev/null 检查 containerd containerd--versioncontainerd config dump|grep-E^version|^root|^state我们这台迁移前类似 Docker Root Dir: /var/lib/docker containerd: version3root/var/lib/containerdstate/run/containerd二、先解决数据盘开机挂载这是必须先做的。 查看数据盘 UUID blkid /dev/vdb1 例如 /dev/vdb1:UUID7c9076b0-44d8-4744-8100-c7ebda4f818cTYPEext4先备份cp-a/etc/fstab /etc/fstab.bak.$(date%F-%H%M%S)编辑vim/etc/fstab 增加UUID你的UUID /mnt/data ext4 defaults02例如UUID7c9076b0-44d8-4744-8100-c7ebda4f818c /mnt/data ext4 defaults02验证mount-a没有报错后 findmnt /mnt/data 应该类似 TARGET SOURCE FSTYPE OPTIONS /mnt/data /dev/vdb1 ext4 rw,relatime三、创建新的 Docker 数据目录mkdir-p/mnt/data/dockermkdir-p/mnt/data/containerd 检查ls-ld/mnt/data/docker /mnt/data/containerd四、确认 rsyncrsync--version|head-1如果没有aptupdateaptinstall-yrsync五、记录当前运行中的容器这个很重要后面用于恢复。dockerps-q/root/docker-running-before-migration.txt 建议顺便备份一些状态dockerps-a/root/docker-ps-before-migration.txtdockerimages/root/docker-images-before-migration.txtdockervolumels/root/docker-volumes-before-migration.txt六、停止业务容器这一步开始会有业务中断。dockerstop-t30$(dockerps-q)确认dockerps应该为空。七、停止 Docker 和 containerd依次 systemctl stop docker.service systemctl stop docker.socket systemctl stop containerd.service 确认 systemctl is-activedockersystemctl is-active containerd 正常应该 inactive inactive八、复制 Docker 数据迁 /var/lib/dockerrsync-aHAXx--numeric-ids--infoprogress2\/var/lib/docker/\/mnt/data/docker/ 迁 containerdrsync-aHAXx--numeric-ids--infoprogress2\/var/lib/containerd/\/mnt/data/containerd/ 复制完成后检查du-sh/var/lib/docker /mnt/data/dockerdu-sh/var/lib/containerd /mnt/data/containerd 源目录和目标目录大小应该基本一致。 注意这里 /var/lib/docker/ 最后这个 / 不要漏。九、配置 containerd 新目录先确认另一台机器的 config version containerd config dump|grep^version如果跟这台一样 version3就创建mkdir-p/etc/containerd 然后cat/etc/containerd/config.tomlEOF version 3 root /mnt/data/containerd state /run/containerd EOF确认cat/etc/containerd/config.toml 应该是 version3root/mnt/data/containerdstate/run/containerd注意 root → /mnt/data/containerd state → /run/containerd 只迁 root。 不要把 state 迁到数据盘。十、配置 Docker 新目录如果cat/etc/docker/daemon.json 不存在可以直接mkdir-p/etc/docker 然后cat/etc/docker/daemon.jsonEOF { data-root: /mnt/data/docker } EOF检查 python3-mjson.tool /etc/docker/daemon.json 如果另一台已经有 daemon.json不要直接覆盖。 例如原来{registry-mirrors:[xxx]}应该改成{data-root:/mnt/data/docker,registry-mirrors:[xxx]}十一、增加 systemd 数据盘依赖这是为了防止 机器启动 ↓ /mnt/data 没挂载 ↓ Docker 先启动 ↓ Docker 又往系统盘写 containerdmkdir-p/etc/systemd/system/containerd.service.dcat/etc/systemd/system/containerd.service.d/data-mount.confEOF [Unit] RequiresMountsFor/mnt/data EOFDockermkdir-p/etc/systemd/system/docker.service.dcat/etc/systemd/system/docker.service.d/data-mount.confEOF [Unit] RequiresMountsFor/mnt/data EOF加载 systemctl daemon-reload十二、先启动 containerdsystemctl start containerd 检查 systemctl status containerd --no-pager 必须 Active: active(running)然后 containerd config dump|grep-E^version|^root|^state必须变成 version3root/mnt/data/containerdstate/run/containerd如果这里还是 /var/lib/containerd 就先不要启动 Docker。十三、启动 Dockercontainerd 正常后 systemctl startdocker检查 systemctl statusdocker--no-pager 再dockerinfo|grep-EDocker Root Dir|Storage Driver|driver-type必须看到 Storage Driver: overlayfs driver-type: io.containerd.snapshotter.v1 Docker Root Dir: /mnt/data/docker十四、确认原来的资源还在dockerps-adockerimagesdockervolumelsdockersystemdf确认 - 容器数量没少 - 镜像还在 - Volume 还在十五、恢复迁移前运行的容器直接xargs-rdockerstart/root/docker-running-before-migration.txt 检查dockerps--formattable {{.Names}}\t{{.Status}}\t{{.Ports}}十六、确认新数据盘正在使用df-h/ /mnt/data 再du-sh/mnt/data/dockerdu-sh/mnt/data/containerd 确认dockerinfo|grepDocker Root Dir结果 Docker Root Dir: /mnt/data/docker 以及 containerd config dump|grep^root结果 root/mnt/data/containerd十七、重启机器验证这一步强烈建议做。reboot机器回来后 findmnt /mnt/data 确认 /mnt/data /dev/vdb1 ext4... 然后 containerd config dump|grep-E^version|^root|^state确认 root/mnt/data/containerdDockerdockerinfo|grep-EDocker Root Dir|Storage Driver|driver-type确认 Docker Root Dir: /mnt/data/docker 然后dockerps--formattable {{.Names}}\t{{.Status}}再看磁盘df-h/ /mnt/data十八、确认无误后删除旧数据只有完成重启验证之后再做。 先du-sh/var/lib/dockerdu-sh/var/lib/containerd 再次确认dockerinfo|grepDocker Root Dircontainerd config dump|grep^root分别必须是 /mnt/data/docker /mnt/data/containerd 然后rm-rf/var/lib/dockerrm-rf/var/lib/containerd 再df-h/ 这样系统盘空间就会释放出来。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。