Docker数据目录迁移

Author Avatar
Administrator
发表:2026-05-21 18:15:04
修改:2026-05-21 18:31:10

将 Docker 的默认目录 /var/lib/docker 迁移到其他位置,是解决服务器根分区空间不足的常见操作。

在开始之前,强烈不建议使用软链接(ln -s)的方式进行迁移。因为 Docker 的子模块(如 containerd、overlay2 驱动)对路径非常敏感,使用软链接极易导致容器网络失效、启动失败等隐蔽问题。

官方推荐且最安全的方式是通过修改 Docker 的配置文件 daemon.json 来指定新的数据目录。以下是零停机风险的标准迁移步骤:

🚀 迁移准备与步骤

1. 停止 Docker 服务

为了防止数据损坏,必须先停止 Docker 服务(如果服务器上有运行 containerd,建议一并停止):

sudo systemctl stop docker
sudo systemctl stop docker.socket
sudo systemctl stop containerd

2. 创建新目录并迁移数据

假设你希望将 Docker 数据迁移到 /data/docker(请确保目标磁盘有足够的空间):

# 创建新目录
sudo mkdir -p /data/docker

# 使用 rsync 迁移数据(强烈推荐)
# -a 保留文件权限、属主和软硬链接;-P 显示进度并支持断点续传
sudo rsync -aP /var/lib/docker/ /data/docker/

注意:rsync 命令中源路径 /var/lib/docker/ 最后的斜杠 / 非常重要,它代表复制目录内的内容。

3. 修改 Docker 配置文件

编辑(或新建)Docker 的配置文件 /etc/docker/daemon.json,添加 data-root 字段指向新目录:

sudo vim /etc/docker/daemon.json

在文件中写入或修改为以下内容(如果文件中有其他配置,请确保 JSON 格式正确,用逗号隔开):

{
  "data-root": "/data/docker"
}

4. 重启服务并验证

重新加载配置并启动 Docker 服务:

sudo systemctl daemon-reload
sudo systemctl start docker

检查 Docker 是否已经成功使用了新的目录:

sudo docker info | grep "Docker Root Dir"

如果输出显示 Docker Root Dir: /data/docker,说明迁移已经生效。同时可以通过 docker ps -adocker images 确认原有的容器和镜像是否完好无损。

5. 清理旧数据(可选)

在确认新目录下的 Docker 运行完全正常后,你可以删除旧目录以释放根分区的空间:

sudo rm -rf /var/lib/docker

💡 温馨提示

  • SELinux 用户注意:如果你的系统开启了 SELinux,迁移后可能需要为新目录重新打上安全标签,可以执行 sudo restorecon -R /data/docker

  • 数据完整性:使用 rsync -a 能够最大程度保留 Docker 运行所需的文件权限和硬链接,切勿直接使用 cp -r,否则可能导致镜像层校验失败。

评论