文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何构建更小的容器

2024-12-03 05:02

关注

[[399243]]

工具

以下例子所用到的主机操作系统是 Fedora Linux 33。例子使用 Podman 3.1.0 和Buildah 1.2.0。Podman 和 Buildah 已经预装在大多数 Fedora Linux 变种中。如果你没有安装 Podman 和 Buildah,可以用下边的命令安装:

  1. $ sudo dnf install -y podman buildah 

任务

从一个基础的例子开始。构建一个满足以下需求的 web 容器:

下边的步骤也适用于比较复杂的镜像。

设置

首先,创建一个工程目录。这个目录将会包含你的网站和容器文件:

  1. $ mkdir smallerContainer 
  2. $ cd smallerContainer 
  3. $ mkdir files 
  4. $ touch files/index.html 

制作一个简单的登录页面。对于这个演示,你可以将下面的 HTML 复制到 index.html 文件中。

  1. > 
  2. <html lang="de"> 
  3. <head> 
  4.   <title>Container Pagetitle> 
  5. head> 
  6. <body> 
  7.   <header> 
  8.     <h1>Container Pageh1> 
  9.   header> 
  10.   <main> 
  11.     <h2>Fedorah2> 
  12.     <ul> 
  13.       <li><a href="https://getfedora.org">Fedora Projecta>li> 
  14.       <li><a href="https://docs.fedoraproject.org/">Fedora Documentationa>li> 
  15.       <li><a href="https://fedoramagazine.org">Fedora Magazinea>li> 
  16.       <li><a href="https://communityblog.fedoraproject.org/">Fedora Community Bloga>li> 
  17.     ul> 
  18.     <h2>Podmanh2> 
  19.     <ul> 
  20.       <li><a href="https://podman.io">Podmana>li> 
  21.       <li><a href="https://docs.podman.io/">Podman Documentationa>li> 
  22.       <li><a href="https://github.com/containers/podman">Podman Codea>li> 
  23.       <li><a href="https://podman.io/blogs/">Podman Bloga>li> 
  24.     ul> 
  25.     <h2>Buildahh2> 
  26.     <ul> 
  27.       <li><a href="https://buildah.io">Buildaha>li> 
  28.       <li><a href="https://github.com/containers/buildah">Buildah Codea>li> 
  29.       <li><a href="https://buildah.io/blogs/">Buildah Bloga>li> 
  30.     ul> 
  31.     <h2>Skopeoh2> 
  32.     <ul> 
  33.       <li><a href="https://github.com/containers/skopeo">skopeo Codea>li> 
  34.     ul> 
  35.     <h2>CRI-Oh2> 
  36.     <ul> 
  37.       <li><a href="https://cri-o.io/">CRI-Oa>li> 
  38.       <li><a href="https://github.com/cri-o/cri-o">CRI-O Codea>li> 
  39.       <li><a href="https://medium.com/cri-o">CRI-O Bloga>li> 
  40.     ul> 
  41.   main> 
  42. body> 
  43. html> 

此时你可以选择在浏览器中测试上面的 index.html 文件:

  1. $ firefox files/index.html 

最后,创建一个容器文件。这个文件可以命名为 Dockerfile 或者 Containerfile:

  1. $ touch Containerfile 

现在你应该有了一个工程目录,并且该目录中的文件系统布局如下:

  1. smallerContainer/ 
  2. |- files/ 
  3. |    |- index.html 
  4. |- Containerfile 

构建

现在构建镜像。下边的每个阶段都会添加一层改进来帮助减小镜像的大小。你最终会得到一系列镜像,但只有一个 Containerfile。

阶段 0:一个基本的容器镜像

