Appearance

Docker数据迁移

geekbing2023-08-02Dockerdocker

背景

安装 Docker 后,所有数据默认存放在/var/lib/docker

包括镜像,容器,网络,卷和插件等的数据都存储在这个目录下

/var/lib/docker所在分区下存储空间不够,需要将/var/lib/docker 所有数据转移到其他分区

简介

/var/lib/docker/ 目录中包括以下几个重要的子目录:

containers/:这个目录包含了所有运行和停止的容器的数据

image/:这个目录包含了所有的 Docker 镜像

volumes/:这个目录包含了所有的 Docker 卷,这些卷可以被容器用来存储数据

network/:这个目录包含了 Docker 的网络配置信息

overlay2/:这个目录是默认的存储驱动器,用于存储容器的文件系统

操作步骤

前置条件

环境 CentOS7

安装rsync

sudo yum install rsync -y

rsync可以在复制过程中保留文件的权限和所有权,并且如果复制过程中断,它可以从中断点继续

新建迁移目录/data/dockerRootDir

sudo mkdir dockerRootDir               # 创建新的目录
sudo chown root:root dockerRootDir     # 设置目录的所有者为root,组为root
sudo chmod 0710 dockerRootDir          # 设置目录的权限为0710

停止 Docker 服务Docker在运行时会持续地读写其数据目录,所以在开始迁移之前,你需要停止Docker服务。你可以使用以下命令来停止Docker服务

停止Docker服务

sudo systemctl stop docker

如果Docker容器的启动策略为always,先将启动策略设置为no,再停止Docker服务

container1代表你的容器 ID 或名称

sudo docker update --restart=always container1

使用 rsync 迁移数据:你可以使用以下命令来使用 rsync 将数据从 /var/lib/docker 复制到 /data/dockerRootDir

sudo rsync -aP /var/lib/docker/ /data/dockerRootDir/

-P--partial --progress 的缩写,它可以显示进度信息,还可以在复制被中断时恢复复制。在 rsync 命令中,-a 选项表示以递归方式复制文件和目录,同时保留链接,文件权限,文件所有权和时间戳

确认数据已经复制到新的位置:在复制完成之后,你应该确认数据已经成功复制到新的位置。你可以使用以下命令来列出 /data/dockerRootDir 下的文件和目录:

sudo ls /data/dockerRootDir

这个命令应该显示出与 /var/lib/docker 相同的文件和目录

重命名原来的 Docker 数据目录:为了防止在新的数据目录设置成功之前意外启动Docker导致数据混乱,你可以将原来的Docker数据目录重命名:

sudo mv /var/lib/docker /var/lib/docker.bak

更改 Docker 配置:然后,你需要更新Docker的配置,使其使用新的数据目录。你可以通过编辑 /etc/docker/daemon.json 文件来完成这个操作。如果该文件不存在,你需要创建它。你可以使用以下命令来打开这个文件(如果文件不存在,该命令会创建新文件):

sudo vim /etc/docker/daemon.json

然后,将以下内容写入文件中:

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

然后,保存并关闭文件。

启动 Docker 服务:最后,你需要启动Docker服务使新的设置生效。你可以使用以下命令来启动Docker服务:

sudo systemctl start docker

现在,Docker应该会使用 /data/dockerRootDir 作为其数据目录。你可以使用 docker info 命令确认 Docker Root Dir 的值已经变为新的目录。

image-20230802175148583

如果Docker Root Dir 的值不是 /data/dockerRootDir

找到Docker的进程 ID。你可以使用 ps 命令来列出所有的进程,并使用 grep 命令来过滤出 Docker 的进程:

ps aux | grep dockerd

这条命令会列出所有包含 dockerd的进程。你可以在输出的第二列中找到Docker的进程 ID。

杀掉Docker的进程。你可以使用 kill 命令来杀掉 Docker 的进程:

sudo kill -9 [Docker的进程ID]

再使用 docker info 命令确认 Docker Root Dir 的值已经变为 /data/dockerRootDir

删除原来的 Docker 数据目录:一旦确认新的数据目录工作正常,你可以删除原来的Docker数据目录以节省空间:

sudo rm -rf /var/lib/docker.bak

注意:这一步是可选的,你也可以保留原来的数据目录作为备份。

后记

迁移了Docker数据目录,那么不会影响已启动容器的挂载目录

容器的挂载目录是相对于Docker守护进程的数据目录(默认是/var/lib/docker

当你移动数据目录更改了Docker的配置以使用新的数据目录,Docker守护进程将能够正确地找到所有的镜像,容器和卷,包括他们的挂载目录

上次更新 3/31/2024, 6:29:32 AM