docker迁移SOP

整体流程

目录

bash 复制代码
1. 查数据盘 UUID
   ↓
2. 写 /etc/fstab
   ↓
3. mount -a 验证
   ↓
4. 创建 /mnt/data/docker、containerd
   ↓
5. 记录正在运行的容器
   ↓
6. docker stop
   ↓
7. 停 Docker + containerd
   ↓
8. rsync 两个目录
   ↓
9. containerd root → /mnt/data/containerd
   ↓
10. Docker data-root → /mnt/data/docker
   ↓
11. systemd RequiresMountsFor=/mnt/data
   ↓
12. 启动 containerd 并验证
   ↓
13. 启动 Docker 并验证
   ↓
14. 恢复容器
   ↓
15. reboot
   ↓
16. 再次验证
   ↓
17. 删除 /var/lib/docker、/var/lib/containerd

一、先确认当前环境

bash 复制代码
先看磁盘:
df -h
findmnt /mnt/data

确认 Docker 当前目录:
docker info | grep -E 'Docker Root Dir|Storage Driver|driver-type'

查看 Docker/containerd 占用:
du -sh /var/lib/docker
du -sh /var/lib/containerd 2>/dev/null

检查 containerd:
containerd --version
containerd config dump | grep -E '^version|^root|^state'

我们这台迁移前类似:
Docker Root Dir: /var/lib/docker

containerd:
version = 3
root = '/var/lib/containerd'
state = '/run/containerd'

二、先解决数据盘开机挂载

bash 复制代码
这是必须先做的。
查看数据盘 UUID:
blkid /dev/vdb1

例如:
/dev/vdb1: UUID="7c9076b0-44d8-4744-8100-c7ebda4f818c" TYPE="ext4"

先备份:
cp -a /etc/fstab /etc/fstab.bak.$(date +%F-%H%M%S)

编辑:
vim /etc/fstab

增加:
UUID=你的UUID /mnt/data ext4 defaults 0 2

例如:
UUID=7c9076b0-44d8-4744-8100-c7ebda4f818c /mnt/data ext4 defaults 0 2

验证:
mount -a

没有报错后:
findmnt /mnt/data

应该类似:
TARGET    SOURCE    FSTYPE OPTIONS
/mnt/data /dev/vdb1 ext4   rw,relatime

三、创建新的 Docker 数据目录

bash 复制代码
mkdir -p /mnt/data/docker
mkdir -p /mnt/data/containerd

检查:
ls -ld /mnt/data/docker /mnt/data/containerd

四、确认 rsync

bash 复制代码
rsync --version | head -1

如果没有:
apt update
apt install -y rsync

五、记录当前运行中的容器

bash 复制代码
这个很重要,后面用于恢复。
docker ps -q > /root/docker-running-before-migration.txt

建议顺便备份一些状态:
docker ps -a > /root/docker-ps-before-migration.txt
docker images > /root/docker-images-before-migration.txt
docker volume ls > /root/docker-volumes-before-migration.txt

六、停止业务容器

bash 复制代码
这一步开始会有业务中断。
docker stop -t 30 $(docker ps -q)

确认:
docker ps

应该为空。

七、停止 Docker 和 containerd

bash 复制代码
依次:
systemctl stop docker.service
systemctl stop docker.socket
systemctl stop containerd.service

确认:
systemctl is-active docker
systemctl is-active containerd

正常应该:
inactive
inactive

八、复制 Docker 数据

bash 复制代码
迁 /var/lib/docker:
rsync -aHAXx --numeric-ids --info=progress2 \
  /var/lib/docker/ \
  /mnt/data/docker/

迁 containerd:
rsync -aHAXx --numeric-ids --info=progress2 \
  /var/lib/containerd/ \
  /mnt/data/containerd/

复制完成后检查:
du -sh /var/lib/docker /mnt/data/docker
du -sh /var/lib/containerd /mnt/data/containerd

源目录和目标目录大小应该基本一致。
注意这里:
/var/lib/docker/

最后这个 / 不要漏。

九、配置 containerd 新目录

bash 复制代码
先确认另一台机器的 config version:
containerd config dump | grep '^version'

如果跟这台一样:
version = 3

就创建:
mkdir -p /etc/containerd

然后:
cat >/etc/containerd/config.toml <<'EOF'
version = 3

root = "/mnt/data/containerd"
state = "/run/containerd"
EOF

确认:
cat /etc/containerd/config.toml

应该是:
version = 3

root = "/mnt/data/containerd"
state = "/run/containerd"

注意:
root   → /mnt/data/containerd
state  → /run/containerd

只迁 root。
不要把 state 迁到数据盘。

十、配置 Docker 新目录

bash 复制代码
如果:
cat /etc/docker/daemon.json

