迁移docker数据目录到home分区

Author Avatar
Administrator
发表:2026-09-29 20:26:07
修改:2026-09-29 20:26:07

把 /var/lib/docker 也一起迁走,其实就是再补一套 Docker 根目录迁移。它和 containerd 迁移逻辑一样:停服务 → rsync 同步 → 改配置 → 重启验证 → 保留旧目录观察。区别在于 Docker 改的是 /etc/docker/daemon.json 的 data-root,而不是 containerd 的配置文件。

完整合并迁移步骤

1. 停止服务

docker stop $(docker ps -q)
sudo systemctl stop docker docker.socket containerd
sudo systemctl status docker containerd

2. 同步 containerd 数据

sudo mkdir -p /home/sagez/containerd
sudo rsync -aHAX --numeric-ids /var/lib/containerd/ /home/sagez/containerd/
sudo rsync -aHAX --numeric-ids --delete /var/lib/containerd/ /home/sagez/containerd/

3. 同步 Docker 数据

sudo mkdir -p /home/sagez/docker
sudo rsync -aHAX --numeric-ids /var/lib/docker/ /home/sagez/docker/
sudo rsync -aHAX --numeric-ids --delete /var/lib/docker/ /home/sagez/docker/

如果数据量很大,可以先在服务运行时做一次全量 rsync,停服务后再做一次增量 --delete,能明显缩短停机时间。

4. 修改 Docker 配置

sudo mkdir -p /etc/docker
sudo nano /etc/docker/daemon.json

写入:

{
  "data-root": "/home/sagez/docker"
}

如果文件里已有其他配置,只新增 "data-root" 字段,注意 JSON 逗号。

5. 修改 containerd 配置

sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml >/dev/null
sudo sed -i "s#^root = .*#root = '/home/sagez/containerd'#" /etc/containerd/config.toml

验证:

grep -E "^(root|state)" /etc/containerd/config.toml

应输出:

root = '/home/sagez/containerd'
state = '/run/containerd'

6. 备份旧目录

sudo mv /var/lib/docker /var/lib/docker.bak
sudo mv /var/lib/containerd /var/lib/containerd.bak

7. 启动服务

sudo systemctl daemon-reload
sudo systemctl start containerd
sleep 3
sudo systemctl start docker
sleep 5

8. 验证

docker info | grep "Docker Root Dir"
sudo containerd config dump | grep "root ="
docker images
docker ps -a
df -h /
sudo du -sh /home/sagez/docker /home/sagez/containerd

确认 Docker Root Dir 是 /home/sagez/docker,containerd 的 root 是 /home/sagez/containerd,镜像和容器都正常后,根目录空间应该已经释放。

9. 清理旧数据

建议至少观察一天,确认容器、镜像、卷、网络都正常,再执行:

sudo rm -rf /var/lib/docker.bak /var/lib/containerd.bak

回滚方法

sudo systemctl stop docker docker.socket containerd
sudo rm /etc/docker/daemon.json
sudo rm /etc/containerd/config.toml
sudo mv /var/lib/docker.bak /var/lib/docker
sudo mv /var/lib/containerd.bak /var/lib/containerd
sudo systemctl daemon-reload
sudo systemctl start containerd docker

几个注意点

  • 不要用软链接,Docker 子模块和 CNI 网络对路径比较敏感,软链接可能引发网络或启动问题。

  • rsync 末尾要带 /,写成 /var/lib/docker/,避免多出一层目录。

  • 新目录权限保持 root:root,不要随意 chmod 777。

  • 如果 SELinux 开启,可能需要执行 sudo restorecon -R /home/sagez/docker。

评论