Docker实战系列之Root目录迁移指南:单机环境下的完整实践

Docker实战系列之Root目录迁移指南:单机环境下的完整实践

引言

在使用 Docker 的过程中,有时我们需要将 Docker 的 root 目录(通常包含所有容器、镜像和卷数据)迁移到新的位置。这可能是因为:

  • 系统磁盘空间不足,需要将 Docker 数据移到更大的存储设备
  • 想要将 Docker 数据存储在特定的高速存储设备上
  • 系统重装或迁移需要保留 Docker 数据
  • 性能优化,需要将 Docker 数据放在不同的文件系统上

本文将详细介绍在单机环境下如何安全地迁移 Docker root 目录。

查看当前 Docker Root 目录

首先,我们需要确认当前 Docker root 目录的位置。可以通过以下几种方式查看:

使用 docker info 命令

bash 复制代码
docker info | grep "Docker Root Dir"

默认情况下,Docker root 目录通常位于 /var/lib/docker。

迁移前的准备工作

在开始迁移之前,请确保:

  1. 备份重要数据:虽然迁移过程相对安全,但备份仍然是必要的
  2. 停止所有容器:确保没有正在运行的容器
  3. 停止 Docker 服务
bash 复制代码
# 停止所有运行中的容器
docker stop $(docker ps -q)

# 停止 Docker 服务
sudo systemctl stop docker

Docker Root 目录迁移步骤

步骤 1:创建新的 Docker Root 目录

假设我们要将 Docker root 目录迁移到 /mnt/docker-data:

bash 复制代码
# 创建目标目录
sudo mkdir -p /mnt/docker-data

# 设置正确的权限(通常为 root 用户)
sudo chown root:root /mnt/docker-data
sudo chmod 755 /mnt/docker-data

步骤 2:复制现有 Docker 数据

使用 rsync 进行数据复制,确保保留所有权限和属性:

bash 复制代码
# 复制 Docker 数据(假设原目录为 /var/lib/docker)
sudo rsync -avz /var/lib/docker/ /mnt/docker-data/

复制完成后,验证数据完整性:

bash 复制代码
# 比较两个目录的大小
du -sh /var/lib/docker
du -sh /mnt/docker-data

步骤 3:配置 Docker 使用新的 Root 目录

方法一:修改 daemon.json 配置文件
bash 复制代码
# 创建或编辑 /etc/docker/daemon.json
sudo tee /etc/docker/daemon.json > /dev/null <<EOF
{
  "data-root": "/mnt/docker-data"
}
EOF
方法二:修改 systemd 服务文件

如果不使用 daemon.json,也可以直接修改 systemd 服务文件:

bash 复制代码
# 编辑 Docker 服务文件
sudo systemctl edit docker

在编辑器中添加:

ini 复制代码
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd --data-root=/mnt/docker-data

步骤 4:重启 Docker 服务

bash 复制代码
# 重新加载 systemd 配置
sudo systemctl daemon-reload

# 启动 Docker 服务
sudo systemctl start docker

# 验证服务状态
sudo systemctl status docker

步骤 5:验证迁移结果

bash 复制代码
# 检查 Docker root 目录是否已更改
docker info | grep "Docker Root Dir"

# 验证现有镜像和容器是否仍然可用
docker images
docker ps -a

# 测试创建新容器
docker run --rm hello-world

清理工作

迁移成功后,可以删除旧的 Docker 目录:

bash 复制代码
# 谨慎操作!确保新目录工作正常后再删除
sudo rm -rf /var/lib/docker
相关推荐
xixiaoyunya7 小时前
虚拟机备份怎么做:镜像级与文件级搭配的完整实操方案
linux·运维·网络
阿明68 小时前
进程替换【Linux】
linux·运维·服务器
sunoo-2298 小时前
【嵌入式Linux驱动学习】Day1-Day2 全流程梳理:环境搭建→U-Boot→内核→根文件系统→驱动基础
linux·运维·驱动开发·笔记·学习·阿里云·恩智浦
YonyouHRSaaS8 小时前
从安全、信创、运维三方面看,人力资源管理系统哪种部署方式更适合企业HR?
运维·安全·hr系统·人力资源管理系统·hr saas·人事管理系统
倔强的石头1069 小时前
【Linux指南】动静态库系列(十二):库工程发布与错误排查:从能跑到可维护
linux·运维·服务器
wdfk_prog9 小时前
LWIP教程 03:从 `low_level_input()` 到 `pbuf_free()`——`pbuf` 的数据视图、Chain 与引用计数
运维·网络·笔记·学习
掉进电商坑三年没爬出来的东叔9 小时前
云服务器搭建个人网站实战:从零到公网访问,含域名HTTPS
运维·服务器·https
IT大白鼠9 小时前
彭大帅的AI运维助手跨出 Linux:全面接管 Windows 服务器
运维·服务器·人工智能
reasonsummer9 小时前
【办公类-131-05】20261007中2班周计划制作(原资料Word单元格不统一 失败)
运维·服务器
Mikko710 小时前
JVM 线上排查实战(六):JFR 怎么用?JDK 8 要不要加 UnlockCommercialFeatures、jfr 命令在哪、录的文件为什么读不了
java·运维·jvm·后端