不存在,可以直接:
mkdir -p /etc/docker

然后:
cat >/etc/docker/daemon.json <<'EOF'
{
  "data-root": "/mnt/data/docker"
}
EOF

检查:
python3 -m json.tool /etc/docker/daemon.json

如果另一台已经有 daemon.json,不要直接覆盖。
例如原来:
{
  "registry-mirrors": ["xxx"]
}

应该改成:
{
  "data-root": "/mnt/data/docker",
  "registry-mirrors": ["xxx"]
}

十一、增加 systemd 数据盘依赖

bash 复制代码
这是为了防止:
机器启动
↓
/mnt/data 没挂载
↓
Docker 先启动
↓
Docker 又往系统盘写

containerd:
mkdir -p /etc/systemd/system/containerd.service.d

cat >/etc/systemd/system/containerd.service.d/data-mount.conf <<'EOF'
[Unit]
RequiresMountsFor=/mnt/data
EOF

Docker:
mkdir -p /etc/systemd/system/docker.service.d

cat >/etc/systemd/system/docker.service.d/data-mount.conf <<'EOF'
[Unit]
RequiresMountsFor=/mnt/data
EOF

加载:
systemctl daemon-reload

十二、先启动 containerd

bash 复制代码
systemctl start containerd

检查:
systemctl status containerd --no-pager

必须:
Active: active (running)

然后:
containerd config dump | grep -E '^version|^root|^state'

必须变成:
version = 3
root = '/mnt/data/containerd'
state = '/run/containerd'

如果这里还是:
/var/lib/containerd

就先不要启动 Docker。

十三、启动 Docker

bash 复制代码
containerd 正常后:
systemctl start docker

检查:
systemctl status docker --no-pager

再:
docker info | grep -E 'Docker Root Dir|Storage Driver|driver-type'

必须看到:
Storage Driver: overlayfs
driver-type: io.containerd.snapshotter.v1
Docker Root Dir: /mnt/data/docker

十四、确认原来的资源还在

bash 复制代码
docker ps -a
docker images
docker volume ls
docker system df

确认:
- 容器数量没少
- 镜像还在
- Volume 还在

十五、恢复迁移前运行的容器

bash 复制代码
直接:
xargs -r docker start < /root/docker-running-before-migration.txt

检查:
docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'

十六、确认新数据盘正在使用

bash 复制代码
df -h / /mnt/data

再:
du -sh /mnt/data/docker
du -sh /mnt/data/containerd

确认:
docker info | grep 'Docker Root Dir'

结果:
Docker Root Dir: /mnt/data/docker

以及:
containerd config dump | grep '^root'

结果:
root = '/mnt/data/containerd'

十七、重启机器验证

bash 复制代码
这一步强烈建议做。
reboot

机器回来后:
findmnt /mnt/data

确认:
/mnt/data /dev/vdb1 ext4 ...

然后:
containerd config dump | grep -E '^version|^root|^state'

确认:
root = '/mnt/data/containerd'

Docker:
docker info | grep -E 'Docker Root Dir|Storage Driver|driver-type'

确认:
Docker Root Dir: /mnt/data/docker

然后:
docker ps --format 'table {{.Names}}\t{{.Status}}'

再看磁盘:
df -h / /mnt/data

十八、确认无误后删除旧数据

bash 复制代码
只有完成重启验证之后再做。
先:
du -sh /var/lib/docker
du -sh /var/lib/containerd

再次确认:
docker info | grep 'Docker Root Dir'
containerd config dump | grep '^root'

分别必须是:
/mnt/data/docker
/mnt/data/containerd

然后:
rm -rf /var/lib/docker
rm -rf /var/lib/containerd

再:
df -h /

这样系统盘空间就会释放出来。
相关推荐
kuroomi2 小时前
K8s集群升级与etcd备份恢复实战
容器·kubernetes·etcd
大盛供应链·卢生3 小时前
半导体行业发展的主要驱动力,到底是什么?
容器·新浪微博
川石课堂软件测试3 小时前
自动化测试|持续集成Git使用详解
git·python·jmeter·mysql·ci/cd·容器·kubernetes
探索云原生4 小时前
KServe 工作流程:从 InferenceService 到 vLLM 服务
docker·ai·云原生·kubernetes·go
剑锋所指,所向披靡!4 小时前
Docker基础
运维·docker·容器
clz13145215 小时前
Dify的Windows平台部署:从Docker安装到Dify运行
windows·docker·容器
colinu7 小时前
Docker 容器自启动策略说明与常用命令
运维·docker·容器
灯澜忆梦7 小时前
【docker】#3 | 数据卷挂载
运维·docker·容器
像风一样自由202015 小时前
52.Docker部署大模型应用从本地开发到服务化运行
运维·人工智能·docker·容器·大模型·智能体