使用 containerd 镜像存储的 Docker Engine

containerd 镜像存储是 Docker Engine 29.0 及更高版本在全新安装时的默认存储后端。如果您是从早期版本升级而来,守护进程将继续使用传统的 graph 驱动程序(overlay2),直到您启用 containerd 镜像存储为止。

作为行业标准容器运行时的 containerd 使用 snapshotters 而非传统的存储驱动程序来存储镜像和容器数据。

Note

使用用户命名空间重映射(userns-remap)时,containerd 镜像存储不可用。详情请参见 moby#47377

为何使用 containerd 镜像存储

containerd 镜像存储使用 snapshotters 来管理镜像层在文件系统中的存储和访问方式。这与传统的 graph 驱动程序(如 overlay2)不同。

containerd 镜像存储支持以下功能:

  • 本地构建和存储多平台镜像。使用传统存储驱动程序时,您需要外部构建器来创建多平台镜像。
  • 处理包含证明(来源、SBOM)的镜像。这些镜像使用传统存储不支持的镜像索引。
  • 运行 Wasm 容器。containerd 镜像存储支持 WebAssembly 工作负载。
  • 使用高级 snapshotters。containerd 支持可插拔的 snapshotters,提供诸如镜像延迟拉取(stargz)或对等镜像分发(nydus、dragonfly)等功能。

对大多数用户而言,切换到 containerd 镜像存储是透明的。虽然存储后端发生了变化,但您的工作流程保持不变。

磁盘空间使用

对于相同的镜像,containerd 镜像存储比传统存储驱动程序占用更多磁盘空间。这是因为 containerd 以压缩和非压缩两种格式存储镜像,而传统驱动程序仅存储非压缩层。

当您拉取镜像时,containerd 会保留压缩层(从注册表中接收到的格式),同时也会将其解压到磁盘上。这种双重存储意味着每一层都会占用更多空间。压缩格式可以实现更快的拉取和推送操作,但需要额外的磁盘容量。

当多个镜像共享相同的基础层时,这种差异尤为明显。使用传统存储驱动程序时,共享的基础层在本地仅存储一次,依赖它们的镜像可以重复使用。而使用 containerd 时,即使非压缩层仍通过 snapshotters 进行去重,每个镜像也会存储其共享层的压缩版本。压缩存储会增加与这些层使用镜像数量成比例的开销。

如果磁盘空间受限,请考虑以下建议:

  • 定期使用 docker image prune 清理未使用的镜像
  • 使用 docker system df 监控磁盘使用情况
  • 配置数据目录 以使用具有足够空间的分区

在 Docker Engine 上启用 containerd 镜像存储

如果您是从早期 Docker Engine 版本升级而来,需要手动启用 containerd 镜像存储。

Important

切换存储后端会暂时隐藏使用其他后端创建的镜像和容器。您的数据仍保留在磁盘上。要再次访问旧镜像,请切换回之前的存储配置。

将以下配置添加到您的 /etc/docker/daemon.json 文件中:

{
  "features": {
    "containerd-snapshotter": true
  }
}

保存文件并重启守护进程:

$ sudo systemctl restart docker

守护进程重启后,验证您是否正在使用 containerd 镜像存储:

$ docker info -f '{{ .DriverStatus }}'
[[driver-type io.containerd.snapshotter.v1]]

Docker Engine 默认使用 overlayfs containerd snapshotter。

Note

启用 containerd 镜像存储后,来自 overlay2 驱动程序的现有镜像和容器仍保留在磁盘上,但会被隐藏。如果您切换回 overlay2,它们会重新出现。要使现有镜像与 containerd 镜像存储配合使用,请先将它们推送到注册表,或使用 docker save 导出它们。

实验性自动迁移

Docker Engine 包含一项实验性功能,可在特定条件下自动切换到 containerd 镜像存储。此功能为实验性质。它专为希望测试该功能的用户提供,但全新安装仍是推荐方法。

Caution

自动迁移功能为实验性质,可能无法在所有场景中可靠工作。尝试使用前请先创建备份。

要启用自动迁移,请将 containerd-migration 功能添加到您的 /etc/docker/daemon.json 中:

{
  "features": {
    "containerd-migration": true
  }
}

您还可以设置 DOCKER_MIGRATE_SNAPSHOTTER_THRESHOLD 环境变量,使守护进程在没有任何容器且镜像数量等于或低于阈值时自动切换。对于 systemd:

$ sudo systemctl edit docker.service

添加:

[Service]
Environment="DOCKER_MIGRATE_SNAPSHOTTER_THRESHOLD=5"

如果您没有正在运行或已停止的容器,且镜像数量不超过 5 个,守护进程将在重启时切换到 containerd 镜像存储。您的 overlay2 数据仍保留在磁盘上,但会被隐藏。

其他资源

要了解有关 containerd 镜像存储及其在 Docker Desktop 中功能的更多信息,请参阅 Docker Desktop 上的 containerd 镜像存储