docker迁移root目录
·
迁移原因:磁盘根目录满了,通过命令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
注意事项
-
别用
cp -r,会丢硬链接,导致层校验失败。 -
SELinux 系统 需重新打标签
sudo restorecon -R /data/docker -
Docker Desktop (Win/Mac) 改法不同,本条仅针对 Linux 引擎。
迁移完即可正常 docker pull/run/build,原有镜像、容器、卷、网络全部保留。
关注公众号“码农闲聊室”,解锁更多避坑指南
更多推荐


所有评论(0)