构建自己的docker基础镜像

构建自己的docker基础镜像

构建一个完全定制的基础镜像意味着您需要从一个非常小的镜像(例如 scratch 镜像)开始,然后逐步添加您需要的所有内容。scratch 镜像是一个空白的基础镜像,可以用来创建高度定制的容器环境。

创建一个基础镜像

构建debian基础镜像

  1. 准备根文件系统

要构建一个基础镜像,您需要一个最小的根文件系统。这可以通过使用 debootstrap 等工具来创建。debootstrap是debian/ubuntu下的一个工具,用来构建一套基本的根文件系统,其生成的目录符合Linux文件系统标准(FHS),即包含了/boot、/etc、/bin、/usr等等目录,但它比发行版本的Linux体积小很多,当然功能也没那么强大,因此,只能说是“基本的系统”。

首先,在一个干净的 Linux 环境中,安装 debootstrap

sudo apt-get update
sudo apt-get install -y debootstrap

然后,使用 debootstrap 创建一个最小的 Debian 根文件系统:

# 创建Debian rootfs,测试使用官方源较慢,可以改为国内源https://mirrors.aliyun.com/debian
root@ubuntu:~/mydebian# sudo debootstrap --arch=amd64 stable ./my-rootfs http://deb.debian.org/debian/

root@ubuntu:~/mydebian# du -sh ./my-rootfs/
360M    ./my-rootfs/

root@ubuntu:~/mydebian# ls ./my-rootfs/
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

# 设置阿里云镜像源,对rootfs下面的镜像源文件进行修改
root@ubuntu:~/mydebian# cat my-rootfs/etc/apt/sources.list
deb http://mirrors.aliyun.com/debian/ stable main contrib non-free
deb http://mirrors.aliyun.com/debian/ stable-updates main contrib non-free
deb http://mirrors.aliyun.com/debian/ stable-backports main contrib non-free
deb http://mirrors.aliyun.com/debian-security stable-security main contrib non-free

这将会在当前目录下创建一个名为 my-rootfs 的目录,其中包含了最小的 Debian 文件系统。

说明:

  1. debootstrap支持的发行版本可以在/usr/share/debootstrap/scripts/查看,而各发行版代号可以到http://en.wikipedia.org/wiki/List_of_Ubuntu_releases查看。

  2. 如果是在arm环境下构建容器镜像,ARMv8 架构设置--arch=arm64ARMv7架构设置--arch=armhf,同时镜像源指向对应架构的源地址。例如:

sudo debootstrap --verbose --arch=arm64 xenial ./ubuntu-rootfs https://mirrors.aliyun.com/ubuntu-ports/

  1. 创建 Dockerfile

    创建一个 Dockerfile,并使用 scratch 作为基础镜像,然后将您的根文件系统复制到其中。

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

# 复制最小的 Debian 根文件系统到镜像中
COPY ./my-rootfs/ /

# 设置环境变量
ENV DEBIAN_FRONTEND=noninteractive

# 设置时区
RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone

# 安装基本工具
RUN apt-get update && \
    apt-get install -y --no-install-recommends \
    ca-certificates \
    curl \
    vim \
    git \
    wget \
    net-tools \
    iputils-ping \
    dnsutils \
    unzip \
    && rm -rf /var/lib/apt/lists/*

# 设置工作目录
WORKDIR /root

# 设置镜像作者信息
LABEL maintainer="your-email@example.com"

说明:

  1. scratch是Docker保留镜像,镜像名字避免使用该保留字,使用FROM scratch表示构建镜像中的第一个文件层。
  1. 构建基础镜像

    Dockerfile 所在目录下,使用以下命令构建镜像:

docker build -t mybasedebian:12.0 .

# 构建成功后查看镜像列表
root@ubuntu:~/mydebian# docker images
REPOSITORY                 TAG               IMAGE ID       CREATED         SIZE
mybasedebian               12.0              8b7f616a56d2   2 minutes ago   612MB

构建ubuntu基础镜像

这次我以构建一个ubuntu amd64架构xenial版本的容器镜像为例:

sudo debootstrap --verbose --arch=amd64 xenial ./ubuntu-rootfs https://mirrors.aliyun.com/ubuntu/

编写Dockerfile

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

# 复制最小的 Debian 根文件系统到镜像中
COPY ./ubuntu-rootfs/ /

# 设置环境变量
ENV DEBIAN_FRONTEND=noninteractive

# 设置时区
RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone

# 安装基本工具
RUN apt-get update && \
    apt-get install -y --no-install-recommends \
    ca-certificates \
    curl \
    wget \
    net-tools \
    iputils-ping \
    dnsutils \
    && rm -rf /var/lib/apt/lists/*

# 设置工作目录
WORKDIR /root

# 设置镜像作者信息
LABEL maintainer="your-email@example.com"

构建测试镜像:

# 构建
docker build -t mybaseubuntu:1.0 .

# 测试
root@ubuntu:~/build/ubuntu# docker images
REPOSITORY                                                    TAG               IMAGE ID       CREATED          SIZE
myubuntubase                                                  16.4              9d65bb9e40f8   5 minutes ago    301MB
root@ubuntu:~/build/ubuntu# docker run -it myubuntubase:16.4 bash
root@de5c43a4acfe:~# cat /etc/issue
Ubuntu 16.04 LTS \n \l

root@de5c43a4acfe:~# wget
wget: missing URL
Usage: wget [OPTION]... [URL]...

Try `wget --help' for more options.

构建centos基础镜像

# 创建文件夹存放rootfs
$ export centos_root='/centos_image/rootfs'
$ mkdir -p $centos_root
# 初始化rpm数据库
$ rpm --root $centos_root --initdb
# 下载安装centos-release包,包括镜像仓库
$ yum reinstall --downloadonly --downloaddir . centos-release
$ rpm --root $centos_root -ivh centos-release*.rpm
$ rpm --root $centos_root --import  $centos_root/etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

# 修改yum源
$ sed -i "s/^mirrorlist/#mirrorlist/g" $centos_root/etc/yum.repos.d/CentOS-*.repo
$ sed -i "s/^#baseurl/baseurl/g" $centos_root/etc/yum.repos.d/CentOS-*.repo
$ sed -i "s/mirror.centos.org/mirrors.aliyun.com/g" $centos_root/etc/yum.repos.d/CentOS-*.repo

# 安装yum,不安装docs
$ yum -y --installroot=$centos_root --setopt=tsflags='nodocs' install yum

# 配置yum以避免安装文档和其他非英语语言的文件。
$ sed -i "/distroverpkg=centos-release/a override_install_langs=en_US.utf8\ntsflags=nodocs" $centos_root/etc/yum.conf

# 安装工具
$ cp /etc/resolv.conf $centos_root/etc
# 挂载设备树
$ mount -o bind /dev $centos_root/dev
# 切换根目录并安装工具。
$ chroot $centos_root /bin/bash <<EOF
yum install -y procps-ng iputils
yum clean all
EOF

$ rm -f $centos_root/etc/resolv.conf
$ umount $centos_root/dev

# 安装配置docker
$ yum install -y docker
...
$ systemctl start docker

# 创建容器镜像
$ tar -C $centos_root -c . | docker import - centos
sha256:aab86dea3b579ac24906bfe99ab0fb051a848c9c6f9cce664242dbf8b772c6be
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              aab86dea3b57        20 seconds ago      335 MB

# 测试容器镜像
$ docker run --rm centos cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)

构建alpine基础镜像

也可以直接下载官方发布的rootfs,以 alpine为例,官方提供了rootfs下载,downloads | Alpine Linux

# 下载官方rootfs
root@ubuntu:~/build/alpine# wget https://dl-cdn.alpinelinux.org/alpine/v3.20/releases/x86_64/alpine-minirootfs-3.20.1-x86_64.tar.gz

# 编写Dockerfile
root@ubuntu:~/build/alpine# cat Dockfile
FROM scratch

# 维护者信息
LABEL maintainer="your-email@example.com"

# 添加根文件系统,可解压格式文件,会自动解压
ADD alpine-minirootfs-3.20.1-x86_64.tar.gz /

# 设置阿里云镜像源,注意与rootfs版本匹配
RUN echo 'https://mirrors.aliyun.com/alpine/v3.20/main' > /etc/apk/repositories \
    && echo 'https://mirrors.aliyun.com/alpine/v3.20/community' >> /etc/apk/repositories

# 更新软件包并安装常用测试工具
RUN apk update && apk upgrade \
    && apk add --no-cache iproute2 iputils busybox-extras net-tools bind-tools \
    && apk add --no-cache curl wget tcpdump nmap vim iperf iperf3

# 设置启动Container时默认执行的命令,这个可以在启动容器时覆盖
CMD ["/bin/sh"]

# 构建镜像
docker build -t myalpine:3.20.1 .

构建完成后进行测试:

root@ubuntu:~/build/alpine# docker run -it docker.io/library/myalpine:3.20.1 sh
/ # cat /etc/issue
Welcome to Alpine Linux 3.20
Kernel \r on an \m (\l)
/ # ls
bin    dev    etc    home   lib    media  mnt    opt    proc   root   run    sbin   srv    sys    tmp    usr    var

使用基础镜像构建应用镜像

验证镜像

以debian为例,构建完成后,运行以下命令来验证镜像:

docker run -it mybasedebian:12.0 /bin/bash

# 测试镜像正常
root@ubuntu:~/mydebian# docker run -it mybasedebian:12.0 /bin/bash
root@37fe3bb4abb5:~# cat /etc/issue
Debian GNU/Linux 12 \n \l

root@37fe3bb4abb5:~# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
12: eth0@if13: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
root@37fe3bb4abb5:~# curl
curl: try 'curl --help' or 'curl --manual' for more information
root@37fe3bb4abb5:~# wget
wget: missing URL
Usage: wget [OPTION]... [URL]...

Try `wget --help' for more options.

使用基础镜像构建其他镜像

创建一个新的 Dockerfile,并以上面构建的基础镜像进一步制作应用容器镜像:

FROM mybasedebian:12.0

# 安装nginx
RUN apt-get update && \
    apt-get install -y --no-install-recommends \
    nginx \
    && rm -rf /var/lib/apt/lists/*

# 暴露端口
EXPOSE 80

# 设置启动命令
CMD ["nginx", "-g", "daemon off;"]

构建新的镜像:

# 镜像构建
docker build -t mynginx:1.0 .

# 查看镜像
root@ubuntu:~/build/nginx# docker images
REPOSITORY             TAG               IMAGE ID       CREATED              SIZE
mynginx                1.0               792378cbb840   About a minute ago   698MB

测试镜像

# 基于构建的应用镜像运行容器
root@ubuntu:~/build/nginx# docker run -d mynginx:1.0
c35bd83ef7f1971594db47c01245822af3f76d86b9b801aeb62fd3ef9fb0bd2b

# 查询容器ip
root@ubuntu:~/build/nginx# docker inspect c35bd83ef7f19 | grep -i ipadd
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.2",
                    "IPAddress": "172.17.0.2",

# 测试nginx响应正常
root@ubuntu:~/build/nginx# curl 172.17.0.2
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

参考资料

  1. Base images | Docker Docs
  2. downloads | Alpine Linux
  3. Creating container base image of CentOS
  4. Creating minimal CentOS docker image from scratch

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/783054.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Mac可以卸载掉系统自带的软件吗 Mac第三方软件无法卸载是为什么

在使用Mac电脑时&#xff0c;有时候我们会发现系统预装的一些应用并不常用或者不符合个人需求&#xff0c;想要将它们卸载掉。然而&#xff0c;对于系统自带的软件&#xff0c;卸载并不简单&#xff0c;需要谨慎对待以免影响系统稳定性和功能正常运行。下面我们来看看Mac可以卸…

HTML-CSS 入门介绍

1.web 网站的工作流程 2.web前端开发 简单示例 <html> <head> <title>HTML快速入门</title> </head> <body> <h1>Hello HTML</h1> <img src1.jpg></img> <img src1.jp…

园区智慧能源可视化:智能监控与优化能源管理

通过图扑可视化技术&#xff0c;搭建智慧光伏园区&#xff0c;实时监控园区光伏系统的运行状态&#xff0c;分析数据并优化能源管理&#xff0c;提高发电效率和维护效率&#xff0c;助力园区实现绿色可持续发展。

windows上部署python3.11

hello&#xff0c;大家好&#xff0c;我是一名测试开发工程师&#xff0c;至今已在自动化测试领域深耕9个年头&#xff0c;现已将本人实战多年的多终端自动化测试框架【wyTest】开源啦&#xff0c;在接下来的一个月里&#xff0c;我将免费指导大家使用wyTest&#xff0c;请大家…

[C++][ProtoBuf][初识ProtoBuf]详细讲解

目录 1.序列化概念2.ProtoBuf是什么&#xff1f;3.ProtoBuf使用特点4.补充1.GOOGLE_PROTOBUF_VERIFY_VERSION 宏2.ShutdownProtobufLibrary()3.--decode 5.序列化能力对比验证6.总结 1.序列化概念 序列化&#xff1a;把对象转换为字节序列的过程&#xff0c;称为对象的序列化反…

PHP灵活用工任务小灵通微信小程序系统源码

&#x1f4bc;灵活赚钱新风尚&#xff01;灵活用工任务小灵通微信小程序&#xff0c;兼职自由两不误&#x1f680; &#x1f50d; 一、海量任务&#xff0c;随时随地接单赚外快 还在为找不到合适的兼职而烦恼吗&#xff1f;&#x1f914; 灵活用工任务小灵通微信小程序&#…

使用花生壳内网穿透实现(HTTP、TCP)公网访问

文章目录 相关费用域名费用http/https 映射服务 管理平台客户端添加设备添加 SSH 映射映射诊断SSH 连接APP 端 相关费用 域名费用 http/https 映射服务 注&#xff1a; http/https 映射服务是 永久 开通一次性费用。 管理平台 https://console.hsk.oray.com/home 客户端 下载…

Lumerical Algorithm 查找最接近给定透射率值的波长值

Lumerical Algorothm 查找最接近给定透射率值的波长值 引言正文引言 在 Lumerical Script 算法,查找数组中对应值的所有索引值 一文中我们简单介绍了 Lumerical 中的索引值获取算法,这里,我们来介绍一下如何查找最接近给定透射率值的波长值。 正文 比如我们有如下透射率图…

物料主数据BAPI 无法写入扩展(增强)字段问题

在使用BAPI_MATERIAL_SAVEDATA 去创建物料时&#xff0c;因为有增强字段。这时候需要通过extensionin 字段 进行赋值。 https://community.sap.com/t5/application-development-discussions/bapi-material-savedata-extensionin-dec-type-dump/m-p/11760099 但是赋值后仍然没…

食品制造业为什么需要EHS管理,EHS要怎么做才有效?

近年来&#xff0c;随着公众健康意识的显著提升&#xff0c;"舌尖上的安全"已成为广大消费者日益关注的焦点话题。这一趋势促使食品安全的监管力度不断加码&#xff0c;旨在构建一个更加安全、可靠的食品消费环境。 与此同时&#xff0c;ESG&#xff08;环境、社会与…

【日记】我就是世界上最幸福的人!(1124 字)

正文 今天想写的内容有点多&#xff0c;就不写在纸上了。 首先&#xff0c;最高兴的&#xff0c;还是我们的《艾尔登法环》有了进展。我和兄长终于通过了 “火山官邸&#xff1a;地底拷问所”。我真是不知道&#xff0c;我和他在这个地方被那两个掳人少女人拷问了多少次了。不仅…

Python 爬虫 tiktok关键词搜索用户数据信息 api接口

Tiktok APP API接口 Python 爬虫采集Tiktok数据 采集结果页面如下图&#xff1a; https://www.tiktok.com/search?qwwe&t1706679918408 请求API http://api.xxx.com/tt/search/user?keywordwwe&count10&offset0&tokentest 请求参数 返回示例 联系我们&…

Chatopera 聊天机器人讲师班 第二季,传授制作有趣有用的聊天机器人 | Chatopera

课程亮点 传授制作有趣有用的聊天机器人 提升找工作的竞争力 定制聊天机器人赚钱 制作课程&#xff0c;做培训赚钱 课程直播时间 2024 年 07 月 10 日 ~ 2024 年 07 月 22 日 上课形式 使用腾讯会议直播授课&#xff0c;可回放观看视频。 课程大纲 时间 内容 2024 年…

申请便宜多域名SSL证书CA渠道:Buypass

BuyPass作为一家专业的网络安全解决方案提供商&#xff0c;其SSL证书服务在业界享有盛誉。 申请Buypass六个月免费SSL证书步骤 1、输入域名&#xff0c;注意由于Buypass不支持泛域名&#xff0c;请不要勾选泛域名。 2、选择加密方式&#xff0c;一般选择默认就可以了&#xf…

跨越界限的温柔坚守

跨越界限的温柔坚守 —— 郑乃馨与男友的甜蜜抉择在这个光怪陆离、瞬息万变的娱乐圈里&#xff0c;每一段恋情像是夜空中划过的流星&#xff0c;璀璨短暂。然而&#xff0c;当“郑乃馨与男友甜蜜约会”的消息再次跃入公众视野&#xff0c;它不仅仅是一段简单的爱情故事&#xf…

王老师 linux c++ 通信架构 笔记(一)

&#xff08;0&#xff09;本门课程会涉及很多知识。在此集中记录&#xff0c;做笔记&#xff0c;也可能加入别的专栏。 &#xff08;1&#xff09; vmware 15 的下载和密钥上网查找。 ubuntu - 16 - 04 的版本才 800 M &#xff0c;来 csdn 找镜像 下载。 &#xff08;2&#…

Linux运维:MySQL备份,物理冷备份,热备,完备+二进制日志,mysqldump备份-A,-B

备份类型 完全备份、增量备份、差异备份 完全备份&#xff1a;整个数据集都备份 增量备份&#xff1a;仅备份最近一次完全备份或增量备份&#xff08;如果存在增量&#xff09;以来变化的数据&#xff0c;备份较快&#xff0c;还原复杂。 差异备份&#xff1a;对比前一次备…

【单片机毕业设计选题24045】-基于单片机的种子烘干机的设计与实现

系统功能: 检测温湿度&#xff0c;温度过低开启PTC加热&#xff0c;湿度过高开启风扇通风&#xff0c;红外检测模块监测小动物&#xff0c;发现小动物后蜂鸣器 报警&#xff0c;OLED显示系统信息&#xff0c;蓝牙模块连接手机APP。 系统上电后显示“欢迎使用种子烘干系统请稍…

BAT-致敬精简

什么是bat bat是windows的批处理程序&#xff0c;可以批量完成一些操作&#xff0c;方便快速。 往往我们可以出通过 winR键来打开指令窗口&#xff0c;这里输入的就是bat指令 这里就是bat界面 节约时间就是珍爱生命--你能想象以下2分钟的操作&#xff0c;bat只需要1秒钟 我…

第一周周日总结

题目总结 1.给你一个整数数组 hours&#xff0c;表示以 小时 为单位的时间&#xff0c;返回一个整数&#xff0c;表示满足 i < j 且 hours[i] hours[j] 构成 整天 的下标对 i, j 的数目。 整天 定义为时间持续时间是 24 小时的 整数倍 。 例如&#xff0c;1 天是 24 小时…