迁移原因:磁盘根目录满了,通过命令du -h --max-depth=1发现/var/lib/docker占用的空间过大

把 Docker 的 root 目录(默认 /var/lib/docker)迁移到新位置,同时完整保留已有镜像、容器、卷,只需 4 步,零 downtime(Docker ≥ 20.10 验证可行):

准备新磁盘(示例挂载到 /data/docker

sudo mkdir -p /data/docker
# 如果是一块新盘,先格式化并挂载,这里不再展开

1. 停止 Docker 服务

sudo systemctl stop docker

2. 迁移现有数据(保留权限、硬链接)

# 用 rsync 比 cp 安全,可断点续传
sudo rsync -aP /var/lib/docker/ /data/docker/

-a = 保留权限、时间戳、软硬链接;-P = 进度+断点续传。
数据量大可先做第一次全量,再停 Docker 做第二次增量(几十秒)。

比较是否迁移完成

find /var/lib/docker -type f -print0 | xargs -0 stat -c '%s' | awk '{s+=$1} END {print s}'

find /data/docker -type f -print0 | xargs -0 stat -c '%s' | awk '{s+=$1} END {print s}'

3. 让 Docker 使用新目录

新建或修改 /etc/docker/daemon.json(没有就新建):

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

4. 重新加载 & 启动

sudo systemctl daemon-reload
sudo systemctl start docker

5. 验证

docker info | grep -i 'docker root dir'
# 输出应为 Docker Root Dir: /data/docker
docker images | head      # 确认镜像都在
docker ps -a              # 确认容器都在

6. 确认无误后回收旧空间

sudo du -sh /var/lib/docker   # 看是否还有新写入
sudo rm -rf /var/lib/docker   # 确认上面目录已空再删

一条命令总结(全量迁移脚本)

sudo systemctl stop docker \
&& sudo rsync -aP /var/lib/docker/ /data/docker/ \
&& sudo mkdir -p /etc/docker \
&& echo '{"data-root":"/data/docker"}' | sudo tee /etc/docker/daemon.json \
&& sudo systemctl daemon-reload \
&& sudo systemctl start docker

注意事项

  1. 别用 cp -r,会丢硬链接,导致层校验失败。

  2. SELinux 系统 需重新打标签

    sudo restorecon -R /data/docker
  3. Docker Desktop (Win/Mac) 改法不同,本条仅针对 Linux 引擎。

迁移完即可正常 docker pull/run/build原有镜像、容器、卷、网络全部保留


关注公众号“码农闲聊室”,解锁更多避坑指南

更多推荐