实践篇:09-构建标准化的 OS 基础镜像

设计篇: 04-Dockerfile设计原则与镜像管理规范 中,我们探讨了镜像逻辑分层策略,其中系统层 (OS Layer) 是整个体系的基石。本篇将指导你如何选择合适的 Linux 发行版作为基础,并构建一个标准化、精简且安全的系统层镜像,为后续的所有应用镜像打下坚实基础。

如何选择基础 OS 镜像?

选择合适的基础 OS 镜像至关重要,它直接影响后续镜像的大小、安全性、稳定性和构建效率。以下是几种常见选择及其特点:

主流基础镜像对比

  • Alpine Linux (alpine):
    • 优点: 极其轻量(通常小于 10MB),启动快,攻击面小
    • 缺点: 使用 musl libc 而非标准 glibc,可能导致某些软件存在兼容性问题;软件包管理工具 (apk) 与 Debian/Ubuntu 不同;社区和可用包相对较少
    • 适用场景: 对镜像体积有极致要求,且应用兼容 musl libc 的场景
  • Debian (debian):
    • 优点: 非常稳定,社区支持良好,拥有庞大的软件包仓库,官方提供 slim 版本体积较小
    • 缺点: 相较于 Alpine 体积较大
    • 适用场景: 需要良好稳定性和广泛兼容性的生产环境
  • Ubuntu (ubuntu):
    • 优点: 源自 Debian,用户友好,社区庞大活跃,软件包更新快,硬件支持好
    • 缺点: 相较于 Debian slim 和 Alpine 体积较大,默认安装可能包含更多服务
    • 适用场景: 需要最新软件包、广泛社区支持的应用,开发环境常用
  • CentOS / Rocky Linux / AlmaLinux (centos, rockylinux, almalinux):
    • 优点: 企业级稳定性,与 RHEL 兼容
    • 缺点: CentOS 7 已停止维护,CentOS Stream 定位变化;Rocky/AlmaLinux 相对较新;体积通常较大;包管理工具 (yum/dnf) 不同
    • 适用场景: 对 RHEL 生态有依赖的企业环境

系统镜像数据对比表

镜像 (示例标签)大小 (压缩后)C 库包管理器主要特点
alpine:latest~ 5-8 MBmuslapk极度轻量
debian:bullseye-slim~ 30 MBglibcapt稳定、精简
ubuntu:latest~ 30 MBglibcapt流行、更新快
rockylinux:9-minimal~ 40 MB+glibcdnfRHEL 兼容、企业级

中小企业选择建议

  1. 优先考虑官方 slim 版本: 如 debian:bullseye-slim 或 ubuntu:jammy-slim (如果提供),它们在保持兼容性的同时减小了体积
  2. 评估兼容性: 如果应用对 C 库有特殊要求或依赖特定 glibc 功能,应避免使用 Alpine
  3. 团队熟悉度: 选择团队成员更熟悉的发行版(Debian/Ubuntu 系 vs RHEL 系)可以降低维护成本
  4. 安全与更新: 无论选择哪个,都要确保来源可靠(官方镜像),并建立机制定期更新基础镜像以获取安全补丁

在本系列后续示例中,我们将选用 debian:bullseye-slim 作为基础系统镜像,因为它在稳定性、社区支持、体积和兼容性方面取得了较好的平衡。

制作标准化的 Debian 系统层镜像

我们的目标是创建一个纯净、精简的系统层镜像,只包含运行后续应用所必需的最核心组件。其他工具(如编译环境、调试工具、特定语言运行时)应放在后续的工具层或运行层。

核心组件建议

  • 基础包管理: apt-utils (确保 apt 命令正常运行)
  • 证书: ca-certificates (用于 HTTPS 连接)
  • 时区: tzdata (用于正确设置和显示时间)
  • 本地化: locales, fonts (用于支持不同语言环境,如 UTF-8)
  • 网络工具: curl, wget (用于下载文件)
    = 系统管理工具: procps, psmisc, iproute2, telnet, vim-tiny, zip, unzip, inetutils-ping, tcpdump, lsof (用于调试)

