4. 测试镜像准备:构建不同大小(50MB/200MB/1GB)的测试镜像

容量规划测试的核心在于控制变量。为了精准评估镜像大小对 Deployment 拉取速度的影响,我们需要构建三个具有明确大小梯度的测试镜像:50MB、200MB 和 1GB。本节将使用 Dockerfile 与多阶段构建技术,确保镜像体积精确可控,同时避免引入不必要的层数或元数据干扰。

4.1 镜像大小设计原则

测试镜像的内容应尽量“中性”——即不包含复杂的业务逻辑,仅通过填充特定大小的文件来控制体积。我们采用以下策略:

  • 基础镜像统一:全部使用 alpine:3.18 作为基础层,确保底层库和文件系统开销一致。
  • 填充文件生成:使用 dd 命令在构建阶段生成指定大小的空白文件(/testfile.img)。
  • 多阶段构建:第一阶段生成填充文件,第二阶段仅复制该文件到最终镜像,避免构建工具链和中间层残留在交付产物中。
设计要点:使用 dd if=/dev/zero 生成的填充文件内容全为 0,具有极高的压缩率。在后续的镜像仓库传输测试中,这能更真实地反映网络带宽与解压性能,而非磁盘 I/O 瓶颈。

4.2 多阶段构建 Dockerfile 模板

以下是一个通用的多阶段构建 Dockerfile,通过修改 FILE_SIZE_MB 环境变量即可生成不同大小的镜像。

# ===== 阶段一:生成指定大小的填充文件 =====
FROM alpine:3.18 AS builder

# 构建参数:目标文件大小(单位 MB)
ARG FILE_SIZE_MB=50

# 安装 coreutils(dd 命令所在包)
RUN apk add --no-cache coreutils

# 生成填充文件到 /tmp 目录
RUN dd if=/dev/zero of=/tmp/testfile.img bs=1M count=${FILE_SIZE_MB} status=progress

# ===== 阶段二:最终运行镜像 =====
FROM alpine:3.18

# 仅从 builder 阶段复制填充文件
COPY --from=builder /tmp/testfile.img /testfile.img

# 设置默认命令,保持容器运行
CMD ["tail", "-f", "/dev/null"]

4.3 构建与验证流程

按照以下步骤依次构建三个镜像,并验证其实际大小是否符合预期。

步骤 命令 说明
1 docker build --build-arg FILE_SIZE_MB=50 -t test-image:50mb . 构建 50MB 镜像
2 docker build --build-arg FILE_SIZE_MB=200 -t test-image:200mb . 构建 200MB 镜像
3 docker build --build-arg FILE_SIZE_MB=1024 -t test-image:1gb . 构建 1GB 镜像(1024MB)
4 docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}" 验证镜像实际大小
验证预期输出示例:
test-image 50mb 51.2MB
test-image 200mb 201MB
test-image 1gb 1.02GB
注:实际大小会因文件系统块对齐和 alpine 基础层(约 7MB)略有上浮。

4.4 多阶段构建的优势图解

下图展示了多阶段构建如何隔离构建环境与运行环境,确保最终镜像仅包含运行所需的文件,从而精确控制体积。

多阶段构建流程与镜像体积控制 多阶段构建流程与镜像体积控制 阶段一:构建阶段 (builder) 基础镜像: alpine:3.18 安装 coreutils dd 生成 /tmp/testfile.img 阶段二:运行阶段 (final) 基础镜像: alpine:3.18 COPY --from=builder 仅复制 /testfile.img 最终镜像层结构 Layer 0: alpine:3.18 (约 7MB) Layer 1: /testfile.img (50/200/1024MB) 关键优势 构建工具链不进入最终镜像 镜像层数固定为 2 层

4.5 镜像推送至私有仓库

构建完成后,需要将镜像推送至所有 Kubernetes 节点均可访问的镜像仓库(如 Harbor、Docker Registry 或阿里云 ACR)。

# 登录镜像仓库
docker login registry.example.com

# 为镜像打标签(以 50MB 为例)
docker tag test-image:50mb registry.example.com/test/test-image:50mb

# 推送镜像
docker push registry.example.com/test/test-image:50mb

# 重复上述步骤为 200mb 和 1gb 镜像打标签并推送
注意事项:
  • 确保所有 Worker 节点都能通过 docker pull 或 containerd 访问该仓库,无需额外认证或已配置 imagePullSecrets。
  • 记录每个镜像的完整 digest(docker images --digests),以便在 Deployment YAML 中使用精确版本,避免标签被覆盖。
  • 测试期间建议关闭镜像仓库的压缩功能(如 gzip 压缩),以统一变量;若需测试压缩传输,则单独记录压缩率。

4.6 镜像大小与层数汇总

下表汇总了三个测试镜像的关键属性,供后续拉取速度测试时参考。

镜像标签 目标大小 实际大小(约) 层数 基础镜像
test-image:50mb 50 MB 51.2 MB 2 alpine:3.18
test-image:200mb 200 MB 201 MB 2 alpine:3.18
test-image:1gb 1 GB 1.02 GB 2 alpine:3.18