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

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

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


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

你现在关注的是:

/var/lib/docker/containers

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

你当前看到:

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

说明:


二、推荐方案(生产最常用):修改 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/

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


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

⚠️ 缺点

不建议长期使用


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


五、总结一句话方案

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

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


Revision #1
Created 20 January 2026 01:22:18 by Admin
Updated 20 January 2026 01:22:35 by Admin