应避免在系统层安装的内容

  • 编辑器: vim, nano 等
  • 版本控制: git
  • 特定语言运行时或 SDK

创建 Git 仓库管理 Dockerfile

首先,我们需要创建一个 Git 仓库来存储和管理我们的 Dockerfile:

git clone http://git.leops.local/ops/dockerfiles-base.git
cd dockerfiles-base
mkdir -p common/os/debian/bullseye-slim
cd common/os/debian/bullseye-slim


# 将 docker/dockerfile:1 同步到我们自己的镜像仓库中
# 这一步确保我们使用的构建工具也在内部可控
docker pull docker/dockerfile:1
docker tag docker/dockerfile:1  harbor.leops.local/library/docker/dockerfile:1
docker push harbor.leops.local/library/docker/dockerfile:1

Dockerfile 示例

下面是我们的系统层 Dockerfile,包含了必要的基础组件和配置:

#syntax=harbor.leops.local/library/docker/dockerfile:1

ARG OS_VERSION=bullseye-slim

FROM debian:$OS_VERSION

ARG OS_VERSION

LABEL org.opencontainers.image.authors="ops.leops.local" \
      org.opencontainers.image.source="http://git.leops.local/ops/dockerfiles-base/common/os/debian/bullseye-slim/Dockerfile" \
      org.opencontainers.image.description="Standard Debian $OS_VERSION base image for internal use."

ENV LANG='en_US.UTF-8' \
    LANGUAGE='en_US.UTF-8' \
    TZ='Asia/Shanghai' \
    OS_VERSION=$OS_VERSION

WORKDIR /app

