摘要:大家在Linux上用Docker部署项目的时候,有时候会部署多个项目,系统盘空间不足,数据盘又挂载有很多空间,这时候就会想要将 Docker 镜像和容器数据迁移到数据盘,本文主要讲解迁移步骤和迁移过程中遇到的一些坑,记录给大家避免再次入坑。
1.Docker基础知识
Docker 是一种容器化平台,可用于将应用程序及其所有依赖项打包到一个标准化的单元中,从而实现快速部署、可移植性和可扩展性。以下是一些 Docker 的基础知识:
(1)容器: Docker 使用容器来打包应用程序及其所有依赖项,包括运行时、系统库、环境变量等。容器是一个独立、可执行的软件包,可以在任何支持 Docker 的环境中运行。
(2)镜像: 镜像是容器的基础,它包含了一个应用程序运行所需的所有文件系统内容、运行时、库和环境变量。镜像是只读的,可用于创建容器实例。
(3)Docker 引擎: Docker 引擎是一个客户端-服务器应用程序,用于创建和管理 Docker 容器。它包括一个守护进程(服务器)和一个 CLI(客户端),通过 REST API 与守护进程通信。
(4)Dockerfile: Dockerfile 是一个文本文件,其中包含一系列指令,用于自动化创建 Docker 镜像。通过 Dockerfile,可以定义容器的环境、运行时设置和启动命令等信息。
(5)Docker 镜像仓库: Docker 镜像仓库是用于存储和分享 Docker 镜像的地方。Docker Hub 是 Docker 官方提供的公共镜像仓库,还有一些私有的镜像仓库,如 Docker Trusted Registry(DTR)等。
(6)Docker 容器网络: Docker 容器可以在自己的网络命名空间中运行,每个容器都有自己的 IP 地址,并且可以与其他容器和主机通信。Docker 提供了多种网络模式,如桥接、主机模式、容器模式等,以满足不同场景下的网络需求。
(7)Docker Volume: Docker Volume 是一种用于持久化数据的机制,它可以在容器之间共享数据,并且在容器被删除后数据仍然保留。可以使用 Docker CLI 或 Docker Compose 来管理 Volume。
(8)Docker Compose: Docker Compose 是一个用于定义和运行多个 Docker 容器的工具,通过一个 YAML 文件来配置应用程序的服务、网络和卷等信息,并且可以一键启动、停止和管理整个应用程序。
以上是 Docker 的一些基础知识,希望能帮助你了解 Docker 的基本概念和用法。
2.将 Docker 镜像和容器数据迁移到数据盘
2.1 操作具体步骤
如果您的 Linux 系统盘空间不足,并且想要将 Docker 镜像和容器数据迁移到数据盘,可以按照以下步骤进行操作:
-
停止 Docker 服务:在迁移数据之前,需要停止 Docker 服务。
bash
sudo systemctl stop docker
-
备份数据:为了安全起见,建议在迁移之前备份当前的数据。
bash
sudo rsync -a /var/lib/docker /mnt/data/docker-data
这里的
/var/lib/docker
是默认的 Docker 数据存储目录,您需要将其替换为实际的 Docker 数据目录(如果之前已经更改过)。/mnt/docker-data
是新的数据盘挂载点。 -
修改 Docker 配置:根据您使用的 Docker 版本,选择使用
"graph"
或"data-root"
配置项。如果您使用的是 Docker 17.05.0 或更高版本,使用以下配置:json
{ "data-root": "/mnt/data/docker-data" }
将上述内容保存到
/etc/docker/daemon.json
文件中。 -
移动数据:如果您没有在步骤 2 中使用
rsync
进行备份,现在可以手动将数据移动到新的位置。由于已经使用rsync
备份,这里不再需要移动数据。 -
启动 Docker 服务:完成配置后,重新启动 Docker 服务。
bash
sudo systemctl start docker
-
验证迁移:检查 Docker 是否正确地使用新的数据目录,并验证镜像和容器是否正常运行。
bash
docker info | grep "Docker Root Dir"
这将显示 Docker 正在使用的根目录,应该与您设置的
"/mnt/docker-data"
匹配。 -
清理旧数据(可选):如果确认新数据目录一切正常,可以清理旧的数据目录以释放空间。
bash
sudo rm -rf /var/lib/docker
在执行这些操作时,请确保您有足够的权限,并且操作过程中不会影响到正在运行的服务。另外,迁移数据时,请确保新数据盘挂载点的文件系统格式是兼容 Docker 的,通常是 ext4 或 xfs。
请注意以下几点:
- 在操作之前,确保目标磁盘已经挂载并且有足够的可用空间。
- 如果您的系统正在运行重要的服务,请在迁移前做好充分备份,以防数据丢失。
- 在移动数据之后,可能需要重新启动 Docker 容器,因为它们可能还在使用旧的数据目录。
- 如果您的系统使用的是
overlay2
或其他特定的存储驱动,确保新磁盘的文件系统支持这些特性。 - 如果您在迁移过程中遇到问题,可以随时将数据复制回原来的位置,并恢复原来的配置。
2.2 常见问题1 daemon.json报错
1.1问题描述:修改完daemon后重启(命令:systemctl restart docker)docker报错,如下图所示
1.2问题分析:
上面的问题日志复制到百度和AI去寻找解决方案,常识各种办法去解决还是搞不定,心里贼难受,这时请教了一下办公室里的前辈(广西潘总),他分析说可能是我用的kimi大模型寻找答案踩坑了,然后把重启docker日志实时监听,于是找了以下命令打开另一个窗口执行:
sudo journalctl -u docker.service -f
然后再到原来窗口重启docker,重启命令:
sudo systemctl restart docker
好家伙,终于发现是Docker的配置报错了:无法使用文件 /etc/docker/daemon.json 配置 Docker 守护进程:以下指令与任何配置选项都不匹配:graph,如下图所示:
1.3解决方案:
查看了本人Linux服务器安装的Docker版本号,操作命令和查看如下图所示:
docker --version
我的docker版本号是18.03.1-ce ,大于或等于17.05.0,配置文件不能用graph,将daemon.json
{
"graph": "/mnt/data/docker-data"
}
graph参数名改成data -root
{
"data-root": "/mnt/data/docker-data"
}
然后重启docker,发现问题解决。
2.3 常见问题2 权限不足
1.1 问题描述:修改配置后重启docker,提示权限不足。
1.2 问题分析:操作必须要用原来安装docker的用户账号或者root最高权限用户操作,而且迁移目标确保路径正确,目录也需要授权。
1.3 解决方案:
切换root账号进行操作,切换命令如下,执行后输入root密码即可成功切换
su -
确保 /mnt/docker-data
目录存在并且具有正确的权限。你可以使用以下命令来检查和设置权限:
sudo mkdir -p /mnt/data/docker-data
sudo chown root:root /mnt/data/docker-data
sudo chmod 755 /mnt/data/docker-data
3. 将Docker容器镜像移动到另一个磁盘
在Linux系统中,如果你想要将Docker容器镜像移动到另一个磁盘,你可以按照以下步骤操作:
-
查找镜像ID: 首先,你需要找到你想要移动的Docker镜像的ID。可以使用以下命令列出所有镜像及其ID:
docker images
-
保存镜像为tar文件: 使用
docker save
命令将镜像保存为tar文件。例如,如果你的镜像ID是1234567890abcdef
,你可以使用以下命令:docker save 1234567890abcdef > /path/to/your/disk/mirror.tar
这里的
/path/to/your/disk/
是你想要保存tar文件的目标路径。 -
删除本地镜像(可选): 如果你不再需要在当前位置保留这个镜像,可以使用
docker rmi
命令删除它:docker rmi 1234567890abcdef
-
将tar文件移动到目标磁盘: 如果tar文件不在目标磁盘上,你可以使用
mv
命令将其移动:mv /path/to/current/disk/mirror.tar /path/to/your/disk/
-
在目标磁盘上加载镜像: 在目标磁盘上,使用
docker load
命令加载tar文件:docker load < /path/to/your/disk/mirror.tar
-
验证镜像: 使用
docker images
命令再次检查,确保镜像已经成功加载到Docker中。
请注意,这个过程不会移动容器的数据卷,如果你的容器有挂载的数据卷,你需要单独处理这些数据卷。另外,确保你有足够的权限来执行这些操作,并且在移动镜像之前停止并删除任何正在使用该镜像的容器。
如果你的Docker守护进程配置为使用特定的存储驱动,你可能需要确保目标磁盘支持该存储驱动,并且Docker守护进程有权限访问该磁盘。
总结
Linux系统上,若Docker镜像占满系统盘,可迁移至数据盘。首先,停止Docker服务,使用`systemctl stop docker`。接着,通过`rsync -a /var/lib/docker /path/to/new/disk/docker`命令将Docker数据同步到新盘。然后,编辑`/etc/docker/daemon.json`,将`"data-root"`设置为新路径。移动数据后,启动Docker服务,并验证新路径是否生效。确保新磁盘挂载且空间充足,迁移前后做好备份,以防数据丢失。迁移后可能需要重启容器,以使用新数据目录。
希望这篇博客能够为你在Docker镜像迁移过程中提供一些启发和指导。如果你有任何问题或需要进一步的建议,欢迎在评论区留言交流。让我们一起探索IT世界的无限可能!
博主还分享了本文相关文章,请各位大佬批评指正:
1、Intellij idea高效使用教程
2、AI编程工具合集
3、CodeGeeX一款基于大模型全能的智能编程助手
4、Git 代码提交注释管理规范
5、解释 Git 的基本概念和使用方式。
6、postman介绍、安装、使用、功能特点、注意事项
7、Windows10安装Docker Desktop(大妈看了都会)
8、02-pycharm详细安装教程(大妈看了都会)
9、01-Python详细安装教程(大妈看了都会)
10、2024年最新版IntelliJ IDEA下载安装过程(含Java环境搭建)