Docker数据目录迁移
将 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 -a 和 docker images 确认原有的容器和镜像是否完好无损。
5. 清理旧数据(可选)
在确认新目录下的 Docker 运行完全正常后,你可以删除旧目录以释放根分区的空间:
sudo rm -rf /var/lib/docker
💡 温馨提示
SELinux 用户注意:如果你的系统开启了 SELinux,迁移后可能需要为新目录重新打上安全标签,可以执行
sudo restorecon -R /data/docker。数据完整性:使用
rsync -a能够最大程度保留 Docker 运行所需的文件权限和硬链接,切勿直接使用cp -r,否则可能导致镜像层校验失败。