Docker 数据目录迁移的方法步骤

 更新时间:2026年08月04日 09:34:49   作者:tianyu234  
本文提供了在不同 Linux 发行版上将 Docker 数据目录迁移至新位置的详细指南,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
项目说明
适用系统所有使用 systemd 的 Linux 发行版(Ubuntu、Debian、CentOS、RHEL、Fedora、openSUSE 等)
验证环境Ubuntu 22.04 / 24.04 LTS
迁移场景将 Docker 数据目录从旧位置迁移到新位置
涉及服务docker.service、docker.socket
注意事项迁移前需停止 Docker 及 socket 激活单元,避免数据损坏

非 systemd 系统说明:对于使用 SysV init 的旧版系统(如 CentOS 6),请将 systemctl stop docker 替换为 service docker stop,并跳过 docker.socket 相关步骤(socket 激活机制仅在 systemd 中使用)。

一、背景说明

Docker 默认将数据存储在 /var/lib/docker。当系统盘空间不足时,需要将数据迁移到容量更大的分区或目录。本文档提供完整的迁移步骤,涵盖两种常见场景:

场景迁移路径说明
场景A(最常见)/var/lib/docker → /data/docker_new从系统盘默认位置迁移到数据盘或大容量分区
场景B(子目录迁移)/data/docker → /data/docker/docker在已有自定义目录下调整子目录层级

二、迁移前准备

2.1 确认当前数据目录

docker info | grep "Docker Root Dir"

示例输出:

Docker Root Dir: /var/lib/docker   # 场景A
# 或
Docker Root Dir: /data/docker      # 场景B

2.2 确认新目录位置

根据你的需求,决定新目录位置:

  • 场景A(最常见):/var/lib/docker → /data/docker_new(新目录在旧目录外部)
  • 场景B(子目录迁移):/data/docker → /data/docker/docker(新目录在旧目录内部)

2.3 备份 Docker 配置

sudo cp /etc/docker/daemon.json /etc/docker/daemon.json.bak

三、停止 Docker 服务

3.1 停止 docker.service 和 docker.socket

Docker 使用了 socket 激活机制(docker.socket),即使停止 docker.service,当有客户端通过 /var/run/docker.sock 发起请求时,systemd 会自动重启服务。

因此,必须同时停止 docker.socket:

sudo systemctl stop docker
sudo systemctl stop docker.socket

非 systemd 系统:执行 sudo service docker stop 即可,无需处理 socket。

3.2 验证服务状态

sudo systemctl status docker docker.socket

两者均应显示 inactive (dead)。

3.3 关于警告信息的说明

如果只执行 sudo systemctl stop docker,可能会看到以下警告:

Stopping 'docker.service', but its triggering units are still active:
docker.socket

这不是错误,而是 systemd 的提示,说明 docker.socket 仍处于激活状态,可能会在连接请求时唤醒 docker.service。因此,必须执行 sudo systemctl stop docker.socket 彻底停止。

四、创建新目录

# 场景A(最常见):新目录在旧目录外部
sudo mkdir -p /data/docker_new

# 场景B(子目录迁移):新目录在旧目录内部
sudo mkdir -p /data/docker/docker

五、迁移数据

5.1 使用 rsync(推荐,支持断点续传)

# 场景A:/var/lib/docker → /data/docker_new
sudo rsync -avxP /var/lib/docker/ /data/docker_new/

# 场景B:/data/docker → /data/docker/docker
sudo rsync -avxP /data/docker/ /data/docker/docker/

参数说明:

  • -a:归档模式,保留权限、时间戳等
  • -v:详细输出
  • -x:不跨文件系统
  • -P:显示进度并支持断点续传

5.2 使用 mv(快速,无额外空间占用)

# 场景A:直接移动整个目录
sudo mv /var/lib/docker /data/docker_new

