成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何構建更小的容器

云計算
如果你開發容器,你有想過減小鏡像的大小嗎?較小的鏡像有一些好處。這篇文章將會提供一些減小容器鏡像大小的技巧。

使用容器工作是很多用戶和開發者的日常任務。容器開發者經常需要頻繁地(重新)構建容器鏡像。如果你開發容器,你有想過減小鏡像的大小嗎?較小的鏡像有一些好處。在下載的時候所需要的帶寬更少,而且在云環境中運行的時候也可以節省開銷。而且在 Fedora CoreOS、IoT 以及Silverblue 上使用較小的容器鏡像可以提升整體系統性能,因為這些操作系統嚴重依賴于容器工作流。這篇文章將會提供一些減小容器鏡像大小的技巧。

[[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 容器:

  • 容器必須基于 Fedora Linux
  • 使用 Apache httpd web 服務器
  • 包含一個定制的網站
  • 容器應該比較小

下邊的步驟也適用于比較復雜的鏡像。

設置

首先,創建一個工程目錄。這個目錄將會包含你的網站和容器文件:

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

制作一個簡單的登錄頁面。對于這個演示,你可以將下面的 HTML 復制到 index.html 文件中。

  1. <!doctype html> 
  2. <html lang="de"> 
  3. <head> 
  4.   <title>Container Page</title> 
  5. </head> 
  6. <body> 
  7.   <header> 
  8.     <h1>Container Page</h1> 
  9.   </header> 
  10.   <main> 
  11.     <h2>Fedora</h2> 
  12.     <ul> 
  13.       <li><a href="https://getfedora.org">Fedora Project</a></li> 
  14.       <li><a href="https://docs.fedoraproject.org/">Fedora Documentation</a></li> 
  15.       <li><a href="https://fedoramagazine.org">Fedora Magazine</a></li> 
  16.       <li><a href="https://communityblog.fedoraproject.org/">Fedora Community Blog</a></li> 
  17.     </ul> 
  18.     <h2>Podman</h2> 
  19.     <ul> 
  20.       <li><a href="https://podman.io">Podman</a></li> 
  21.       <li><a href="https://docs.podman.io/">Podman Documentation</a></li> 
  22.       <li><a href="https://github.com/containers/podman">Podman Code</a></li> 
  23.       <li><a href="https://podman.io/blogs/">Podman Blog</a></li> 
  24.     </ul> 
  25.     <h2>Buildah</h2> 
  26.     <ul> 
  27.       <li><a href="https://buildah.io">Buildah</a></li> 
  28.       <li><a href="https://github.com/containers/buildah">Buildah Code</a></li> 
  29.       <li><a href="https://buildah.io/blogs/">Buildah Blog</a></li> 
  30.     </ul> 
  31.     <h2>Skopeo</h2> 
  32.     <ul> 
  33.       <li><a href="https://github.com/containers/skopeo">skopeo Code</a></li> 
  34.     </ul> 
  35.     <h2>CRI-O</h2> 
  36.     <ul> 
  37.       <li><a href="https://cri-o.io/">CRI-O</a></li> 
  38.       <li><a href="https://github.com/cri-o/cri-o">CRI-O Code</a></li> 
  39.       <li><a href="https://medium.com/cri-o">CRI-O Blog</a></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 

在上邊的文件中有一些注釋來解釋每一行內容都是在做什么。更詳細的步驟:

  • 在 FROM registry.fedoraproject.org/fedora:33 的基礎上創建一個構建容器
  • 運行命令: dnf install -y httpd
  • 將與 Containerfile 有關的文件拷貝到容器中
  • 設置 EXPOSE 80 來說明哪個端口是可以自動設置的
  • 設置一個 CMD 指令來說明如果從這個鏡像創建一個容器應該運行什么

運行下邊的命令從工程目錄創建一個新的鏡像:

  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中國
相關推薦

2019-05-22 15:36:22

Linux容器鏡像

2019-03-28 10:20:09

容器鏡像系統運維Linux

2019-09-10 13:34:30

Linux操作系統軟件

2024-06-06 11:54:35

2018-07-16 22:40:21

CPU容器

2018-07-16 22:13:54

CPU容器

2023-11-03 13:20:13

Kubernetes

2019-12-16 12:11:53

Docker容器Kubernetes

2020-05-20 12:30:44

容器Linux系統

2020-11-23 18:39:54

容器Kubernetes架構

2022-06-02 12:56:25

容器網絡云原生

2018-07-30 09:00:19

容器Docker鏡像

2019-01-31 10:25:24

Windows 10文本大小

2019-05-24 13:30:57

PiShrink樹莓派Linux

2019-10-30 12:00:02

Ansible容器與云容器鏡像

2023-09-14 09:31:21

Docker容器

2023-07-10 08:26:19

2010-10-12 13:57:43

GoogleWebP

2019-04-11 17:57:22

容器互聯網公司開發

2017-12-30 00:23:10

容器開源
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品观看 | 久久久精品影院 | 一区二区在线免费播放 | 97高清国语自产拍 | 日韩综合在线视频 | 在线播放第一页 | 亚洲视频一区二区三区 | 日本中文在线视频 | 亚洲精彩免费视频 | 台湾a级理论片在线观看 | 免费人成在线观看网站 | 午夜不卡一区二区 | 男人天堂网址 | 亚洲一区二区三区免费观看 | www.99热.com | 国产精品a免费一区久久电影 | 一级看片免费视频囗交动图 | 日韩精品在线一区 | 精品一区二区久久 | 亚洲一区二区电影在线观看 | 久久久久久影院 | 91免费视频观看 | 日韩欧美大片 | 色毛片 | 隔壁老王国产在线精品 | 国产精品久久精品 | 欧美黄色网络 | 中国一级特黄真人毛片 | 日韩一区二区三区在线视频 | 91精产国品一二三区 | 国产成人精品久久二区二区91 | 国产特一级黄色片 | 精品国产一区二区三区免费 | 欧美一区二区免费电影 | 婷婷综合五月天 | 亚洲成av人片在线观看无码 | 久草视频在线播放 | 免费观看一级特黄欧美大片 | 欧美一卡二卡在线观看 | 91.色| 亚洲啊v在线|