整体流程
目录
- 一、先确认当前环境
- 二、先解决数据盘开机挂载
- [三、创建新的 Docker 数据目录](#三、创建新的 Docker 数据目录)
- [四、确认 rsync](#四、确认 rsync)
- 五、记录当前运行中的容器
- 六、停止业务容器
- [七、停止 Docker 和 containerd](#七、停止 Docker 和 containerd)
- [八、复制 Docker 数据](#八、复制 Docker 数据)
- [九、配置 containerd 新目录](#九、配置 containerd 新目录)
- [十、配置 Docker 新目录](#十、配置 Docker 新目录)
- [十一、增加 systemd 数据盘依赖](#十一、增加 systemd 数据盘依赖)
- [十二、先启动 containerd](#十二、先启动 containerd)
- [十三、启动 Docker](#十三、启动 Docker)
- 十四、确认原来的资源还在
- 十五、恢复迁移前运行的容器
- 十六、确认新数据盘正在使用
- 十七、重启机器验证
- 十八、确认无误后删除旧数据
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 /
这样系统盘空间就会释放出来。