1、迁移目标
将 Docker 的默认存储目录(通常是 /var/lib/docker)从旧磁盘迁移到新挂载的磁盘(例如您刚挂载的 /data 目录)。
2、前提条件
新磁盘(如 /dev/sdb1)已经格式化并挂载到了某个目录,例如 /data。
确认 Docker 当前的使用状态和存储路径。
详细步骤
第一步:确认当前 Docker 状态和存储目录
查看 Docker 当前使用的存储目录:
sudo docker info | grep "Docker Root Dir"
输出通常是:Docker Root Dir: /var/lib/docker
停止 Docker 服务:
这是最关键的一步,必须确保 Docker 完全停止,否则数据会损坏。
sudo systemctl stop docker
同时停止 containerd(如果有)
sudo systemctl stop containerd
验证是否停止:
sudo systemctl status docker
第二步:同步数据到新位置
我们使用 rsync 来同步数据,因为它能保留所有文件权限和属性,这对于 Docker 至关重要。
使用 rsync 复制数据(假设新挂载点是 /data):
sudo rsync -avxP /var/lib/docker/ /data/docker/
-a:归档模式,保留所有属性(权限、所有权、时间戳等)
-v: verbose,显示详细过程
-x:保持文件系统边界,不跨越不同文件系统
-P:显示进度,并支持断点续传
这个过程可能需要一段时间,取决于 /var/lib/docker 的大小。
第三步:备份并修改 Docker 配置
我们需要告诉 Docker 使用新的存储位置。
备份原有的 Docker 目录(重命名而不是删除,以防万一):
sudo mv /var/lib/docker /var/lib/docker.bak
创建软链接(Symbolic Link)【推荐方法】:
创建一个指向新位置的软链接:
sudo ln -s /data/docker /var/lib/docker
验证软链接:
ls -l /var/lib | grep docker
应该看到类似 docker -> /data/docker 的输出。
或者:修改 daemon.json 配置文件【可选方法】:
编辑 Docker 的配置文件:
sudo nano /etc/docker/daemon.json
如果文件不存在,就创建一个。添加以下内容(指定新的数据路径):
json
{
"data-root": "/data/docker"
}
保存并退出。
说明:两种方法任选其一即可。创建软链接更简单直观,与系统耦合度低;修改配置文件是 Docker 官方支持的方式。我个人更常用软链接方法。
第四步:重启 Docker 并验证
启动 Docker 服务:
sudo systemctl start docker
sudo systemctl start containerd
验证 Docker 服务状态和新存储路径:
sudo systemctl status docker # 确保状态是 active (running)
sudo docker info | grep "Docker Root Dir" # 确认新的路径是否正确
如果使用软链接,这里显示的还是 /var/lib/docker,但它实际指向了 /data/docker。
如果使用修改 daemon.json 的方法,这里会直接显示 Docker Root Dir: /data/docker。
验证容器和镜像是否完好:
sudo docker images # 查看所有镜像是否都在
sudo docker ps -a # 查看所有容器(包括已停止的)是否都在
尝试启动一个之前的容器进行测试:
sudo docker start <container_name_or_id>
sudo docker ps # 查看是否运行成功
第五步:清理旧数据(确认无误后)
非常重要: 只有在确认 Docker 在新位置运行完全正常,所有容器、镜像、数据卷都正确无误后,才能执行这一步。
删除之前备份的旧数据
sudo rm -rf /var/lib/docker.bak
总结:操作流程一览表
步骤 命令 说明
- 确认状态 docker info | grep "Docker Root Dir" 查看当前存储路径
- 停止服务 systemctl stop docker containerd 必须停止,防止数据损坏
- 同步数据 rsync -avxP /var/lib/docker/ /data/docker/ 保留权限复制数据
- 备份旧目录 mv /var/lib/docker /var/lib/docker.bak 安全起见,先重命名
- 创建软链 ln -s /data/docker /var/lib/docker 让系统认为新目录就是老地方
- 重启验证 systemctl start docker 启动服务
docker images docker ps -a 检查所有数据是否完好 - 清理 rm -rf /var/lib/docker.bak 最终确认无误后再删除
按照这个流程,您可以安全无损地将 Docker 的整个运行环境迁移到新的磁盘上,所有服务、容器、镜像、网络和卷配置都会得到保留。