从零创建Docker用基础镜像 - CentOS7.9 x86_64

本文记录了自己创建 Docker 用基础镜像的 rootfs 系统的过程。先安装最小版 CentOS7.9 系统,介绍 8 版本后替代者;接着进行基本设置,如网络、防火墙、ssh 等;然后以 root 用户操作创建 rootfs 压缩包;最后通过 rootfs 生成 Docker 基础镜像并测试运行。

文档是根据百度到的各种资料,并实际操作,边做边记录的,本文档主要目的也是为了记录,以便于以后用到时查询

文档的目的是自己创建一个 Docker 用基础镜像用的一个 rootfs 系统

一、安装 最小版 CentOS7.9 系统

安装 最小版就可以,各个 Mirrors 站都有 ,试过用 Live 版,但在安装 yum 过程中到 glibc时 live 系统会死机

http://mirrors.ustc.edu.cn/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-Minimal-2207-02.iso

小贴士:自 8 版本后因为 redhat 对 CentOS政策变动,所以下面是 8 以后版本的替代者
rockyLinux - 原 CentOS创始人之一另起的一个发行版,各个 Mirrors 都有
AlmaLinux - CloudLinux 公司维护的一个社区版本,也是免费的,除了官方外,现仅发现 阿里云
上有镜像,各个信息来看好像比 rockyLinux 要好些 yum

二、基本设置

我使用的 PVE 建立的虚拟机,其他是用虚拟机还是真机都无所谓

1.启动到桌面后,前期需要做一些设置,只是为了后面可 ssh 远程操作方便而已,所以不做赘述,以自己实际情况设置即可

1)设置网络,如是静态 IP ,修改完IP无法 ping 的,可以断天网络再连接一下试试
2)关闭防火墙,反正也是临时系统:
2.1) 修改 /etc/selinux/config 文件,修改内容为SELINUX=disabled,保存后 setenforce 0>
2.2)执行 systemctl stop firewalld.service
2.3)执行 systemctl disable firewalld.service

3)设置 ssh ,比如连接端口,是否允许 root 连接等你所需要的设置,设置完成后重启下 ssh 服务 systemctl stop ssh.service

4)设置自动熄屏和自动休眠的时间,以免因此制作到一半时断网

2.都设置没问题后可以使用 ssh 客户端连接到该虚拟机,方便粘贴脚本,当然了,你如果喜欢打键盘也无所谓

三、开始创建

全程以 root 用户进行操作

# 切换 root 用户
su - 

# 创建目录
mkdir -p /root/rootfs/var/lib/rpm

# 设置 rpm 主目录
rpm --root /root/rootfs/ --initdb

# 下载并安装基本系统
rpm -ivh --nodeps --root /root/rootfs/ http://mirrors.ustc.edu.cn/centos/7.9.2009/os/x86_64/Packages/centos-release-7-9.2009.0.el7.centos.x86_64.rpm

# 可以先查看一下结果
ls /root/rootfs/
ls /root/rootfs/etc/

# 给 rootfs 系统中安装 yum
yum --installroot=/root/rootfs install yum --nogpgcheck

# 拷贝 dns 文件到 rootfs 中
cp -L /etc/resolv.conf /root/rootfs/etc/resolv.conf
# 下面这行可以不用,因为 rootfs 中也有自己的 源
# cp –r /etc/yum.repos.d/ /root/rootfs/etc/

# 复制当前系统的基本配置文件,不拷贝也可以,只是会使用最基本的 bash 配置也一样
# cp -vL .bashrc rootfs/root/
# cp -vL .bash_profile rootfs/root/

# 此时 rootfs 已经生成,可以 chroot rootfs 进入使用

chroot rootfs 主要是为了安装或清理一下垃圾文件及信息

# 进入 rootfs 前,需要先挂载宿主机的 /dev 目录,否则 rootfs 内 yum 会报错
mount --bind /dev/ rootfs/dev/

# 也可以把 宿主系统中的 .bashrc .bash_profile 拷贝到 rootfs/root 目录中,根据个人需要,就不写了

# 此时可以 进入 rootfs
chroot rootfs

# 添加ustc中国科技大学的 epel 扩展源
yum install -y epel-release
sed -e 's|^metalink=|#metalink=|g' \
         -e 's|^#baseurl=https\?://download.fedoraproject.org/pub/epel/|baseurl=https://mirrors.ustc.edu.cn/epel/|g' \
         -e 's|^#baseurl=https\?://download.example/pub/epel/|baseurl=https://mirrors.ustc.edu.cn/epel/|g' \
         -i.bak \
         /etc/yum.repos.d/epel.repo
         