RUN sed -i -e 's#deb.debian.org#mirrors.aliyun.com#g' \
           -e 's#security.debian.org#mirrors.aliyun.com#g' \
           -e 's#ftp.debian.org#mirrors.aliyun.com#g' \
           /etc/apt/sources.list \
  && apt-get update \
  && apt-get install -y --only-upgrade $(apt-get --just-print upgrade | awk 'tolower($4) ~ /.*security.*/ || tolower($5) ~ /.*security.*/ {print $2}' | sort | uniq)  \
  && DEBIAN_FRONTEND=noninteractive DEBCONF_NOWARNINGS=yes apt-get install -y --no-install-recommends \
                        ca-certificates openssl \
                        tzdata wget curl procps psmisc dnsutils iproute2 telnet vim-tiny zip unzip inetutils-ping tcpdump lsof \
                        net-tools traceroute strace fonts-noto-cjk fontconfig locales \
  && sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen \
  && dpkg-reconfigure --frontend=noninteractive locales \
  && update-locale LANG=en_US.UTF-8 \
  && fc-cache \
  && apt-get clean \
  && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* /tmp/* /var/tmp/* \
  && truncate -s 0 /var/log/*log \
  && ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime \
  && echo ${TZ} > /etc/timezone \
  && echo 'export PS1="\e[1;34m[\e[1;33m\u@\e[1;32m\h\e[1;37m:\w\[\e[1;34m]\e[1;36m\\$ \e[0m"' >> /etc/bash.bashrc \
  && echo 'transfer(){ if [ $# -eq 0 ];then echo "No arguments specified.\nUsage:\n transfer <file|directory>\n ... | transfer <file_name>">&2;return 1;fi;if tty -s;then file="$1";file_name=$(basename "$file");if [ ! -e "$file" ];then echo "$file: No such file or directory">&2;return 1;fi;if [ -d "$file" ];then file_name="$file_name.zip" ,;(cd "$file"&&zip -r -q - .)|curl --progress-bar --upload-file "-" "http://transfer.leops.local/$file_name"|tee /dev/null,;else cat "$file"|curl --progress-bar --upload-file "-" "http://transfer.leops.local/$file_name"|tee /dev/null;fi;else file_name=$1;curl --progress-bar --upload-file "-" "http://transfer.leops.local/$file_name"|tee /dev/null;fi;echo;}' >> /etc/bash.bashrc

Dockerfile 最佳实践要点

  • 使用官方 Slim 镜像: 选择 debian:bullseye-slim 作为基础
  • 明确指定基础镜像版本: 使用 ARG 变量便于后续更新
  • 添加镜像元数据: 使用 LABEL 记录镜像作者、来源等信息
  • 设置必要环境变量: 配置语言、时区等基础环境
  • 合并 RUN 指令: 将相关操作合并以减少镜像层数
  • 使用 --no-install-recommends: 减少不必要的依赖安装
  • 清理缓存: 删除 apt 缓存和临时文件减小镜像体积
  • 配置国内镜像源: 加速软件包下载
  • 设置中文字体和本地化: 支持中文显示和 UTF-8 编码

构建与推送镜像

配置 buildx 多平台构建环境

首先需要配置 Docker buildx 环境,支持同时构建多架构镜像:

# 配置 buildkitd,添加镜像加速和私有仓库配置
cat << EOF >> /etc/buildkit/buildkitd.toml
[registry."harbor.leops.local"]
  insecure = true
  http = true
[registry."docker.io"]
  mirrors = ["https://docker.1ms.run", "https://docker.1panel.live", "https://docker.1panel.dev", "https://docker.zhai.cm", "https://docker.llkk.cc", "https://a.ussh.net"]
EOF


# 创建一个支持多平台的 builder 实例
docker buildx create --name container-builder --driver docker-container --driver-opt "network=host"  --buildkitd-config /etc/buildkit/buildkitd.toml  --bootstrap --use

# 确认 builder 正在运行并已准备就绪
docker buildx inspect --bootstrap

创建自动化构建脚本

创建一个构建脚本(build.sh)自动完成镜像构建和推送:

#!/bin/bash

set -e

# 配置
REGISTRY="harbor.leops.local"
IMAGE_BASE_NAME="common/os/debian"
VERSION="bullseye-20250407-slim"


# 声明镜像地址数组
declare -a IMAGE_PATHS
IMAGE_PATHS+=(
    "${REGISTRY}/${IMAGE_BASE_NAME}:${VERSION}"           # 完整版本
    "${REGISTRY}/${IMAGE_BASE_NAME}:${VERSION%%-*}"       # 主版本
    "${REGISTRY}/${IMAGE_BASE_NAME}:${VERSION%%-*}-slim"# 主版本
)


# 构建镜像
build_image() {

    echo "Building and pushing image:"
    for img in "${IMAGE_PATHS[@]}"; do echo -n " $img"; done

    docker buildx build --platform linux/amd64,linux/arm64 \
      $(for img in "${IMAGE_PATHS[@]}"; do echo"-t $img "; done) \
      --build-arg "OS_VERSION=${VERSION}" \
      --label "OS_VERSION=${VERSION}" \
      --label "org.opencontainers.image.created=$(date --rfc-3339=seconds)" \
      --provenance=false \
      --pull \
      --push \
      .

    echo "Build complete."
}


# 参数处理
case "$1" in
    "list-tags")
        # 输出镜像标签列表
        printf '%s\n'"${IMAGE_PATHS[@]}"
        ;;
    *)
    build_image
    ;;
esac

执行构建过程

# 确保脚本有执行权限
chmod +x build.sh


# 执行构建 (确保已登录到你的镜像仓库)
./build.sh

版本控制

完成构建后,将所有文件提交到 Git 仓库进行版本控制:

git add -A .
git commit -m "feat: add debian bullseye-slim"
git push

至此,你已经成功构建了一个标准化的系统层基础镜像,它将作为你公司内部镜像体系的坚实基础。后续的所有应用镜像都可以基于此镜像进行构建,确保一致性和安全性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

企鹅侠客

您的打赏是我创作旅程中的关键燃

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值