Docker数据迁移
背景
安装 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
的值已经变为新的目录。
如果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
守护进程将能够正确地找到所有的镜像,容器和卷,包括他们的挂载目录