yum clean all && yum makecache

# 可以安装一些所需的工具
yum install -y bash-completion iputils wget nano shadow-utils 
# bash-completion 命令参数补全 / net-tools 网络管理工具,较大,可选择不用安装 
# iputils ping工具 / wget 下载 / nano 文本编辑,体积小
# shadow-utils 添加一些用户、组管理工具

# 都安装完了,可以清理一下,用于减小打包
yum clean all

# 退出 rootfs ,打包
exit
umount -l rootfs/dev/	# 别忘记给卸载掉
mount -l | grep rootfs	#可以通过这个命令查看是否还在挂载没有卸掉
cd rootfs
tar czvf ../rootfs-CentOS7.9.tar.gz *

最后生成的文件就是 rootfs 的压缩包,拷贝走就可以了

四、Docker 通过 rootfs 生成基础镜像

全程在 root 用户及其目录中执行

# 创建 存放 rootfs / Dockerfile 文件的目录
mkdir -p rootfs-CentOS7.9
cd rootfs-CentOS7.9

# 放入之前创建的 rootfs-CentOS7.9.tar.gz
# 创建 Dockerfile 文件
vim Dockerfile

文件内容如下:

# 以下为必写信息
# 创建一个空镜像
FROM scratch
# 镜像建立人的信息
MAINTAINER UnMobile
# 将压缩的 rootfs 文件自动解压,并拷贝到镜像的根文件目录中
ADD ./rootfs-CentOS7.9.tar.gz /
### 文档内容结束
# 保存文件退出,按 ESC 输入 wq 并回车

开始生成 docker 镜像

docker build --rm -t unmobile/centos7.9-baseimage:v0 .
# 注意最后有一个点,那个是指 dockerfile的位置在当前位置,是相对路径
# --rm 设置镜像成功后删除中间容器

可以测试运行一下

docker images # 显示现在已经添加的镜像信息,找到已经添加成功的镜像
# 可以用下面的命令运行这个镜像,生成一个新的容器
命令格式:docker run -it -p 1521:1521 -v 宿主机目录:容器中目录 镜像名或镜像ID 要在容器中执行的命令(如 /bin/bash)
# -it 以交互式进入容器操作,可以理解为连接到容器中使用容器中的系统
# -P 随机指定宿主机端口与容器端口进行映射
# 以下参数可以加多个
# -p 指定宿主机端口与指定容器端口进行映射
# -v 指定宿主机目录引用至指定容器目录,可以使重要数据持久化,以防容器被删除

