如何将Linux系统中的Docker目录(包括软链接)进行迁移?
摘要:✨Docker 目录介绍 在现代的容器化架构中,Docker 已经从一个单一的工具演变为一个多层级的架构。在 Linux 系统中,其核心数据分布在以下两个主要目录中: 1. varlibdocker (Docker Engine 管理
✨Docker 目录介绍
在现代的容器化架构中,Docker 已经从一个单一的工具演变为一个多层级的架构。在 Linux 系统中,其核心数据分布在以下两个主要目录中:
1. /var/lib/docker (Docker Engine 管理目录)
此目录是 Docker 守护进程(Docker Daemon)的高层管理空间,主要负责容器的生命周期管理、配置以及持久化存储。
Containers (容器元数据与日志):存储容器的配置文件(如 config.v2.json)、运行时状态以及容器的标准输出日志(stdout/stderr,通常为 JSON 格式)。
Volumes (卷数据):默认情况下,用户创建的命名卷(Named Volumes)数据存储在 volumes/ 子目录下。这是容器持久化数据的核心区域。
Image Metadata (镜像元数据):存储镜像的清单(Manifest)、层级关系索引以及本地标签信息,但不直接存储镜像的二进制文件系统层。
Buildkit (构建缓存):存储使用 Docker BuildKit 构建镜像时产生的中间缓存数据。
Network (网络配置):管理容器的虚拟网络(如 Bridge, Overlay, Macvlan)的配置及状态。
2. /var/lib/containerd (Containerd 运行时目录)
containerd 是一个工业标准的容器运行时(Container Runtime),Docker 目前将其作为底层的核心组件。该目录负责处理最底层的存储和执行逻辑。
Content (镜像层内容):存储实际拉取回来的压缩镜像层文件(Blobs)。这是镜像数据物理存在的真正位置。
Snapshotter (快照与文件系统):这是占用空间最大的部分(如 overlayfs)。它负责将压缩的镜像层解压并叠加,形成容器运行所需的根文件系统,并管理每个容器的可写层(Writable Layer)。
Metadata (元数据数据库):包含一个 BoltDB 或类似的数据库,用于记录镜像内容、快照以及命名空间(Namespaces)之间的关联。
IO Management:管理容器进程的输入输出流。
为什么要同时迁移这两个目录?
在早期的 Docker 版本中,镜像存储直接位于 /var/lib/docker/overlay2。但在现代架构中,Docker 将底层存储和运行委派给了 containerd:
分工明确:/var/lib/docker 负责上层的业务逻辑(如卷管理、网络编排),而 /var/lib/containerd 负责底层的大规模二进制文件存储。
空间分布:大部分的磁盘占用来自于 containerd 的镜像快照和层数据。仅迁移 docker 目录通常无法解决根分区爆满的问题。
一致性:通过软链接或挂载方式将两者同时迁移到数据盘,可以确保容器环境的完整性,并避免因路径不一致导致的启动失败或配置冲突。
✨Linux 迁移 docker 目录
目前许多 Nvidia 的 LLM 框架都会提供一个 NGC 镜像
在使用 GPU 租赁平台使用 docker 时可能会遇到系统盘空间不足的情况
此时需要迁移 docker 目录
具体操作步骤如下
停止 docker 服务
sudo systemctl stop docker
sudo systemctl stop docker.socket
sudo systemctl stop containerd
迁移数据
使用 rsync 而不是 mv,因为 rsync 能够更好地保留文件权限和层级结构,且万一中途出错,原始数据还在。
