【容器镜像】从底层开始一秒构建

当 docker-hub 启动认证后,经常是 TLS handshake timeout。自建小型基础,特别适合 VPS 类超小型主机,或者套娃容器管理。
以下是基于清华大学镜像站的 Alpine Linux RootFS 构建最小化容器镜像的完整指南。我们将以 aarch64 架构的 Alpine v3.20 为例,逐步说明如何利用国内系统资源的构建过程。


一、获取 Alpine RootFS

1. 下载 RootFS 压缩包

清华大学镜像站提供了预编译的 RootFS 文件,访问以下链接选择版本:
https://mirrors.tuna.tsinghua.edu.cn/alpine/v3.20/releases/aarch64/

找到文件名类似 alpine-minirootfs-3.20.0-aarch64.tar.gz 的文件(当前最新版),使用 wget 下载:

# 下载 RootFS(约 2.8MB)
wget https://mirrors.tuna.tsinghua.edu.cn/alpine/v3.20/releases/aarch64/alpine-minirootfs-3.20.0-aarch64.tar.gz

# 验证文件完整性(可选但推荐)
wget https://mirrors.tuna.tsinghua.edu.cn/alpine/v3.20/releases/aarch64/alpine-minirootfs-3.20.0-aarch64.tar.gz.sha256
sha256sum -c alpine-minirootfs-3.20.0-aarch64.tar.gz.sha256
2. 解压 RootFS
mkdir alpine-rootfs
tar -xzf alpine-minirootfs-3.20.0-aarch64.tar.gz -C alpine-rootfs

二、构建基础容器镜像

1. 创建 Dockerfile

alpine-rootfs 同级目录新建 Dockerfile

# 使用空镜像作为基础
FROM scratch

# 复制 RootFS 到容器
COPY ./alpine-rootfs/ /

# 配置容器启动命令(默认为 /bin/sh)
CMD ["/bin/sh"]
2. 构建镜像
# 生成scratch镜像,也可以不用,默认就是空的
# tar cv --files-from /dev/null | docker import - scratch
docker build -t my-alpine:3.20-aarch64 .
3. 验证镜像
docker run --rm -it my-alpine:3.20-aarch64
# 在容器内执行命令测试
/ # uname -a
Linux 4c3d7e8d8d3a 5.15.0-105-generic #116-Ubuntu SMP Wed Jun 5 16:01:08 UTC 2024 aarch64 Linux
/ # cat /etc/alpine-release
3.20.0

三、优化镜像配置

1. 配置 APK 使用清华源

在 RootFS 中预先配置镜像加速,编辑 alpine-rootfs/etc/apk/repositories

https://mirrors.tuna.tsinghua.edu.cn/alpine/v3.20/main
https://mirrors.tuna.tsinghua.edu.cn/alpine/v3.20/community
2. 安装基础工具(可选)

若需要扩展功能(如 curl),在 Dockerfile 中添加:

FROM scratch
COPY ./alpine-rootfs/ /

# 在构建时模拟运行 apk 命令(需在已解压的 RootFS 中操作)
RUN echo "https://mirrors.tuna.tsinghua.edu.cn/alpine/v3.20/main" > /etc/apk/repositories && \
    apk update && \
    apk add --no-cache curl && \
    rm -rf /var/cache/apk/*

四、完整构建流程(自动化版)

1. 一键构建脚本
#!/bin/bash

# 下载并解压 RootFS
wget -O alpine-rootfs.tar.gz \
  https://mirrors.tuna.tsinghua.edu.cn/alpine/v3.20/releases/aarch64/alpine-minirootfs-3.20.0-aarch64.tar.gz
mkdir rootfs
tar -xzf alpine-rootfs.tar.gz -C rootfs

# 配置清华源
echo "https://mirrors.tuna.tsinghua.edu.cn/alpine/v3.20/main" > rootfs/etc/apk/repositories
echo "https://mirrors.tuna.tsinghua.edu.cn/alpine/v3.20/community" >> rootfs/etc/apk/repositories

# 构建 Docker 镜像
cat <<EOF > Dockerfile
FROM scratch
COPY ./rootfs/ /
CMD ["/bin/sh"]
EOF

docker build -t tuna-alpine:3.20-aarch64 .
2. 多阶段构建扩展功能
# 第一阶段:准备 RootFS
FROM alpine:3.20 AS base
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories
RUN apk add --no-cache curl

# 第二阶段:仅复制必要文件
FROM scratch
COPY --from=base / /
CMD ["curl", "--version"]

五、镜像大小对比

类型大小包含内容
原始 RootFS~2.8MB最小 /bin/sh, BusyBox 工具
添加 curl 后的镜像~6.1MB包含 curl 和依赖库
标准 Alpine Docker 镜像~7.05MB包含 apk 包管理器

六、关键优化技巧

  1. 使用 --no-cache 安装包
    避免缓存增大镜像体积:

    RUN apk add --no-cache python3
    
  2. 删除无用文件
    清理临时文件和文档:

    RUN rm -rf /var/cache/apk/* /usr/share/man/* /tmp/*
    
  3. 静态编译应用
    例如,使用 Go 构建无需依赖的二进制文件:

    FROM golang:alpine AS build
    RUN CGO_ENABLED=0 go build -o /app .
    
    FROM scratch
    COPY --from=build /app /app
    CMD ["/app"]
    

七、注意事项

  1. 架构匹配

    • 确认宿主机和镜像的架构一致(本例为 aarch64)。
    • 若需要 x86_64 镜像,替换 URL 中的 aarch64x86_64
  2. 版本更新

    • 定期检查清华镜像站更新路径(如 v3.20 可能变更为更高版本)。
  3. 安全加固

    • 删除默认用户密码:sed -i '/^root:/d' /etc/shadow
    • 禁用不必要的服务。

通过以上方法,可快速构建基于国内镜像源的最小化 Alpine 容器镜像,适用于物联网设备(如树莓派)、Kubernetes Pod 等场景。这种优化后的镜像兼具高效性和安全性,特别适合资源受限的环境。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值