服务器空间告急?教你优雅地将 Docker 镜像迁移到大容量磁盘

Naseele docker 114 次阅读 623 字 预计阅读时间: 3 分钟 发布于 2026-02-12 最后更新于 24 天前


AI 摘要

你的Docker镜像快把服务器硬盘撑爆了?别慌!这篇文章手把手教你如何安全、优雅地把Docker的“家”搬到新的大容量硬盘上。就像给集装箱搬家一样,我们会先暂停所有活动,然后用专业工具完整复制所有数据(连权限都不丢),最后告诉Docker新地址在哪。跟着步骤走,几分钟就能释放宝贵空间,让你的容器们在新家快乐奔跑!

1. 准备工作:停止 Docker 服务

首先必须完全停止 Docker,防止在迁移过程中有数据写入导致损坏。

注意:要同时停止 socket,以防它自动唤醒 Docker。

sudo systemctl stop docker
sudo systemctl stop docker.socket

2. 迁移数据:使用 rsync 同步

我们将原有的数据完整迁移到新磁盘的目标目录(我的在 /home/naseele/data/docker_root_data,因为我给另一个盘挂载到data文件夹了)。

使用 rsync 而不是 cpmv,是为了确保文件权限、软链接等属性完美保留。

# 创建新目录
mkdir -p /home/naseele/data/docker_root_data

# 同步数据(-aP 保留权限并显示进度)
sudo rsync -avP /var/lib/docker/ /home/naseele/data/docker_root_data/

3. 修改配置:指定新的 Data Root

这是最关键的一步。我们需要修改 Docker 的守护进程配置文件,告诉它:“以后去新家找数据”。

编辑文件:/etc/docker/daemon.json (如果文件不存在则新建,如果存在要注意保留原有配置,加个逗号隔开)

{
  "data-root": "/home/naseele/data/docker_root_data"
}

4. 重启与验证

配置改好后,重新加载配置并启动服务。

sudo systemctl daemon-reload
sudo systemctl start docker

验证方法:docker info 命令确认了 Docker Root Dir 已经变了:

docker info | grep "Docker Root Dir"
# 预期输出: Docker Root Dir: /home/naseele/data/docker_root_data

确认容器都正常跑起来、且业务没受影响后,我们再删除旧数据。

5. 收尾:清理旧数据

确认一切正常后,释放根目录空间:

注意:强烈建议在使用rm时,用tab键补全,以防误删或者因为通配符匹配错误而误伤系统路径!!!

sudo rm -rf /var/lib/docker

TIPS:

  • 为什么不用软链接? 虽然把 /var/lib/docker 做个软链指过去也能用,但修改 daemon.json 是官方推荐的做法,更清晰,不容易因为误删软链导致灾难。
  • 关于 rsync: 一定要用 -a 参数,否则文件权限丢了,容器启动时会报一堆 Permission denied 错误。