Conversion of Docker related Artifacts


OCI Image Specification 介绍OCI Runtime Specification 介绍 我们介绍了 OCI 关于镜像实现和容器运行的标准。但是这两部分内容涉及的产物离大部分同学的日常操作可能比较遥远,因此补充这篇文章,以 Docker 为例大致说明 Docker 与前文提到的 OCI 标准产物是如何交互的。

免责声明:

  • 本文内容有一定程度上请教 ChatGPT(4.0),而 “ChatGPT可能會出錯。請考慮核對重要資訊。”
  • OCI 的制定晚于 Docker 早期版本,因此部分历史镜像或历史 Docker 版本的逻辑可能与本文论述的不一致

image-20240217225146308

如上图,描述了主要 Docker 指令对应的产物关系。


关键实体说明

  • Internal Docker Image: 指的是 Docker 在本地构建完成后的镜像, 是内部 Docker 镜像,它是基于 Dockerfile 通过 docker build 命令构建的。它存储在 Docker 守护进程的内部存储中,(Linux 下)通常位于 /var/lib/docker/,遵循的是 Docker 内部的镜像存储结构。
  • OCI Runtime Bundle: 创建容器所依赖的 config 和 rootfs 文件, 参考 Filesystem Bundle

行为说明

docker build

  1. Docker 从 Dockerfile 读取指令,构建镜像层,生成镜像配置
  2. Docker 将镜像直接按照 Docker 内部格式进行存储

docker push

docker push 会将镜像以符合 OCI Image Spec 的格式推送到远程仓库

  1. Docker 生成符合 OCI Image Spec 的 Docker Image

    1. 准备镜像清单 (manifest)

    2. 生成镜像配置 (config)

  2. Docker 推送 Docker Image

    1. 上传 layers
    2. 推送 manifest & config
    3. tag 推送

docker save

docker save 会将镜像以符合 OCI Image Spec 格式的 Docker Image 保存下来为 tarball

docker run

docker run 会 调用 runtime(如 runc) 来创建和操作 OCI Runtime Bundle, 并创建容器并执行

  1. Docker 从镜像中提取元数据和配置信息
  2. Docker 准备 rootfs
  3. Docker 生成配置
  4. Docker 调用 Runtime 管理容器生命周期
  5. Docker 启动容器
comments powered by Disqus