默认情况下,Docker 将数据存储在 /var/lib/docker,Containerd 将数据存储在 /var/lib/containerd。随着镜像、容器和卷的增多,这些目录可能迅速占满系统盘(通常是 / 分区)。本文将指导你如何将这两个目录迁移到新的位置,例如 /newdisk/docker 和 /newdisk/containerd。
📌 适用环境: Ubuntu 系统。
1. 准备工作
1.1 确认当前磁盘使用情况
查看当前 /var/lib/docker 和 /var/lib/containerd 的大小:
sudo du -sh /var/lib/docker
sudo du -sh /var/lib/containerd
1.2 准备新存储位置
假设你想将数据迁移到 /newdisk 分区(该分区已挂载并有足够空间)。创建目标目录:
sudo mkdir -p /newdisk/docker
sudo mkdir -p /newdisk/containerd
1.3 停止相关服务
必须停止 Docker 和 Containerd 服务,防止数据损坏:
sudo systemctl stop docker
sudo systemctl stop containerd
如果 Docker 服务依赖 Containerd,停止 Docker 后 Containerd 可能仍在运行,请确保 Containerd 也已完全停止:
sudo systemctl stop containerd sudo systemctl status containerd # 确认状态为 inactive (dead)
2. 迁移数据
使用 rsync 复制现有数据到新位置,保留权限、属主和时间戳。
2.1 迁移 /var/lib/docker
sudo rsync -avxP /var/lib/docker/ /newdisk/docker/
-a:归档模式,保留权限等属性-v:显示详细信息-x:不跨越文件系统边界(如果/var/lib/docker单独挂载)-P:显示进度并支持断点续传
2.2 迁移 /var/lib/containerd
sudo rsync -avxP /var/lib/containerd/ /newdisk/containerd/
验证数据完整性:迁移完成后,可以对比新旧目录的文件数量:
sudo find /var/lib/docker -type f | wc -l sudo find /newdisk/docker -type f | wc -l理论上两边的文件数应相等。
3. 修改配置文件
3.1 修改 Docker 数据目录
编辑 Docker 配置文件 /etc/docker/daemon.json(如果不存在则创建):
sudo nano /etc/docker/daemon.json
添加或修改 data-root 字段:
{
"data-root": "/newdisk/docker"
}
如果文件中已有其他配置(如镜像加速器),请确保 JSON 格式正确,例如:
{
"data-root": "/newdisk/docker",
"registry-mirrors": ["https://docker.m.daocloud.io"]
}
保存并退出。
3.2 修改 Containerd 数据目录
Containerd 的配置文件通常在 /etc/containerd/config.toml。如果该文件不存在,可以生成默认配置:
sudo containerd config default | sudo tee /etc/containerd/config.toml
然后编辑该文件:
sudo nano /etc/containerd/config.toml
找到 root = "/var/lib/containerd" 这一行,将其修改为新路径:
root = "/newdisk/containerd"
如果文件中还有
state = "/run/containerd",则不需要修改,state目录仍保留在/run(内存文件系统)中。
保存并退出。
4. 重启服务并验证
4.1 重新加载 systemd 配置并启动服务
sudo systemctl daemon-reload
sudo systemctl start containerd
sudo systemctl start docker
4.2 检查服务状态
sudo systemctl status docker
sudo systemctl status containerd
确保两者均为 active (running)。
4.3 验证 Docker 数据目录
docker info | grep "Docker Root Dir"
输出应显示 /newdisk/docker。
4.4 验证 Containerd 数据目录
sudo containerd config dump | grep -i "root ="
或直接检查:
ps aux | grep containerd
查看进程参数中是否有 --root /newdisk/containerd。
4.5 验证原有数据是否可用
运行一个测试容器:
docker run --rm hello-world
列出已有镜像:
docker images
应该能看到之前迁移过来的镜像。
5. (可选)清理旧数据
确认一切运行正常后,可以删除旧目录释放空间:
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
⚠️ 谨慎操作:建议先保留旧目录至少一周,确认系统稳定后再删除。
6. 备选方法:使用符号链接
如果你不想修改配置文件,也可以通过符号链接(软链接)实现重定向。此方法同样需要停止服务、迁移数据,然后创建链接:
sudo systemctl stop docker containerd
sudo mv /var/lib/docker /var/lib/docker.bak
sudo mv /var/lib/containerd /var/lib/containerd.bak
sudo ln -s /newdisk/docker /var/lib/docker
sudo ln -s /newdisk/containerd /var/lib/containerd
sudo systemctl start containerd docker
符号链接方法简单直接,但在某些场景下(如容器内部挂载卷)可能引发权限或路径解析问题。推荐优先使用修改配置文件的方法。
7. 常见问题
Q1:修改 daemon.json 后 Docker 无法启动
- 原因:JSON 格式错误(多余逗号、缺少引号等)。
- 解决:运行
sudo journalctl -u docker | tail -20查看具体错误,修正 JSON 语法。
Q2:Containerd 启动失败,提示 root directory not empty
- 原因:新目录中已有其他数据(或旧的元数据)。
- 解决:确保新目录为空(或正确迁移了数据),然后重启服务。可以尝试清空新目录再
rsync。
Q3:迁移后 docker images 看不到原来的镜像
- 原因:
daemon.json中的data-root路径不正确,或者迁移时遗漏了文件。 - 解决:检查
/etc/docker/daemon.json路径,确保指向正确的新目录。重新执行rsync并确保无错误。
Q4:Docker 和 Containerd 数据目录可以放在同一个父目录下吗?
- 可以,例如
/newdisk/docker和/newdisk/containerd是完全独立的子目录,互不干扰。
Q5:迁移后磁盘空间未释放
- 原因:旧目录仍存在。
- 解决:确认新目录工作正常后,手动删除
/var/lib/docker和/var/lib/containerd。
总结
通过修改配置文件(daemon.json 和 config.toml)并迁移数据,你可以安全地将 Docker 和 Containerd 的数据存储位置更改到任意挂载点(如 /newdisk)。这有助于避免系统盘写满,提升磁盘 IO 性能。
核心步骤回顾:
- 停止服务 → 2. 迁移数据 → 3. 修改配置 → 4. 重启服务 → 5. 验证 → 6. 清理旧目录
如果你在操作过程中遇到任何错误,请检查服务日志(journalctl -u docker -u containerd)并根据提示调整。

评论