# 例如
docker run -it -p 1521:1521 -v /data:/ORCLData XXXXXXXXXX /bin/bash
初始化脚本的8b61c-kubeadm-1.28.2-0.x86_64.rpm: [Errno 14] curl#7 - "Failed to connect to 2404:6800:4012:7::200e: Network is unreachable" 正在尝试其它镜像。 a24e42254b5a14b67b58c4633d29c2 FAILED https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64/Packages/a24e42254b5a14b67b58c4633d29c27370c28ed6796a80c455a65acc813ff374-kubectl-1.28.2-0.x86_64.rpm: [Errno 14] curl#7 - "Failed to connect to 2404:6800:4012:7::200e: Network is unreachable" 正在尝试其它镜像。 e1cae938e231bffa3618f5934a096b FAILED https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64/Packages/e1cae938e231bffa3618f5934a096bd85372ee9b1293081f5682a22fe873add8-kubelet-1.28.2-0.x86_64.rpm: [Errno 14] curl#7 - "Failed to connect to 2404:6800:4012:7::200e: Network is unreachable" 正在尝试其它镜像。 0f2a2afd740d476ad77c508847bad1 FAILED https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64/Packages/0f2a2afd740d476ad77c508847bad1f559afc2425816c1f2ce4432a62dfe0b9d-kubernetes-cni-1.2.0-0.x86_64.rpm: [Errno 14] curl#7 - "Failed to connect to 2404:6800:4012:7::200e: Network is unreachable" 正在尝试其它镜像。 Error downloading packages: cri-tools-1.26.0-0.x86_64: [Errno 256] No more mirrors to try. kubernetes-cni-1.2.0-0.x86_64: [Errno 256] No more mirrors to try. kubectl-1.28.2-0.x86_64: [Errno 256] No more mirrors to try. kubeadm-1.28.2-0.x86_64: [Errno 256] No more mirrors to try. kubelet-1.28.2-0.x86_64: [Errno 256] No more mirrors to try.
最新发布
11-19
你遇到的错误: ``` [Errno 14] curl#7 - "Failed to connect to 2404:6800:4012:7::200e: Network is unreachable" ``` 以及 ``` Error downloading packages: ... No more mirrors to try. ``` 说明你的 CentOS 7.9 系统无法访问 Google 的官方 Kubernetes YUM 源(`packages.cloud.google.com`),这是由于 **国内网络环境对 IPv6 和境外地址的限制** 导致的。Google 的源使用了 IPv6 地址 `2404:6800::/32`,而很多内网或云主机默认不支持 IPv6 或被防火墙屏蔽。 --- ## ✅ 解决方案:使用国内镜像源(阿里云) 我们可以将 Kubernetes 的 yum 源替换为 **阿里云提供的镜像源**,它同步了 Google 的包,并且支持 IPv4,速度快、稳定。 --- ### 🔧 修改后的 `setup_k8s_prereqs.sh`(使用阿里云镜像) ```bash #!/bin/bash # filename: setup_k8s_prereqs.sh # 功能:在所有节点上执行预配置 + 使用阿里云镜像安装 kubeadm/kubelet/kubectl set -e echo "【1/6】关闭防火墙..." systemctl stop firewalld systemctl disable firewalld echo "【2/6】禁用 SELinux..." setenforce 0 sed -i &#39;s/^SELINUX=enforcing/SELINUX=permissive/&#39; /etc/selinux/config echo "【3/6】启用 bridge-nf-call-iptables..." modprobe br_netfilter cat <<EOF | tee /etc/modules-load.d/k8s.conf br_netfilter EOF cat <<EOF | tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 EOF sysctl --system echo "【4/6】添加阿里云 Kubernetes YUM 源..." cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg exclude=kubelet kubeadm kubectl EOF # 清除缓存并重建 yum clean all yum makecache fast echo "【5/6】安装 kubelet, kubeadm, kubectl..." yum install -y kubelet-1.28.2 kubeadm-1.28.2 kubectl-1.28.2 --disableexcludes=kubernetes echo "【6/6】设置开机启动 kubelet..." systemctl enable --now kubelet echo "✅ 所有前置环境准备完成!已使用阿里云镜像源" ``` --- ### 📌 关键修改点解释 | 修改项 | 原因 | |-------|------| | `baseurl` 改为阿里云地址:<br>`https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/` | 阿里云镜像支持 IPv4,速度快,无连接超时问题 | | `gpgkey` 改为阿里云地址 | 安全验证密钥也从阿里云下载,避免证书失败 | | 显式指定版本 `kubelet-1.28.2` 等 | 防止自动升级到不兼容版本,保持三台机器一致 | | 添加 `yum clean all && yum makecache fast` | 强制刷新缓存,确保新源生效 | --- ### 💡 如何选择版本? 你可以根据需要调整版本号,例如: - `1.28.2` - `1.27.3` - `1.29.0` 查看可用版本命令(可选): ```bash yum list --showduplicates kubeadm --disableexcludes=kubernetes | grep 1.28 ``` --- ### ✅ 补充建议 #### 1. 如果你还想用 Docker(而不是 containerd) 虽然你现在用了 Docker,但注意:**Kubernetes 1.24+ 已不再原生支持 Docker**,而是通过 **containerd + CRI** 运行容器。如果你坚持用 Docker,需额外配置 `cri-dockerd`。 > 推荐做法:改为使用 `containerd`,更轻量、官方推荐。 #### 2. 替换为 containerd(可选优化) ```bash # 安装 containerd yum install -y containerd.io mkdir -p /etc/containerd containerd config default | tee /etc/containerd/config.toml # 修改配置文件中的 SystemdCgroup = true sed -i &#39;s/SystemdCgroup = false/SystemdCgroup = true/&#39; /etc/containerd/config.toml systemctl enable --now containerd ``` 然后在 `kubeadm init` 时会自动识别。 --- ### ✅ 最终验证 运行完脚本后测试是否成功安装: ```bash rpm -qa | grep kube # 应输出类似: # kubelet-1.28.2-0.x86_64 # kubeadm-1.28.2-0.x86_64 # kubectl-1.28.2-0.x86_64 ``` ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值