你的新镜像将会非常简单,它只包含强制性步骤。在 Containerfile 中添加以下内容:

  1. # 使用 Fedora 33 作为基镜像 
  2. FROM registry.fedoraproject.org/fedora:33 
  3. # 安装 httpd 
  4. RUN dnf install -y httpd 
  5. # 复制这个网站 
  6. COPY files/* /var/www/html/ 
  7. # 设置端口为 80/tcp 
  8. EXPOSE 80 
  9. # 启动 httpd 

在上边的文件中有一些注释来解释每一行内容都是在做什么。更详细的步骤:

运行下边的命令从工程目录创建一个新的镜像:

  1. $ podman image build -f Containerfile -t localhost/web-base 

使用一下命令来查看你的镜像的属性。注意你的镜像的大小(467 MB)。

  1. $ podman image ls 
  2. REPOSITORY                         TAG     IMAGE ID      CREATED        SIZE 
  3. localhost/web-base                 latest  ac8c5ed73bb5  5 minutes ago  467 MB 
  4. registry.fedoraproject.org/fedora  33      9f2a56037643  3 months ago   182 MB 

以上这个例子中展示的镜像在现在占用了467 MB的空间。剩下的阶段将会显著地减小镜像的大小。但是首先要验证镜像是否能够按照预期工作。

输入以下命令来启动容器:

  1. $ podman container run -d --name web-base -P localhost/web-base 

输入以下命令可以列出你的容器:

  1. $ podman container ls 
  2. CONTAINER ID  IMAGE               COMMAND               CREATED        STATUS            PORTS                  NAMES 
  3. 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 页面:

  1. $ firefox localhost:46191 

阶段 1:清除缓存并将残余的内容从容器中删除

为了优化容器镜像的大小,第一步应该总是执行“清理”。这将保证安装和打包所残余的内容都被删掉。这个过程到底需要什么取决于你的容器。对于以上的例子,只需要编辑 Containerfile 让它包含以下几行。

  1. [...] 
  2. # Install httpd 
  3. RUN dnf install -y httpd && \ 
  4.     dnf clean all -y 
  5. [...] 

构建修改后的 Containerfile 来显著地减小镜像(这个例子中是 237 MB)。

  1. $ podman image build -f Containerfile -t localhost/web-clean 
  2. $ podman image ls 
  3. REPOSITORY            TAG     IMAGE ID      CREATED        SIZE 
  4. localhost/web-clean   latest  f0f62aece028  6 seconds ago  237 MB 

阶段 2:删除文档和不需要的依赖包

许多包在安装时会被建议拉下来,包含一些弱依赖和文档。这些在容器中通常是不需要的,可以删除。 dnf 命令有选项可以表明它不需要包含弱依赖或文档。

再次编辑 Containerfile ,并在 dnf install 行中添加删除文档和弱依赖的选项:

  1. [...] 
  2. # Install httpd 
  3. RUN dnf install -y httpd --nodocs --setopt install_weak_deps=False && \ 
  4.     dnf clean all -y 
  5. [...] 

构建经过以上修改后的 Containerfile 可以得到一个更小的镜像(231 MB)。

  1. $ podman image build -f Containerfile -t localhost/web-docs 
  2. $ podman image ls 
  3. REPOSITORY            TAG     IMAGE ID      CREATED        SIZE 
  4. 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 镜像,如下所示:

  1. $ podman image search fedora-minimal 
  2. INDEX               NAME   DESCRIPTION   STARS   OFFICIAL   AUTOMATED 
  3. 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。

  1. # 使用 Fedora minimal 33 作为基镜像 
  2. FROM registry.fedoraproject.org/fedora-minimal:33 
  3. # 安装 httpd 
  4. RUN microdnf install -y httpd --nodocs --setopt install_weak_deps=0 && \ 
  5.     microdnf clean all -y 
  6. [...] 

使用 fedora-minimal 重新构建后的镜像大小如下所示 (169 MB):

  1. $ podman image build -f Containerfile -t localhost/web-docs 
  2. $ podman image ls 
  3. REPOSITORY             TAG     IMAGE ID      CREATED        SIZE 
  4. 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 脚本。除了运行这个脚本,你也可以在终端逐条地运行脚本中的命令,来更好的理解每一步都是做什么的。

  1. #!/usr/bin/env bash 
  2. set -o errexit 
  3. # 创建一个容器 
  4. CONTAINER=$(buildah from scratch) 
  5. # 挂载容器文件系统 
  6. MOUNTPOINT=$(buildah mount $CONTAINER) 
  7. # 安装一个基本的文件系统和最小的包以及 nginx 
  8. dnf install -y --installroot $MOUNTPOINT  --releasever 33 glibc-minimal-langpack httpd --nodocs --setopt install_weak_deps=False 
  9. dnf clean all -y --installroot $MOUNTPOINT --releasever 33 
  10. # 清除 
  11. buildah unmount $CONTAINER 
  12. # 复制网站 
  13. buildah copy $CONTAINER 'files/*' '/var/www/html/' 
  14. # 设置端口为 80/tcp 
  15. buildah config --port 80 $CONTAINER 
  16. # 启动 httpd 
  17. buildah config --cmd "httpd -DFOREGROUND" $CONTAINER 
  18. # 将容器保存为一个镜像 
  19. buildah commit --squash $CONTAINER web-scratch 

或者,可以通过将上面的脚本传递给 Buildah 来构建镜像。注意不需要 root 权限。

  1. $ buildah unshare bash web-scratch.sh 
  2. $ podman image ls 
  3. REPOSITORY             TAG     IMAGE ID      CREATED        SIZE 
  4. localhost/web-scratch  latest  acca45fc9118  9 seconds ago  155 MB 

最后的镜像只有 155 MB!而且 攻击面 也减少了。甚至在最后的镜像中都没有安装 DNF(或者 microDNF)。

结论

构建一个比较小的容器镜像有许多优点。减少所需要的带宽、磁盘占用以及攻击面,都会得到更好的镜像。只用很少的更改来减小镜像的大小很简单。许多更改都可以在不改变结果镜像的功能下完成。

只保存所需的二进制文件和配置文件来构建非常小的镜像也是可能的。

 

来源:Linux中国内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