在 Ubuntu 系统中修改 Docker 和 Containerd 数据存储位置 本文共有4570个字,关键词: 默认情况下,Docker 将数据存储在 `/var/lib/docker`,Containerd 将数据存储在 `/var/lib/containerd`。随着镜像、容器和卷的增多,这些目录可能迅速占满系统盘(通常是 `/` 分区)。本文将指导你如何将这两个目录迁移到新的位置,例如 `/newdisk/docker` 和 `/newdisk/containerd`。 > 📌 **适用环境**: Ubuntu 系统。 --- ## 1. 准备工作 ### 1.1 确认当前磁盘使用情况 查看当前 `/var/lib/docker` 和 `/var/lib/containerd` 的大小: ```bash sudo du -sh /var/lib/docker sudo du -sh /var/lib/containerd ``` ### 1.2 准备新存储位置 假设你想将数据迁移到 `/newdisk` 分区(该分区已挂载并有足够空间)。创建目标目录: ```bash sudo mkdir -p /newdisk/docker sudo mkdir -p /newdisk/containerd ``` ### 1.3 停止相关服务 必须停止 Docker 和 Containerd 服务,防止数据损坏: ```bash sudo systemctl stop docker sudo systemctl stop containerd ``` > 如果 Docker 服务依赖 Containerd,停止 Docker 后 Containerd 可能仍在运行,请确保 Containerd 也已完全停止: > ```bash > sudo systemctl stop containerd > sudo systemctl status containerd # 确认状态为 inactive (dead) > ``` --- ## 2. 迁移数据 使用 `rsync` 复制现有数据到新位置,保留权限、属主和时间戳。 ### 2.1 迁移 `/var/lib/docker` ```bash sudo rsync -avxP /var/lib/docker/ /newdisk/docker/ ``` - `-a`:归档模式,保留权限等属性 - `-v`:显示详细信息 - `-x`:不跨越文件系统边界(如果 `/var/lib/docker` 单独挂载) - `-P`:显示进度并支持断点续传 ### 2.2 迁移 `/var/lib/containerd` ```bash sudo rsync -avxP /var/lib/containerd/ /newdisk/containerd/ ``` > **验证数据完整性**:迁移完成后,可以对比新旧目录的文件数量: > ```bash > 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`(如果不存在则创建): ```bash sudo nano /etc/docker/daemon.json ``` 添加或修改 `data-root` 字段: ```json { "data-root": "/newdisk/docker" } ``` 如果文件中已有其他配置(如镜像加速器),请确保 JSON 格式正确,例如: ```json { "data-root": "/newdisk/docker", "registry-mirrors": ["https://docker.m.daocloud.io"] } ``` 保存并退出。 ### 3.2 修改 Containerd 数据目录 Containerd 的配置文件通常在 `/etc/containerd/config.toml`。如果该文件不存在,可以生成默认配置: ```bash sudo containerd config default | sudo tee /etc/containerd/config.toml ``` 然后编辑该文件: ```bash sudo nano /etc/containerd/config.toml ``` 找到 `root = "/var/lib/containerd"` 这一行,将其修改为新路径: ```toml root = "/newdisk/containerd" ``` > 如果文件中还有 `state = "/run/containerd"`,则不需要修改,`state` 目录仍保留在 `/run`(内存文件系统)中。 保存并退出。 --- ## 4. 重启服务并验证 ### 4.1 重新加载 systemd 配置并启动服务 ```bash sudo systemctl daemon-reload sudo systemctl start containerd sudo systemctl start docker ``` ### 4.2 检查服务状态 ```bash sudo systemctl status docker sudo systemctl status containerd ``` 确保两者均为 `active (running)`。 ### 4.3 验证 Docker 数据目录 ```bash docker info | grep "Docker Root Dir" ``` 输出应显示 `/newdisk/docker`。 ### 4.4 验证 Containerd 数据目录 ```bash sudo containerd config dump | grep -i "root =" ``` 或直接检查: ```bash ps aux | grep containerd ``` 查看进程参数中是否有 `--root /newdisk/containerd`。 ### 4.5 验证原有数据是否可用 运行一个测试容器: ```bash docker run --rm hello-world ``` 列出已有镜像: ```bash docker images ``` 应该能看到之前迁移过来的镜像。 --- ## 5. (可选)清理旧数据 确认一切运行正常后,可以删除旧目录释放空间: ```bash sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/containerd ``` > ⚠️ **谨慎操作**:建议先保留旧目录至少一周,确认系统稳定后再删除。 --- ## 6. 备选方法:使用符号链接 如果你不想修改配置文件,也可以通过符号链接(软链接)实现重定向。此方法同样需要停止服务、迁移数据,然后创建链接: ```bash 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 性能。 **核心步骤回顾**: 1. 停止服务 → 2. 迁移数据 → 3. 修改配置 → 4. 重启服务 → 5. 验证 → 6. 清理旧目录 如果你在操作过程中遇到任何错误,请检查服务日志(`journalctl -u docker -u containerd`)并根据提示调整。 「一键投喂 软糖/蛋糕/布丁/牛奶/冰阔乐!」 赞赏 × 梦白沙 (๑>ڡ<)☆谢谢老板~ 1元 2元 5元 10元 50元 任意金额 2元 使用微信扫描二维码完成支付 版权声明:本文为作者原创,如需转载须联系作者本人同意,未经作者本人同意不得擅自转载。 ubuntu系统,Docker 2026-06-05 评论 6 次浏览