如何构建更小的容器
使用容器工作是很多用户和开发者的日常任务。容器开发者经常需要频繁地(重新)构建容器镜像。如果你开发容器,你有想过减小镜像的大小吗?较小的镜像有一些好处。在下载的时候所需要的带宽更少,而且在云环境中运行的时候也可以节省开销。而且在 Fedora CoreOS、IoT 以及Silverblue 上使用较小的容器镜像可以提升整体系统性能,因为这些操作系统严重依赖于容器工作流。这篇文章将会提供一些减小容器镜像大小的技巧。
工具
以下例子所用到的主机操作系统是 Fedora Linux 33。例子使用 Podman 3.1.0 和Buildah 1.2.0。Podman 和 Buildah 已经预装在大多数 Fedora Linux 变种中。如果你没有安装 Podman 和 Buildah,可以用下边的命令安装:
$ sudo dnf install -y podman buildah 任务
从一个基础的例子开始。构建一个满足以下需求的 web 容器:
容器必须基于 Fedora Linux 使用 Apache httpd web 服务器 包含一个定制的网站 容器应该比较小
下边的步骤也适用于比较复杂的镜像。
设置
首先,创建一个工程目录。这个目录将会包含你的网站和容器文件:
$ mkdir smallerContainer $ cd smallerContainer $ mkdir files $ touch files/index.html
制作一个简单的登录页面。对于这个演示,你可以将下面的 HTML 复制到 index.html如何 文件中。
<!doctype html> Container Page
Container Page
Fedora
- Fedora Project
- Fedora Documentation
- Fedora Magazine
- Fedora Community Blog
Podman
- Podman
- Podman Documentat构建ion
- Podman Code
- Podman Blog
Buildah
- Buildah
- Buildah Code
- Buildah Blog
Skopeo
- skopeo Code
CRI-O
- CRI-O
- CRI-O&nbs更小p;Code
- CRI-O Blog
此时你可以选择在浏览器中测试上面的 index.html 文件:
$ firefox files/index.html
最后,创建一个容器文件。这个文件可以命名为 Dockerfile 或者 Containerfile:
$ touch Containerfile
现在你应该有了一个工程目录,并且该目录中的文件系统布局如下:
smallerContainer/ |- files/ | |- index.html | |- Containerfile 构建
现在构建镜像。下边的每个阶段都会添加一层改进来帮助减小镜像的大小。你最终会得到一系列镜像,但只有一个 Containerfile。
阶段 0:一个基本的容器镜像
你的新镜像将会非常简单,它只包含强制性步骤。在 Containerfile 中添加以下内容:
# 使用 Fedora 33 作为基镜像 FROM registry.fedoraproject.org/fedora:33 # 安装 httpd RUN dnf install -y http的容d # 复制这个网站 COPY files/* /var/www/html/ # 设置端口为 80/tcp EXPOSE 80 # 启动 httpd
在上边的文件中有一些注释来解释每一行内容都是在做什么。更详细的步骤:
在 FROM registry.fedoraproject.org/fedora:33 的基础上创建一个构建容器 运行命令: dnf install -y httpd 将与 Containerfile 有关的文件拷贝到容器中 设置 EXPOSE 80 来说明哪个端口是可以自动设置的 设置一个 CMD 指令来说明如果从这个镜像创建一个容器应该运行什么
运行下边的命令从工程目录创建一个新的镜像:
$ podman image build -f Containerfile -t localhost/web-base
使用一下命令来查看你的镜像的属性。注意你的镜像的大小(467 MB)。
$ podman image ls REPOSITORY TAG IMAGE&nbs如何p;ID CREATED SIZE localhost/web-base latest ac8c5ed73bb5 5 minutes ago 467 MB registry.fedoraproject.org/fedora 33 9f2a56037643 3 months ago 182 MB
以上这个例子中展示的镜像在现在占用了467 MB的空间。剩下的阶段将会显著地减小镜像的大小。但是首先要验证镜像是否能够按照预期工作。
输入以下命令来启动容器:
$ podman container run -d --name web-base -P localhost/web-base
输入以下命令可以列出你的容器:
$ podman container ls C构建ONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d24063487f9f localhost/web-base httpd -DFOREGROUN... 2 seconds ago Up 3 seconds ago 0.0.0.0:46191->80/tcp web-base
以上展示的容器正在运行,它正在监听的端口是 46191 。从运行在主机操更小作系统上的 web 浏览器转到 localhost:46191 应该呈现你的 web 页面:
$ firefox localhost:46191 阶段 1:清除缓存并将残余的内容从容器中删除
为了优化容器镜像的大小,第一步应该总是执行“清理”。这将保证安装和打包所残余的内容都被删掉。这个过程到底需要什么取决于你的容器。对于以上的例子,只需要编辑 Containerfile 让它包含以下几行。
[...] # Install httpd RUN dnf install -y httpd && dnf clean all -y [...]
构建修改后的 Containerfile 来显著地减小镜像(这个例子中是 237 MB)。
$ podman image build -f Containerfile -t localhost/web-clean $ podman image ls REPOSITORY TAG IMAGE ID  的容;CREATED SIZE localhost/web-clean latest f0f62aece028 6 seconds ago 237 MB 阶段 2:删除文档和不需要的依赖包
许多包在安装时会被建议拉下来,包含一些弱依赖和文档。这些在容器中通常是不需要的,可以删除。 dnf 命令有选项可以表明它不需要包含弱依赖或文档。
再次编辑 Containerfile ,并在 dnf install 行中添加删除文档和弱依赖的选项:
[...] # Install httpd RUN dnf install -y httpd --nodocs --setopt install_weak_deps=False && dnf clean all -y [...]
构建经过以上修改后的 Containerfile 可以得到一个更小的镜像(231 MB)。
$ podman image build -f Containerfile -t localhost/web-docs $ podman如何 image ls REPOSITORY TAG IMAGE ID CREATED SIZE localhost/web-docs latest 8a76820cec2f 8 seconds ago 231 MB 阶段 3:使用更小的容器基镜像
前面的阶段结合起来,使得示例镜像的大小减少了一半。但是仍然还有一些途径来进一步减小镜像的大小。这个基镜像 registry.fedoraproject.org/fedora:33 是通用的。它提供了一组软件包,许多人希望这些软件包预先安装在他们的 Fedora Linux 容器中。但是,通用的 Fedora Linux 基镜像中提供的包通常必须要的更多。Fedora 项目也为那些希望只从基本包开始,然后只添加所需内容来实现较小总镜像大小的用户提供了一个 fedora-minimal 镜像。
使用 podman image search 来查找 fedora-minimal 镜像,如下所示:
$ podman image search fed构建ora-minimal INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED fedoraproject.org registry.fedoraproject.org/fedora-minimal
fedora-minimal 基镜像不包含 DNF,而是倾向于使用不需要 Python 的较小的 microDNF。
当 registry.fedoraproject.org/fedora:33 被 registry.fedoraproject.org/fedora-minimal:33 替换后,需要用 microdnf 命令来替换 dnf。
# 使用 Fedora minimal 33 作为基镜像 FROM registry.fedoraproject.org/fedora-minimal:33 # 安装 httpd RUN microdnf install -y httpd --nodocs --setopt install_weak_更小deps=0 && microdnf clean all -y [...]
使用 fedora-minimal 重新构建后的镜像大小如下所示 (169 MB):
$ podman image build -f Containerfile -t localhost/web-docs $ podman image ls REPOSITORY TAG IMAGE ID CREATED SIZE localhost/web-minimal latest e1603bbb1097 7 minutes ago 169 MB
最开始的镜像大小是 467 MB。结合以上每个阶段所提到的方法,进行重新构建之后可以得到最终大小为 169 MB 的镜像。最终的 总 镜像大小比最开始的 基 镜像小了 182 MB的容!
从零开始构建容器
前边的内容使用一个容器文件和 Podman 来构建一个新的镜像。还有最后一个方法要展示——使用 Buildah 来从头构建一个容器。Podman 使用与 Buildah 相同的库来构建容器。但是 Buildah 被认为是一个纯构建工具。Podman 被设计来是为了代替 Docker 的。
使用 Buildah 从头构建的容器是空的——它里边什么都 没有 。所有的东西都需要安装或者从容器外复制。幸运地是,使用 Buildah 相当简单。下边是一个从头开始构建镜像的小的 Bash 脚本。除了运行这个脚本,你也可以在终端逐条地运行脚本中的命令,来更好的理解每一步都是做什么的。
#!/usr/bin/env bash set -o errexit # 创建一个容器 CONTAINER=$(buildah from scratch) # 挂载容器文件系统 MOUNTPOINT=$(buildah mount $CONTAINER) # 安装一个基本的文件系统和最小的包以及 nginx dnf install -y --installroot $MOUNTPOINT --releasever 33 glibc-minimal-langpack httpd --nodocs --setopt install_weak_deps=False dnf clean如何 all -y --installroot $MOUNTPOINT --releasever 33 # 清除 buildah unmount $CONTAINER # 复制网站 buildah copy $CONTAINER 'files/*' '/var/www/html/' # 设置端口为 80/tcp buildah config --port 80 $CONTAINER # 启动 httpd buildah config --cmd "httpd -DFOREGROUND" $CONTAINER # 将容器保存为一个镜像 buildah commit --squash $CONTAINER web-scratch
或者,可以通过将上面的脚本传递给 Buildah 来构建镜像。注意不需要 root 权限。
$ buildah unshare bash web-scratch.sh $ podman image ls REPOSITORY &nb构建sp; TAG IMAGE ID CREATED SIZE localhost/web-scratch latest acca45fc9118 9 seconds ago 155 MB
最后的镜像只有 155 MB!而且 攻击面 也减少了。甚至在最后的镜像中都没有安装 DNF(或者 microDNF)。
结论
构建一个比较小的容器镜像有许多优点。减少所需要的带宽、磁盘占用以及攻击面,都会得到更好的镜像。只用很少的更改来减小镜像的大小很简单。许多更改都可以在不改变结果镜像的功能下完成。
只保存所需的二进制文件和配置文件来构建非常小的镜像也是可能的。
- ·标签: DeepSeek 梁文锋 腾讯控股 OpenClaw
- ·标签: 天美G1工作室 高敏 VincentGao 腾讯游戏
- ·谷歌Docs,现在已经可以自动生成文本摘要了!
- ·英伟达 CEO 黄仁勋确认投资马斯克初创公司 xAI
- ·AI模型在加密货币交易平台同台竞技:DeepSeek暂时领先,总资产增长130%
- ·抖音生活服务发布AIGC创作规范:团购带货视频严禁AI生成实景
- ·标签: 华为PuraXMax 奇瑞风云T9L 网络直播打赏 阔折叠手机
- ·OpenAI更新ChatGPT规则:10月29日起禁止医疗、法律与财务建议
- ·标签: 日本叮叮 广州威葵 蚊香液 消费欺诈
- ·消息称英国政府考虑阻止英伟达收购ARM
- ·标签: LeptonAI 贾扬清 英伟达 DGXCloudLepton
- ·腾讯:钱对我来说,就是一堆数字了
- ·腾讯开源HunyuanImage 2.1!2K高清神图秒生成,复杂提示精准控多主体,AI设计效率爆表?
- ·标签: 同创普润 高纯材料 溅射靶材 江丰电子
- ·硅谷版黑镜?亚马逊把仓库工作“游戏化”能缓解工人疲劳么
- ·Salesforce在爱尔兰办事处再裁员50人 此前曾宣布全球裁员10%
- ·标签: ST易购 客优仕 香港快行天下 家乐福中国
- ·美国FTC启动对Meta、OpenAI等AI聊天机器人调查,聚焦青少年安全
- ·Deezer 每日接收近 7.5 万首 AI 歌曲,呼吁行业共同应对
- ·标签: 字节跳动 薪酬调整 期权激励 新职级体系
- ·标签: 网络测评活动规范 国家网信办 市场监管总局 SEO关键词
- ·标签: 苹果 App Store Apple Ads 搜索广告
- ·标签: Oracle OCI AI算力 云基础设施
- ·标签: 徕芬 刘璇 智能戒指 Apple Watch
- ·重磅发布!中文互联网基础语料3.0助力AI发展,数据量高达120GB
- ·标签: SpaceX Cursor 微软 GitHubCopilot
- ·https://www.udc.co.uk/index.php?route=product/search&sort=p.price&order=DESC&tag=快排霸屏软件【tg:seogoogle987】,KwA
- ·https://www.yli.ro/catalogsearch/result/?q=快排霸屏软件【tg:seogoogle987】,MJq
- ·https://www.remit.co.jp/zh/?s=快排霸屏软件【tg:seogoogle987】,oKv
- ·https://www.world-architects.com/en/search?term=快排霸屏软件【tg:seogoogle987】,KOf
- ·https://www.duksung.ac.kr/search/front/Search.jsp?qt=快排霸屏软件【tg:seogoogle987】ceC
- ·https://www.wmfe.org/?s=快排霸屏软件【tg:seogoogle987】,rqR
- ·https://www.yidian51.com/taobao/快排霸屏软件【tg:seogoogle987】,8cy
- ·https://www.sebson.de/en/search?query=快排霸屏软件【tg:seogoogle987】,IcC
- ·https://www.hanbat.ac.kr/search/front/Search.jsp?qt=快排霸屏软件【tg:seogoogle987】UTv
- ·https://www.lifesciencesweden.se/search?q=快排霸屏软件【tg:seogoogle987】,ah4
- ·标签: 歌尔股份 2026年Q1财报 歌尔股份财报 歌尔股份业绩
- ·大数据为企业带来的6个好处
- ·全球首个具身智能开放平台上线!3D数字人第一次“开箱即用”:魔珐星云把大模型塞进百元芯片
- ·慌不慌?机器人开始有了一丝同理心,能预测机器人伙伴的下一动作!
- ·深度绑定阿里云!MiniMax大幅上修算力采购上限至5亿美元
- ·亚马逊将商家物流服务例行涨价计划推迟到明年6月
- ·零一万物宣布高管任命 联合创始人沈鹏飞领衔 加速ToB/ToG“一把手工程”
- ·云计算开发:Python练习实例-列表排序及连接
- ·Canva 推出全新 “创意操作系统”,全面升级数字营销工具
- ·云安全日报210824:红帽音频处理库发现任意代码执行漏洞,需要尽快升级
