在 Ubuntu 系统中修改 Docker 和 Containerd 数据存储位置

本文指导在Ubuntu系统中将Docker和Containerd数据从默认的/var/lib/docker和/var/lib/containerd迁移到新位置(如/newdisk)。步骤包括:停止服务、使用rsync复制数据、修改配置文件(daemon.json设置data-root、config.toml设置root)、重启服务并验证。还提供了备选的符号链接方法及常见问题解答。

作者:zhuge··预计阅读 15 分钟·41 阅读·0 评论
在 Ubuntu 系统中修改 Docker 和 Containerd 数据存储位置

默认情况下,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.jsonconfig.toml)并迁移数据,你可以安全地将 Docker 和 Containerd 的数据存储位置更改到任意挂载点(如 /newdisk)。这有助于避免系统盘写满,提升磁盘 IO 性能。

核心步骤回顾

  1. 停止服务 → 2. 迁移数据 → 3. 修改配置 → 4. 重启服务 → 5. 验证 → 6. 清理旧目录

如果你在操作过程中遇到任何错误,请检查服务日志(journalctl -u docker -u containerd)并根据提示调整。

相关文章

评论

加载中...