前言

Docker 镜像、容器和卷越来越多时,如果 /var/lib/docker 所在分区规划不足,就容易出现磁盘空间不足。更标准的方式是通过 /etc/docker/daemon.json 配置 data-root,本文记录另一种使用符号链接迁移数据目录的方案。


为什么使用符号链接?

创建符号链接的好处在于,可以不修改 Docker 配置文件 /etc/docker/daemon.json。符号链接能够将 Docker 默认查找的数据目录路径 /var/lib/docker 指向新的位置,从而让 Docker 找到迁移后的数据目录。

需要注意的是,迁移前必须停止 Docker 服务,并保留原目录备份。迁移后确认容器、镜像和卷都正常后,再清理旧目录。

迁移步骤

按照以下步骤操作,即可成功迁移 Docker 数据目录:

  1. 停止 Docker 服务

    首先,确保停止 Docker 服务,以避免在复制数据时出现文件被占用的情况。

    1
    sudo systemctl stop docker
  2. 复制 Docker 数据目录

    使用 cp 命令复制 /var/lib/docker 目录到新的位置 /home/app 下。-a 选项表示归档模式,会保留文件的所有属性和权限,-u 表示仅在目标文件不存在或源文件更新时进行复制。

    1
    sudo cp -au /var/lib/docker /home/app
  3. 重命名原始 Docker 目录

    为了确保数据安全,可以将原始的 Docker 目录重命名,而不是直接删除。这是一个备份步骤,以防出现意外情况。

    1
    sudo mv /var/lib/docker /var/lib/docker.old
  4. 创建符号链接

    创建一个符号链接,将 /var/lib/docker 指向新的数据目录 /home/app/docker。这样,Docker 会继续在 /var/lib/docker 路径下查找数据目录,但实际上数据已经被存储在新的位置。

    1
    sudo ln -s /home/app/docker /var/lib/docker
  5. 启动 Docker 服务

    最后,重新启动 Docker 服务,使所有更改生效。

    1
    sudo systemctl start docker

验证迁移

迁移完成后,你可以验证 Docker 是否在新的位置正常运行。运行以下命令,查看 Docker 根目录:

1
sudo docker info | grep "Docker Root Dir"

输出应显示新的 Docker 根目录 /home/app/docker

总结

通过创建符号链接,你可以将 Docker 数据目录迁移到新的位置,而无需修改 Docker 配置文件。这种方法简单,但仍要确保 Docker 已停止、数据已完整复制,并在验证完成前保留旧目录。

迁移完成后,Docker 将使用新的数据目录存储数据。请确保新的数据目录已存在,并且有足够的磁盘空间。