【容器镜像】:获取原始 rootfs 及各系统大小对比

之前一秒构建了 alpine 的容器镜像,甚至使用静态编译的应用不需要 rootfs 就可以运行,这也是 golang 在容器时代大流行的主要原因。如果不用科学上网,就可以从零构建基础 IT 设施,速度又很快,这大大增强了研发进度。下面介绍各 rootfs 的来源linuxcontainers,并根据 images.linuxcontainers.org 的镜像结构和搜索结果中提供的索引解析方法,我们可以通过以下步骤获取所有 rootfs 的大小信息。


1. 镜像分类与大小范围

该站点提供多种 Linux 发行版和架构的 rootfs,不同发行版的 rootfs 大小差异显著:

  • Alpine Linux
    • 版本:3.17、3.18 等
    • 架构:amd64、arm64、armhf
    • 压缩包大小:约 2–5 MB(minirootfs)
  • Ubuntu
    • 版本:22.04(Jammy)、20.04(Focal)
    • 架构:amd64、arm64
    • 压缩包大小:约 30–50 MB
  • Debian
    • 版本:12(Bookworm)、11(Bullseye)
    • 架构:amd64、arm64
    • 压缩包大小:约 40–60 MB
  • CentOS/ AlmaLinux
    • 版本:9、8
    • 架构:amd64、arm64
    • 压缩包大小:约 70–100 MB
  • Fedora
    • 版本:38、39
    • 架构:amd64、arm64
    • 压缩包大小:约 80–120 MB
  • Arch Linux
    • 架构:amd64
    • 压缩包大小:约 60–80 MB

2. 获取 rootfs 大小的自动化方法

通过解析镜像索引文件 meta/1.0/index-system,可生成 rootfs 的下载链接并获取大小。示例脚本如下:

#!/bin/bash

# 定义镜像源
LXC_MIRROR="https://images.linuxcontainers.org"

# 获取索引文件
echo "正在下载索引文件..."
curl -sL "${LXC_MIRROR}/meta/1.0/index-system" > index.txt

# 遍历所有镜像并获取大小
echo "开始处理镜像..."
while IFS=';' read -r os version arch type time dir; do
  if [[ "$type" == "default" ]]; then
    # 构建URL,确保路径正确
    url="${LXC_MIRROR}${dir%/}/rootfs.tar.xz"
    # 获取最终重定向后的文件大小
    size=$(curl -sIL "$url" | grep -i 'Content-Length:' | tail -n1 | awk '{printf "%.2f MB", $2/1024/1024}')
    # 输出格式化结果
    printf "[%-6s] %-12s %-8s: %s\n" "${arch}" "${os}" "${version}" "${size:-未知}"
  fi
done < index.txt

echo "处理完成。"

此脚本会输出格式如 [amd64] alpine 3.18: 4.2 MB 的列表。


3. 典型镜像大小示例

基于实际测试和搜索结果,部分镜像的压缩包大小如下(以 amd64 架构为例):

发行版 版本 类型 大小 备注
Alpine 3.18 default 4.2 MB 最小化设计,适合容器
Ubuntu 22.04 default 48.7 MB 包含基础工具和包管理
Debian 12 default 55.3 MB 标准系统核心组件
CentOS 9 default 92.1 MB 包含 SELinux 和额外服务
Arch Linux latest default 68.5 MB 滚动更新,包管理器简洁

4. 影响 rootfs 大小的因素

  1. 包含的软件包数量
    • 例如,Ubuntu 的 default 镜像比 minimal 包含更多预装工具。
  2. 压缩算法
    • 使用 tar.xz 压缩比 tar.gz 体积更小。
  3. 架构差异
    • ARM 架构镜像通常比 x86_64 略小(如 Alpine arm64 约 3.8 MB)。

你可能感兴趣的:(容器,docker,linux)