# 场景B:先移动非隐藏文件,再移动隐藏文件
sudo mv /data/docker/* /data/docker/docker/ 2>/dev/null
sudo mv /data/docker/.[!.]* /data/docker/docker/ 2>/dev/null

注意:

  • 2>/dev/null 用于忽略“没有匹配文件”的提示
  • 场景B中隐藏文件(以 . 开头)需要单独移动

六、修改 Docker 配置

编辑 /etc/docker/daemon.json:

sudo vi /etc/docker/daemon.json

修改 data-root 为新目录路径:

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

如果还有其他配置(如镜像源、日志限制),保留不变。

七、启动 Docker 并验证

7.1 启动服务

sudo systemctl start docker

非 systemd 系统:执行 sudo service docker start。

7.2 验证数据目录

docker info | grep "Docker Root Dir"

应输出新路径。

7.3 验证容器和镜像

docker ps -a
docker images

确认原有容器和镜像均正常显示。

八、删除旧数据

⚠️ 请务必确认新目录数据完整、Docker 正常运行后,再执行删除操作。

8.1 场景A(最常见):新目录在旧目录外部(如/data/docker_new)

由于新目录与旧目录相互独立,直接删除旧目录即可:

# 先确认要删除的目录路径
ls -la /var/lib/docker

# 确认无误后删除
sudo rm -rf /var/lib/docker

说明:由于 Docker 默认目录权限为 root:root,删除时需使用 sudo。

8.2 场景B(子目录迁移):新目录在旧目录内部(如/data/docker/docker)

由于新目录是旧目录的子目录,不能直接删除旧目录,需使用 find 排除新目录:

# 进入旧目录
cd /data/docker

# 查看即将删除的内容(确认要删除的文件/目录)
sudo find . -maxdepth 1 ! -name "." ! -name "docker" -printf "%p\n"

# 确认无误后,执行删除
sudo find . -maxdepth 1 ! -name "." ! -name "docker" -exec rm -rf {} \;

分步说明:

  1. -maxdepth 1:只处理当前目录下的直接内容
  2. ! -name ".":排除当前目录自身
  3. ! -name "docker":排除新目录 docker
  4. -printf "%p\n":打印将要删除的内容(用于确认)
  5. -exec rm -rf {} \;:删除匹配的内容

8.3 删除后验证

# 场景A
ls -la /var/lib/docker   # 目录应不存在或为空

# 场景B
ls -la /data/docker      # 应只剩 docker 子目录
ls -la /data/docker/docker   # 应包含完整数据

九、完整迁移流程速查

场景A(最常见):/var/lib/docker→/data/docker_new

# 1. 停止服务
sudo systemctl stop docker
sudo systemctl stop docker.socket

# 2. 创建新目录
sudo mkdir -p /data/docker_new

# 3. 迁移数据
sudo rsync -avxP /var/lib/docker/ /data/docker_new/

# 4. 修改配置
sudo vi /etc/docker/daemon.json   # data-root: /data/docker_new

# 5. 启动验证
sudo systemctl start docker
docker info | grep "Docker Root Dir"

# 6. 确认无误后删除旧目录
ls -la /var/lib/docker   # 确认
sudo rm -rf /var/lib/docker

场景B(子目录迁移):/data/docker→/data/docker/docker

# 1. 停止服务
sudo systemctl stop docker
sudo systemctl stop docker.socket

# 2. 创建新目录
sudo mkdir -p /data/docker/docker

# 3. 迁移数据
sudo rsync -avxP /data/docker/ /data/docker/docker/

# 4. 修改配置
sudo vi /etc/docker/daemon.json   # data-root: /data/docker/docker

# 5. 启动验证
sudo systemctl start docker
docker info | grep "Docker Root Dir"

# 6. 确认无误后删除旧数据(排除新目录)
cd /data/docker
sudo find . -maxdepth 1 ! -name "." ! -name "docker" -printf "%p\n"   # 确认
sudo find . -maxdepth 1 ! -name "." ! -name "docker" -exec rm -rf {} \;

十、常见问题排查

问题原因解决方案
docker info 显示旧路径配置未生效检查 daemon.json 格式,重启 Docker
迁移后容器丢失数据未完全同步或路径错误检查 rsync 命令是否完整,确认新旧路径正确
rm -rf 误删新目录通配符展开了新目录场景B使用 find 排除方法
Docker 启动失败daemon.json 语法错误检查 JSON 格式(逗号、引号)
迁移后磁盘空间未释放旧数据仍在确认删除操作已执行
no space left on device迁移时空间不足使用 mv 代替 rsync,或先清理旧镜像

附录 A:非 systemd 系统操作差异

对于不使用 systemd 的旧版 Linux 系统(如 CentOS 6、Debian 7 等),请参考以下替换命令:

操作systemd 命令SysV init 命令
停止 Dockersudo systemctl stop dockersudo service docker stop
停止 socketsudo systemctl stop docker.socket跳过(无此概念)
启动 Dockersudo systemctl start dockersudo service docker start
查看状态sudo systemctl status dockersudo service docker status

其他命令(如 rsync、mv、find、rm)在所有 Linux 发行版中通用,不受 init 系统影响。

附录 B:权限与路径说明

路径默认属主说明
/var/lib/dockerroot:rootDocker 默认数据目录
/data/docker_newroot:root新数据目录(迁移后)
/etc/docker/daemon.jsonroot:rootDocker 配置文件

新目录创建后,rsync 会自动同步原目录的权限属主,无需手动调整。

 到此这篇关于Docker 数据目录迁移的方法步骤的文章就介绍到这了,更多相关Docker 目录迁移内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • PIP安装docker-compose超时问题解决方案

    PIP安装docker-compose超时问题解决方案

    这篇文章主要介绍了PIP安装docker-compose超时问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Docker下安装Mongo4.2及客户端工具连接Mongo

    Docker下安装Mongo4.2及客户端工具连接Mongo

    这篇文章主要介绍了Docker下安装Mongo4.2和客户端工具连接Mongo数据库的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-01-01
  • 同一宿主机内不同docker间通讯的实现示例

    同一宿主机内不同docker间通讯的实现示例

    本文主要介绍了同一宿主机内不同docker间通讯的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-11-11
  • 使用Docker时内存占用过高的解决方案

    使用Docker时内存占用过高的解决方案

    在使用 Docker 进行容器化部署时,内存占用过高是一个常见问题,当服务器内存被耗尽时,会导致系统性能下降,甚至可能导致服务宕机,本文将介绍如何排查和解决 Docker 环境下的内存占用问题,需要的朋友可以参考下
    2024-12-12
  • docker部署nginx访问宿主机服务并使用缓存的操作方法

    docker部署nginx访问宿主机服务并使用缓存的操作方法

    这篇文章主要介绍了docker部署nginx访问宿主机服务并使用缓存的操作方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,感兴趣的朋友一起看看吧
    2024-04-04
  • 如何使用 Dockerfile 创建一个简单容器

    如何使用 Dockerfile 创建一个简单容器

    这篇文章主要介绍了如何使用 Dockerfile 创建一个简单容器,Dockerfile 是用于指导 docker 创建自定义 image 的一系列指令,是用于创建 image 的蓝图,下文更多详细介绍需要的小伙伴可以参考一下
    2022-04-04
  • docker在win10家庭版下构建laravel开发环境的教程详解

    docker在win10家庭版下构建laravel开发环境的教程详解

    这篇文章主要介绍了docker在win10家庭版下构建laravel开发环境,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • docker如何安装doris

    docker如何安装doris

    文章介绍了使用Docker安装Apache Doris的两种方法:通过Docker Compose部署和手动部署,前者通过创建`docker-compose.yml`文件并运行命令来启动集群,后者则需要手动拉取镜像、启动容器、复制安装包并解压、配置并启动服务
    2025-02-02
  • Docker快速搭建Kafka集群及测试的技术指南

    Docker快速搭建Kafka集群及测试的技术指南

    Kafka是一款高吞吐量的分布式消息系统,配合Zookeeper可实现集群化部署,本文将通过Docker容器技术快速搭建3节点Kafka集群并完成消息生产消费测试,感兴趣的可以了解下
    2025-04-04
  • docker安装tomcat8的实现方法

    docker安装tomcat8的实现方法

    这篇文章主要介绍了docker安装tomcat8的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02

最新评论