本篇暂未验证,理论应该可行的!
在现代服务器运维中,Docker 已经成为不可或缺的工具。但随之而来的一个甜蜜烦恼是:Docker 实在是太“能吃”了!镜像(Images)、卷(Volumes)、容器的可写层(Writable Layers),尤其是我们常常忽略的日志(Logs),都会默认堆积在 /var/lib/docker
目录下。
对于使用高速但容量有限的 SSD 作为系统盘的服务器而言,这无异于一颗定时炸弹。当系统盘被占满时,整个系统的性能都会受到影响,甚至可能导致服务中断。
那么,如何从根源上解决这个问题呢?答案就是:将整个 Docker 的“家”——数据根目录(data-root)——迁移到一块容量更大的数据盘(如机械硬盘 HDD)上。
这篇博客将为你提供一个安全、详细、分步式的操作指南。
迁移前的准备工作 (Prerequisites)
在开始操作前,请确保你已经准备好以下条件:
- 一台安装了 Docker 的 Linux 服务器。
- 一块已经挂载好的大容量硬盘。在本教程中,我们假设你已经将其挂载到某个路径,我们将使用
/home/docker-data
作为 Docker 的新家。你可以根据自己的情况替换为/mnt/data/docker
等其他路径。 - Sudo 或 Root 权限。
- 一个维护窗口。本次操作需要短暂地停止 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
来实现。
打开(或创建)配置文件:
sudo nano /etc/docker/daemon.json
- 添加 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
命令,而不是 cp
或 mv
。
为什么是 rsync?
因为它能完美地保留所有文件的权限、所有权、时间戳等元数据,这对于 Docker 的正常运行至关重要。
# 使用 rsync 进行归档式、带进度的迁移
# -a: 归档模式,等于 -rlptgoD,能保留所有文件属性
# -P: 显示进度(progress)并支持断点续传(partial)
sudo rsync -aP /var/lib/docker/ /home/docker-data/
根据你的数据量大小,这个过程可能需要几分钟到数小时不等,请耐心等待。
第 4 步:启动并验证
数据迁移完成后,激动人心的时刻到了。我们先不急着删除旧数据,而是先启动 Docker,验证它能否在新家正常工作。
为了安全起见,先将旧目录重命名作为备份:
sudo mv /var/lib/docker /var/lib/docker.old
这一步是我们的“后悔药”。如果 Docker 启动失败,我们只需删除新配置,并将这个目录改回原名即可恢复。
启动 Docker 服务:
sudo systemctl start docker
进行验证:
验证一:检查 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 的开发者和运维工程师。
版权属于:soarli
本文链接:https://blog.soarli.top/archives/761.html
转载时须注明出处及本声明。