Docker数据迁移的官方标准方法探究
如何安全迁移Docker的/var/lib/docker数据目录(官方推荐方法)
太懂这种找不到官方标准方法的抓狂了!Docker明明应用得这么广泛,但迁移/var/lib/docker数据目录的官方步骤确实藏得有点深,之前用mv加软链接的方法现在确实不被官方推荐了。我整理了几种被广泛认可、接近官方标准的方法,亲测靠谱:
方法一:修改Docker配置文件(官方首推)
这是Docker官方现在最推荐的方式,直接通过配置指定新的数据根目录,步骤清晰且稳定:
- 第一步:先彻底停止Docker相关服务,避免数据损坏
sudo systemctl stop docker sudo systemctl stop docker.socket containerd - 第二步:把现有Docker数据复制到新路径(比如我这里用
/data/docker作为新目录,你可以换成自己的路径)
用rsync比直接mv更安全,能保留文件权限,还能在中途中断后续传:sudo rsync -avx /var/lib/docker/ /data/docker/ - 第三步:备份并修改Docker配置文件
先备份原配置(如果daemon.json不存在就跳过备份):
编辑sudo cp /etc/docker/daemon.json /etc/docker/daemon.json.bakdaemon.json(不存在就新建),添加data-root字段指定新路径:{ "data-root": "/data/docker" }注意:旧版本Docker(17.06之前)用的是
graph字段,新版本统一用data-root - 第四步:启动Docker服务并验证
运行sudo systemctl start dockerdocker info,查看输出里的Docker Root Dir是否是新路径;再跑个测试容器确认正常:docker run hello-world - 第五步:确认没问题后,删除旧的Docker数据目录(可选)
sudo rm -rf /var/lib/docker
方法二:使用systemd挂载点(适合动态调整场景)
如果你的场景需要灵活切换数据目录,或者不想修改Docker核心配置,用systemd的绑定挂载也是官方认可的方案:
- 第一步:同样先停止Docker相关服务
sudo systemctl stop docker docker.socket containerd - 第二步:复制数据到新路径
sudo rsync -avx /var/lib/docker/ /data/docker/ - 第三步:重命名旧目录(避免冲突)
sudo mv /var/lib/docker /var/lib/docker.old - 第四步:创建systemd挂载单元文件
新建/etc/systemd/system/var-lib-docker.mount,内容如下:[Unit] Description=Mount Docker Data Directory Before=docker.service [Mount] What=/data/docker Where=/var/lib/docker Type=none BindOptions=bind,rw [Install] WantedBy=multi-user.target - 第五步:重载systemd配置并启用挂载
sudo systemctl daemon-reload sudo systemctl enable --now var-lib-docker.mount - 第六步:启动Docker服务并验证
同样用sudo systemctl start dockerdocker info和测试容器确认正常后,就可以删除旧目录了:sudo rm -rf /var/lib/docker.old
关键注意事项
- 务必先停止Docker服务:在操作数据目录前,一定要确保所有Docker相关进程都停掉,否则会导致数据损坏
- 优先用rsync复制数据:不要直接用
mv,万一操作失误或者中途中断,rsync可以快速恢复 - 操作前备份数据:可以用
tar打包旧目录做备份,避免意外:sudo tar czf docker-backup-$(date +%Y%m%d).tar.gz /var/lib/docker - 新路径的权限要正确:确保新目录的所有者是
root,权限为700,否则Docker可能无法读写数据
内容的提问来源于stack exchange,提问作者Collin Chaffin
相关产品推荐
相关产品推荐

