Skip to main content

把 Docker 的运行数据目录从系统盘(/)迁移到 /home

你的目的本质上是:把 Docker 的运行数据目录从系统盘(/)迁移到 /home 所在的大容量磁盘(/dev/sdb1),以避免后续容器、日志、overlay2 占满根分区。

需要先明确一个关键点,然后给出正确、规范、可回滚的迁移方案。


一、先澄清一个常见误区(很重要)

你现在关注的是:

/var/lib/docker/containers

Docker 实际占用空间的核心并不在 containers 目录,而是在:

  • /var/lib/docker/overlay2真正吃空间

  • /var/lib/docker/volumes

  • /var/lib/docker/image

你当前看到:

containers 目录 < 1MB
overlay2 挂载在 /var/lib/docker/overlay2/*

说明:

  • 现在只是“刚开始”,但 只迁移 containers 没有任何实质意义

  • 正确做法是:整体迁移 /var/lib/docker


二、推荐方案(生产最常用):修改 Docker data-root

这是最干净、最安全、官方推荐的方式。

1️⃣ 停止 Docker 服务

systemctl stop docker
systemctl stop containerd

确认没有残留进程:

ps -ef | grep -E 'docker|containerd' | grep -v grep

2️⃣ 在 /home/shuncom 下准备新目录

mkdir -p /home/shuncom/docker

权限建议保持 root:

chown -R root:root /home/shuncom/docker

3️⃣ 使用 rsync 迁移原有数据(强烈推荐)

不要用 cp -a,overlay2 + hardlink 场景下 rsync 更安全

rsync -aHAX --numeric-ids /var/lib/docker/ /home/shuncom/docker/

参数说明(你是老运维,这里直说重点):

  • -H:保持 hard links(overlay2 必须)

  • -A -X:ACL / xattr

  • --numeric-ids:避免 UID/GID 映射问题


4️⃣ 备份原目录(不要直接删)

mv /var/lib/docker /var/lib/docker.bak

5️⃣ 配置 Docker 使用新目录

编辑(没有就新建):

vim /etc/docker/daemon.json

内容如下:

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

注意:JSON 严格格式,不能多逗号


6️⃣ 启动 Docker

systemctl daemon-reexec
systemctl start docker

检查状态:

systemctl status docker

7️⃣ 验证是否生效(非常关键)

docker info | grep -i "Docker Root Dir"

应显示:

Docker Root Dir: /home/shuncom/docker

再确认 overlay2:

mount | grep overlay | head

路径应指向 /home/shuncom/docker/overlay2


8️⃣ 一切正常后,清理旧数据

建议观察 1–2 天后再删

rm -rf /var/lib/docker.bak

三、备选方案(不推荐但可用):bind mount

如果你不想改 Docker 配置文件,也可以用挂载方式:

mount --bind /home/shuncom/docker /var/lib/docker

并写入 /etc/fstab

/home/shuncom/docker  /var/lib/docker  none  bind  0  0

⚠️ 缺点

  • 可维护性差

  • 后期排障容易踩坑

  • 不利于 Docker 升级

不建议长期使用


四、针对你当前环境的补充建议(基于你贴的 df)

  • / 只有 98G,但 overlay2 已经在用

  • /home 有 300G,非常适合 Docker data-root

  • 后续建议:

    docker system df
    docker system prune -a
    

    定期清理无用镜像、层


五、总结一句话方案

不要只迁移 /var/lib/docker/containers,而是整体迁移 /var/lib/docker,并通过 data-root 正式切换到 /home/shuncom/docker

如果你愿意,下一步我可以帮你:

  • 校验 rsync 后的 overlay2 完整性

  • 规划 volumes 单独挂载

  • 评估是否需要开启 log-driver 限制容器日志膨胀