如何从零构建一个自己的 CentOS 基础镜像

如何从零构建一个自己的 CentOS 基础镜像

从零构建一个基于 CentOS 的基础镜像是一个很好的实践,可以帮助你理解 Docker 镜像的底层原理。以下是以 CentOS 为例,从零开始(不依赖现有镜像)构建基础镜像的详细步骤。我们将使用 yumdnf 来创建文件系统,并最终生成一个 Docker 镜像。

前提条件

  1. 安装 Docker:确保系统中已安装 Docker(运行 docker --version 检查)。
  2. 运行环境:需要在 CentOS 或兼容的 Linux 系统上操作,因为需要使用 yumdnf
  3. 权限:需要 root 权限(或通过 sudo)。
  4. 工具:需要 yumdnf,以及 rpm 相关工具。

我们将以 CentOS 8 为例(CentOS 7 类似,但命令稍有不同)。


步骤 1:准备工作目录

创建一个目录用于构建镜像:

mkdir my-centos-image
cd my-centos-image

步骤 2:创建基础文件系统

由于 CentOS 没有像 debootstrap 这样直接生成文件系统的工具,我们需要手动用 yumdnf 安装一个最小化的文件系统。

使用 dnf(CentOS 8+)

  1. 创建根文件系统目录:

    mkdir rootfs
    
  2. 安装最小化的 CentOS 系统:

    sudo dnf --installroot=$PWD/rootfs --releasever=8 groupinstall "Minimal Install" -y
    
    • --installroot=$PWD/rootfs:指定安装到 rootfs 目录。
    • --releasever=8:指定 CentOS 8(可改为 7 用于 CentOS 7)。
    • groupinstall "Minimal Install":安装最小化系统(包括 bashcoreutils 等)。
    • -y:自动确认安装。

    这会在 rootfs 中生成一个基本的 CentOS 文件系统,包含 /bin/lib/etc 等目录。

使用 yum(CentOS 7)

对于 CentOS 7,命令类似:

sudo yum --installroot=$PWD/rootfs groupinstall core -y
  • groupinstall core:安装核心组件。

验证

安装完成后,检查 rootfs

ls rootfs

应该能看到 bin etc lib lib64 usr var 等目录。


步骤 3:配置基础文件系统

进入 rootfs,进行必要的配置。

  1. 清理缓存

    减少镜像体积,删除安装时的缓存:

    sudo rm -rf rootfs/var/cache/dnf/*
    sudo rm -rf rootfs/var/cache/yum/*
    
  2. 设置基本配置(可选)

    • 创建 /etc/resolv.conf(DNS 解析):

      echo "nameserver 8.8.8.8" | sudo tee rootfs/etc/resolv.conf
      
    • 确保 /bin/bash/bin/sh 存在:

      ls rootfs/bin/bash
      
  3. Chroot 测试(可选)

    测试文件系统是否可用:

    sudo chroot rootfs /bin/bash
    

    如果能进入 Bash,说明文件系统基本正常。退出用 exit


步骤 4:创建 Dockerfile

将文件系统打包成 Docker 镜像,使用 Dockerfile

# 从 scratch 开始(空的镜像)
FROM scratch

# 添加文件系统
ADD rootfs /

# 设置默认命令
CMD ["/bin/bash"]
  • FROM scratch:从零开始,不依赖任何现有镜像。
  • ADD rootfs /:将 rootfs 目录添加到镜像根目录。
  • CMD ["/bin/bash"]:设置容器启动时的默认命令。

步骤 5:构建镜像

my-centos-image 目录下运行:

docker build -t my-centos-image:latest .
  • -t my-centos-image:latest:指定镜像名称和标签。
  • .:使用当前目录的 Dockerfile

构建完成后,检查镜像:

docker images

步骤 6:测试镜像

运行容器,验证镜像是否正常:

docker run -it my-centos-image:latest
  • -it:交互模式并分配终端。
  • 如果成功,你会进入一个 Bash shell。

如果提示 /bin/bash 不存在,可以修改 DockerfileCMD 为:

CMD ["/bin/sh"]

然后重新构建。


优化与扩展

  1. 减小镜像体积

    • 删除不必要的文件:

      sudo rm -rf rootfs/usr/share/doc/* rootfs/usr/share/man/*
      
    • 使用 --no-install-recommends(如果需要额外安装软件)。

  2. 添加元数据

    Dockerfile 中:

    LABEL maintainer="Your Name <your.email@example.com>"
    LABEL version="1.0"
    
  3. 支持多架构(可选)

    docker buildx build --platform linux/amd64,linux/arm64 -t my-centos-image:latest .
    

示例:完整流程(CentOS 8)

# 创建目录
mkdir my-centos-image
cd my-centos-image

# 创建文件系统
mkdir rootfs
sudo dnf --installroot=$PWD/rootfs --releasever=8 groupinstall "Minimal Install" -y

# 清理缓存
sudo rm -rf rootfs/var/cache/dnf/*

# 创建 Dockerfile
cat <<EOF > Dockerfile
FROM scratch
ADD rootfs /
CMD ["/bin/bash"]
EOF

# 构建镜像
docker build -t my-centos-image:latest .

# 测试运行
docker run -it my-centos-image:latest

注意事项

  1. 依赖问题

    • dnfyum 安装的包可能依赖网络,确保构建环境能访问 CentOS 软件源(默认 http://mirror.centos.org)。
    • CentOS 8 已于 2021 年底停止官方支持,建议用 CentOS Stream 8 或其他替代(如 Rocky Linux)。
  2. CentOS 7 vs 8

    • CentOS 7 用 yum,CentOS 8 用 dnf,命令稍有不同。
    • CentOS 7 的软件源可能需要调整为 vault.centos.org
  3. 手动创建(极简)

    如果不想用 dnf/yum,可以用静态编译的 busybox

    mkdir -p rootfs/bin
    wget https://busybox.net/downloads/binaries/1.35.0-x86_64-linux-musl/busybox
    chmod +x busybox
    mv busybox rootfs/bin/
    cd rootfs/bin && ln -s busybox sh
    

    但这种方式缺少 CentOS 的特性,仅适合极简实验。


总结

从零构建 CentOS 基础镜像的核心步骤:

  1. dnfyum 创建最小文件系统。
  2. 清理和配置文件系统。
  3. Dockerfilescratch 打包。
  4. 构建并测试镜像。

通过上述流程,你可以得到一个完全自制的 CentOS 基础镜像。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值