soarli

告别系统盘焦虑:将 Docker 数据目录迁移到大容量硬盘的终极指南
本篇暂未验证,理论应该可行的!在现代服务器运维中,Docker 已经成为不可或缺的工具。但随之而来的一个甜蜜烦恼是...
扫描右侧二维码阅读全文
19
2025/10

告别系统盘焦虑:将 Docker 数据目录迁移到大容量硬盘的终极指南

本篇暂未验证,理论应该可行的!

在现代服务器运维中,Docker 已经成为不可或缺的工具。但随之而来的一个甜蜜烦恼是:Docker 实在是太“能吃”了!镜像(Images)、卷(Volumes)、容器的可写层(Writable Layers),尤其是我们常常忽略的日志(Logs),都会默认堆积在 /var/lib/docker 目录下。

对于使用高速但容量有限的 SSD 作为系统盘的服务器而言,这无异于一颗定时炸弹。当系统盘被占满时,整个系统的性能都会受到影响,甚至可能导致服务中断。

那么,如何从根源上解决这个问题呢?答案就是:将整个 Docker 的“家”——数据根目录(data-root)——迁移到一块容量更大的数据盘(如机械硬盘 HDD)上。

这篇博客将为你提供一个安全、详细、分步式的操作指南。


迁移前的准备工作 (Prerequisites)

在开始操作前,请确保你已经准备好以下条件:

  1. 一台安装了 Docker 的 Linux 服务器
  2. 一块已经挂载好的大容量硬盘。在本教程中,我们假设你已经将其挂载到某个路径,我们将使用 /home/docker-data 作为 Docker 的新家。你可以根据自己的情况替换为 /mnt/data/docker 等其他路径。
  3. Sudo 或 Root 权限
  4. 一个维护窗口。本次操作需要短暂地停止 Docker 服务,所有容器将会停止运行。请务必在一个业务低峰期进行。

迁移五步法:安全、高效地为 Docker 搬家

我们将严格遵循“停服 -> 迁移 -> 改配置 -> 验证 -> 清理”的流程,并加入安全备份步骤,确保万无一失。

第 1 步:停止 Docker 服务

这是整个流程中最关键的第一步。必须在迁移文件前完全停止 Docker,以防止任何数据读写导致文件损坏或数据不一致。

# 停止 Docker 服务
sudo systemctl stop docker.service

# 同时停止 Docker 的 socket 监听
sudo systemctl stop docker.socket

执行后,可以通过 systemctl status docker 确认 Docker 已经处于 inactive (dead) 状态。

第 2 步:配置 Docker 的新家

接下来,我们需要告诉 Docker,下次启动时应该去哪里寻找它的文件。这通过修改 Docker 的守护进程配置文件 daemon.json 来实现。

  1. 打开(或创建)配置文件

    sudo nano /etc/docker/daemon.json
  2. 添加 data-root 配置:

在文件中输入以下内容。如果你之前有其他配置(比如我们之前设置的日志轮转),请确保将 "data-root" 作为一个新的键值对添加进去,并保证整个文件是合法的 JSON 格式。

{
  "data-root": "/home/docker-data"
}
  • 提示:如果已有其他配置,它可能看起来像这样:

    {
      "data-root": "/home/docker-data",
      "log-driver": "json-file",
      "log-opts": {
        "max-size": "1g",
        "max-file": "10"
      }
    }

第 3 步:执行迁移

现在,我们将 /var/lib/docker 目录下的所有内容原封不动地搬到新家 /home/docker-data。在这里,我们强烈推荐使用 rsync 命令,而不是 cpmv

为什么是 rsync?

因为它能完美地保留所有文件的权限、所有权、时间戳等元数据,这对于 Docker 的正常运行至关重要。

# 使用 rsync 进行归档式、带进度的迁移
# -a: 归档模式,等于 -rlptgoD,能保留所有文件属性
# -P: 显示进度(progress)并支持断点续传(partial)
sudo rsync -aP /var/lib/docker/ /home/docker-data/

根据你的数据量大小,这个过程可能需要几分钟到数小时不等,请耐心等待。

第 4 步:启动并验证

数据迁移完成后,激动人心的时刻到了。我们先不急着删除旧数据,而是先启动 Docker,验证它能否在新家正常工作。

  1. 为了安全起见,先将旧目录重命名作为备份

    sudo mv /var/lib/docker /var/lib/docker.old

这一步是我们的“后悔药”。如果 Docker 启动失败,我们只需删除新配置,并将这个目录改回原名即可恢复。

  1. 启动 Docker 服务

    sudo systemctl start docker
  2. 进行验证

    • 验证一:检查 Docker 根目录。这是决定性的证据。

      docker info | grep "Docker Root Dir"
 你应该看到如下输出,确认路径已经更改:
Docker Root Dir: /home/docker-data
  • 验证二:检查容器和镜像

    docker ps -a
    docker images
 如果你能看到之前所有的容器和镜像都安然无恙,那么恭喜你,迁移已成功!

第 5 步:清理战场

在确认 Docker 在新目录运行稳定、所有容器都正常工作后,我们就可以放心地删除旧的数据备份,将宝贵的系统盘空间释放出来了。

🚨 最终警告:请在完成所有验证、并观察一段时间(例如一天)确保服务稳定后再执行此步骤。此操作不可逆!

sudo rm -rf /var/lib/docker.old

结语

通过以上五个步骤,我们成功地将 Docker 的整个数据目录迁移到了大容量硬盘上。这不仅一劳永逸地解决了系统盘的空间焦虑问题,还通过将频繁的I/O操作转移出去,间接减少了对系统盘 SSD 的磨损。

这是一个简单但回报极高的最佳实践,强烈推荐给所有在生产环境中使用 Docker 的开发者和运维工程师。

最后修改:2025 年 10 月 19 日 03 : 51 AM

发表评论