从零创建 Docker 镜像

本文详细讲述完全从零开始手动创建一个可以被 docker load 加载的 Docker 镜像。我们将不使用 Docker 工具,直接构造符合 Docker 镜像格式(OCI 镜像规范)的 tar 文件。最终生成的镜像可以通过 docker load 导入到 Docker 中运行。


从零创建 Docker 镜像

Docker 镜像是一个 tar 包,包含文件系统层、配置文件和元数据。我们将创建一个简单的镜像,包含一个 shell 脚本,运行时输出 “Hello from my custom image!”。

步骤 1:准备文件系统层

创建一个简单的文件系统层,包含一个可执行的 shell 脚本。

  1. 创建工作目录和文件系统结构:
mkdir -p my-image/rootfs/bin
cd my-image
  1. 创建一个 shell 脚本:
echo -e '#!/bin/sh\necho "Hello from my custom image!"' > rootfs/bin/hello.sh
chmod +x rootfs/bin/hello.sh
  1. 打包文件系统层为 tar 文件:
tar -cvf layer.tar -C rootfs .

这会生成 layer.tar,包含文件系统内容(bin/hello.sh)。

步骤 2:创建镜像配置文件

需要一个 JSON 文件(config.json)来描述镜像的运行时配置。

my-image 目录下创建 config.json

{
  "architecture": "amd64",
  "os": "linux",
  "config": {
    "Entrypoint": ["/bin/hello.sh"],
    "Env": ["PATH=/bin"],
    "WorkingDir": "/"
  },
  "rootfs": {
    "type": "layers",
    "diff_ids": []
  },
  "history": [
    {
      "created": "2025-04-19T00:00:00Z",
      "created_by": "Manual creation"
    }
  ]
}

计算层 diff_id

diff_ids 是文件系统层的 SHA256 校验值,格式为 sha256:<hash>。我们需要计算 layer.tar 的 SHA256 值。

运行以下命令:

sha256sum layer.tar

假设输出为:

e4d7f1b4...  layer.tar

sha256:e4d7f1b4... 添加到 config.jsonrootfs.diff_ids 中,更新 config.json

{
  "architecture": "amd64",
  "os": "linux",
  "config": {
    "Entrypoint": ["/bin/hello.sh"],
    "Env": ["PATH=/bin"],
    "WorkingDir": "/"
  },
  "rootfs": {
    "type": "layers",
    "diff_ids": ["sha256:e4d7f1b4..."]
  },
  "history": [
    {
      "created": "2025-04-19T00:00:00Z",
      "created_by": "Manual creation"
    }
  ]
}

步骤 3:创建 Manifest 文件

manifest.json 描述镜像的层和配置信息。

my-image 目录下创建 manifest.json

[
  {
    "Config": "config.json",
    "RepoTags": ["my-custom-image:latest"],
    "Layers": ["layer.tar"]
  }
]

步骤 4:打包镜像

将所有文件打包成一个 tar 文件,符合 Docker 镜像格式。

my-image 目录下运行:

tar -cvf my-image.tar manifest.json config.json layer.tar

这会生成 my-image.tar,即最终的 Docker 镜像文件。

步骤 5:验证和加载镜像

my-image.tar 传输到有 Docker 的环境中,运行:

docker load -i my-image.tar

加载后,检查镜像:

docker images

应该能看到 my-custom-image:latest

运行镜像:

docker run my-custom-image:latest

预期输出:

Hello from my custom image!

注意事项

  1. SHA256 计算:确保 layer.tar 的 SHA256 值正确,否则 Docker 会报错。
  2. 文件权限:确保 hello.sh 有可执行权限(chmod +x)。
  3. 架构兼容性architecture 字段需与目标运行环境匹配(这里使用 amd64)。
  4. 时间格式history.created 使用 ISO 8601 格式(YYYY-MM-DDTHH:MM:SSZ)。
  5. 依赖问题:此例中,hello.sh 依赖 /bin/sh。如果目标环境没有 /bin/sh,需要将 sh 二进制文件包含在 rootfs 中。

扩展:添加更多层

如果需要多个层,重复以下步骤:

  1. 创建新的文件系统目录,添加或修改文件。
  2. 打包成新的 layerN.tar
  3. 计算新层的 SHA256 值,添加到 config.jsondiff_ids
  4. manifest.jsonLayers 列表中添加新层。

例如,添加第二个层:

mkdir rootfs2
echo "Another file" > rootfs2/another.txt
tar -cvf layer2.tar -C rootfs2 .
sha256sum layer2.tar  # 假设得到 sha256:abcdef...

更新 config.json

"rootfs": {
  "type": "layers",
  "diff_ids": ["sha256:e4d7f1b4...", "sha256:abcdef..."]
}

更新 manifest.json

"Layers": ["layer.tar", "layer2.tar"]

重新打包:

tar -cvf my-image.tar manifest.json config.json layer.tar layer2.tar

总结

通过以上步骤,你可以完全不依赖 Docker 工具,从零创建一个符合 OCI 规范的 Docker 镜像。最终的 my-image.tar 可以通过 docker load 导入并运行。此方法适用于需要深度定制镜像或在无 Docker 环境中构建镜像的场景。


要从开始制作Docker的基础镜像,需要执行以下步骤: 1. 安装一个操作系统作为基础。可以选择一个最小化的Linux发行版,例如Ubuntu或Alpine。 2. 在操作系统中安装所需的软件包和依赖项。这些软件包将构成基础镜像的基本功能。例如,对于Web应用程序,可能需要安装Apache或Nginx服务器,以及相应的编程语言和库。 3. 通过命令行运行所需的配置和设置。这些配置可以包括网络设置、安全设置、服务启动和管理等。 4. 创建一个Dockerfile。Dockerfile是一个文本文件,其中包含一系列指令,用于构建Docker镜像。在Dockerfile中,我们可以指定基础镜像、设置镜像的元数据、添加软件包、复制文件和目录等。 5. 使用Docker命令构建镜像。在命令行中,可以运行docker build命令,并指定Dockerfile所在的路径,来构建镜像。构建过程中,Docker将根据Dockerfile中的指令进行相应的操作,并逐步构建出最终的镜像。 6. 测试镜像。可以使用docker run命令在容器中运行镜像,并验证是否成功构建和安装了所需的软件包和设置。 7. 将镜像上传到镜像仓库(如Docker Hub)中,以便在其他机器上使用或共享。 这些步骤是从开始制作Docker基础镜像的基本过程。通过按照这些步骤进行操作,可以根据自己的需要和要求,制作出适用于特定应用程序的定制化基础镜像
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值