# 把 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 服务

```bash
systemctl stop docker
systemctl stop containerd

```

确认没有残留进程：

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

```

---

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

```bash
mkdir -p /home/shuncom/docker

```

权限建议保持 root：

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

```

---

### 3️⃣ 使用 rsync 迁移原有数据（强烈推荐）

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

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

```

参数说明（你是老运维，这里直说重点）：

- `-H`：保持 hard links（overlay2 必须）
- `-A -X`：ACL / xattr
- `--numeric-ids`：避免 UID/GID 映射问题

---

### 4️⃣ 备份原目录（不要直接删）

```bash
mv /var/lib/docker /var/lib/docker.bak

```

---

### 5️⃣ 配置 Docker 使用新目录

编辑（没有就新建）：

```bash
vim /etc/docker/daemon.json

```

内容如下：

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

```

**注意：JSON 严格格式，不能多逗号**

---

### 6️⃣ 启动 Docker

```bash
systemctl daemon-reexec
systemctl start docker

```

检查状态：

```bash
systemctl status docker

```

---

### 7️⃣ 验证是否生效（非常关键）

```bash
docker info | grep -i "Docker Root Dir"

```

应显示：

```
Docker Root Dir: /home/shuncom/docker

```

再确认 overlay2：

```bash
mount | grep overlay | head

```

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

---

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

**建议观察 1–2 天后再删**

```bash
rm -rf /var/lib/docker.bak

```

---

## 三、备选方案（不推荐但可用）：bind mount

如果你**不想改 Docker 配置文件**，也可以用挂载方式：

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

```

并写入 `/etc/fstab`：

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

```

⚠️ **缺点**：

- 可维护性差
- 后期排障容易踩坑
- 不利于 Docker 升级

**不建议长期使用**

---

## 四、针对你当前环境的补充建议（基于你贴的 df）

- `/` 只有 98G，但 overlay2 已经在用
- `/home` 有 300G，非常适合 Docker data-root
- 后续建议：
    
    ```bash
    docker system df
    docker system prune -a
    
    ```
    
    定期清理无用镜像、层

---

## 五、总结一句话方案

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

如果你愿意，下一步我可以帮你：

- 校验 rsync 后的 overlay2 完整性
- 规划 volumes 单独挂载
- 评估是否需要开启 `log-driver` 限制容器日志膨胀