【Docker】Linux 迁移 docker 目录(软链接)

✨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

  1. 分工明确/var/lib/docker 负责上层的业务逻辑(如卷管理、网络编排),而 /var/lib/containerd 负责底层的大规模二进制文件存储。
  2. 空间分布 :大部分的磁盘占用来自于 containerd 的镜像快照和层数据。仅迁移 docker 目录通常无法解决根分区爆满的问题。
  3. 一致性:通过软链接或挂载方式将两者同时迁移到数据盘,可以确保容器环境的完整性,并避免因路径不一致导致的启动失败或配置冲突。

✨Linux 迁移 docker 目录

目前许多 Nvidia 的 LLM 框架都会提供一个 NGC 镜像

在使用 GPU 租赁平台使用 docker 时可能会遇到系统盘空间不足的情况

此时需要迁移 docker 目录

具体操作步骤如下

停止 docker 服务

bash 复制代码
sudo systemctl stop docker
sudo systemctl stop docker.socket
sudo systemctl stop containerd

迁移数据

使用 rsync 而不是 mv,因为 rsync 能够更好地保留文件权限和层级结构,且万一中途出错,原始数据还在。

bash 复制代码
# 创建迁移目录
sudo mkdir -p /mnt/data/docker-data
# 迁移 docker 目录
sudo rsync -avz /var/lib/docker/ /mnt/data/docker-data/docker/
# 迁移 containerd 目录
sudo rsync -avz /var/lib/containerd/ /mnt/data/docker-data/containerd/

清理原目录并建立软链接

bash 复制代码
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
sudo ln -s /mnt/data/docker-data/docker /var/lib/docker
sudo ln -s /mnt/data/docker-data/containerd /var/lib/containerd

验证软链接状态

bash 复制代码
ls -ld /var/lib/docker /var/lib/containerd

预期输出: 你会看到类似下方的结果,注意行首的 l(代表 link)以及末尾的箭号 ->

bash 复制代码
lrwxrwxrwx 1 root root 26 Apr  9 14:30 /var/lib/containerd -> /mnt/data/docker-data/containerd
lrwxrwxrwx 1 root root 22 Apr  9 14:30 /var/lib/docker -> /mnt/data/docker-data/docker

恢复 docker 服务

bash 复制代码
sudo systemctl start docker
sudo systemctl start containerd

⭐转载请注明出处

本文作者:双份浓缩馥芮白

原文链接:https://www.cnblogs.com/Flat-White/p/19840978

版权所有,如需转载请注明出处。

相关推荐
ltl15 小时前
QUIC 握手实现:Initial 到 1-RTT 的最小路径
linux
Android系统攻城狮16 小时前
Linux PipeWire深度解析之pw_init调用流程与实战(八十三)
linux·运维·服务器·音频进阶·pipewire音频进阶
M78佐菲17 小时前
Linux学习笔记:进程
linux·笔记·学习·算法
zbyyd18 小时前
Linux 进程管理详解:从概念到实战
linux·运维·服务器
薛定猫AI19 小时前
OpenAI Codex本地完整配置教程|(Windows/Mac/Linux全平台,修复鉴权报错)
linux·windows·macos
躺不平的理查德20 小时前
OpenSSL 的异步 TLS 1.3 加密
linux·运维·服务器
tedcloud12320 小时前
Awesome DSH Plugin 怎么用?给 DeepSeek Harness 搭建自己的插件生态
大数据·linux·服务器·人工智能·音视频
钓鱼的小小猫21 小时前
从零拿捏Linux(一) ---- 命令(视频秒解)
linux·linux命令
wazmlp00188736921 小时前
k8s pod 管理
docker·容器·kubernetes