日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
如何構(gòu)建更小的容器

如何構(gòu)建更小的容器

作者: LCTT RiaXu 2021-05-13 09:07:03
云計(jì)算 如果你開(kāi)發(fā)容器,你有想過(guò)減小鏡像的大小嗎?較小的鏡像有一些好處。這篇文章將會(huì)提供一些減小容器鏡像大小的技巧。

使用容器工作是很多用戶(hù)和開(kāi)發(fā)者的日常任務(wù)。容器開(kāi)發(fā)者經(jīng)常需要頻繁地(重新)構(gòu)建容器鏡像。如果你開(kāi)發(fā)容器,你有想過(guò)減小鏡像的大小嗎?較小的鏡像有一些好處。在下載的時(shí)候所需要的帶寬更少,而且在云環(huán)境中運(yùn)行的時(shí)候也可以節(jié)省開(kāi)銷(xiāo)。而且在 Fedora CoreOS、IoT 以及Silverblue 上使用較小的容器鏡像可以提升整體系統(tǒng)性能,因?yàn)檫@些操作系統(tǒng)嚴(yán)重依賴(lài)于容器工作流。這篇文章將會(huì)提供一些減小容器鏡像大小的技巧。

工具

以下例子所用到的主機(jī)操作系統(tǒng)是 Fedora Linux 33。例子使用 Podman 3.1.0 和Buildah 1.2.0。Podman 和 Buildah 已經(jīng)預(yù)裝在大多數(shù) Fedora Linux 變種中。如果你沒(méi)有安裝 Podman 和 Buildah,可以用下邊的命令安裝:

  
 
 
  1. $ sudo dnf install -y podman buildah 

任務(wù)

從一個(gè)基礎(chǔ)的例子開(kāi)始。構(gòu)建一個(gè)滿(mǎn)足以下需求的 web 容器:

  • 容器必須基于 Fedora Linux
  • 使用 Apache httpd web 服務(wù)器
  • 包含一個(gè)定制的網(wǎng)站
  • 容器應(yīng)該比較小

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

設(shè)置

首先,創(chuàng)建一個(gè)工程目錄。這個(gè)目錄將會(huì)包含你的網(wǎng)站和容器文件:

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

制作一個(gè)簡(jiǎn)單的登錄頁(yè)面。對(duì)于這個(gè)演示,你可以將下面的 HTML 復(fù)制到 index.html 文件中。

  
 
 
  1.  
  2.  
  3.  
  4.   Container Page 
  5.  
  6.  
  7.   
     
  8.     

    Container Page

     
  9.    
  10.   
     
  11.     

    Fedora

     
  12.     
       
    •       
    • Fedora Project
    •  
    •       
    • Fedora Documentation
    •  
    •       
    • Fedora Magazine
    •  
    •       
    • Fedora Community Blog
    •  
    •     
     
  13.     

    Podman

     
  14.     
       
    •       
    • Podman
    •  
    •       
    • Podman Documentation
    •  
    •       
    • Podman Code
    •  
    •       
    • Podman Blog
    •  
    •     
     
  15.     

    Buildah

     
  16.     
       
    •       
    • Buildah
    •  
    •       
    • Buildah Code
    •  
    •       
    • Buildah Blog
    •  
    •     
     
  17.     

    Skopeo

     
  18.     
       
    •       
    • skopeo Code
    •  
    •     
     
  19.     

    CRI-O

     
  20.     
       
    •       
    • CRI-O
    •  
    •       
    • CRI-O Code
    •  
    •       
    • CRI-O Blog
    •  
    •     
     
  21.    
  22.  
  23.  

此時(shí)你可以選擇在瀏覽器中測(cè)試上面的 index.html 文件:

  
 
 
  1. $ firefox files/index.html 

最后,創(chuàng)建一個(gè)容器文件。這個(gè)文件可以命名為 Dockerfile 或者 Containerfile:

  
 
 
  1. $ touch Containerfile 

現(xiàn)在你應(yīng)該有了一個(gè)工程目錄,并且該目錄中的文件系統(tǒng)布局如下:

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

構(gòu)建

現(xiàn)在構(gòu)建鏡像。下邊的每個(gè)階段都會(huì)添加一層改進(jìn)來(lái)幫助減小鏡像的大小。你最終會(huì)得到一系列鏡像,但只有一個(gè) Containerfile。

階段 0:一個(gè)基本的容器鏡像

你的新鏡像將會(huì)非常簡(jiǎn)單,它只包含強(qiáng)制性步驟。在 Containerfile 中添加以下內(nèi)容:

  
 
 
  1. # 使用 Fedora 33 作為基鏡像 
  2. FROM registry.fedoraproject.org/fedora:33 
  3. # 安裝 httpd 
  4. RUN dnf install -y httpd 
  5. # 復(fù)制這個(gè)網(wǎng)站 
  6. COPY files/* /var/www/html/ 
  7. # 設(shè)置端口為 80/tcp 
  8. EXPOSE 80 
  9. # 啟動(dòng) httpd 

在上邊的文件中有一些注釋來(lái)解釋每一行內(nèi)容都是在做什么。更詳細(xì)的步驟:

  • 在 FROM registry.fedoraproject.org/fedora:33 的基礎(chǔ)上創(chuàng)建一個(gè)構(gòu)建容器
  • 運(yùn)行命令: dnf install -y httpd
  • 將與 Containerfile 有關(guān)的文件拷貝到容器中
  • 設(shè)置 EXPOSE 80 來(lái)說(shuō)明哪個(gè)端口是可以自動(dòng)設(shè)置的
  • 設(shè)置一個(gè) CMD 指令來(lái)說(shuō)明如果從這個(gè)鏡像創(chuàng)建一個(gè)容器應(yīng)該運(yùn)行什么

運(yùn)行下邊的命令從工程目錄創(chuàng)建一個(gè)新的鏡像:

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

使用一下命令來(lái)查看你的鏡像的屬性。注意你的鏡像的大小(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 

以上這個(gè)例子中展示的鏡像在現(xiàn)在占用了467 MB的空間。剩下的階段將會(huì)顯著地減小鏡像的大小。但是首先要驗(yàn)證鏡像是否能夠按照預(yù)期工作。

輸入以下命令來(lái)啟動(dòng)容器:

  
 
 
  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 

以上展示的容器正在運(yùn)行,它正在監(jiān)聽(tīng)的端口是 46191 。從運(yùn)行在主機(jī)操作系統(tǒng)上的 web 瀏覽器轉(zhuǎn)到 localhost:46191 應(yīng)該呈現(xiàn)你的 web 頁(yè)面:

  
 
 
  1. $ firefox localhost:46191 

階段 1:清除緩存并將殘余的內(nèi)容從容器中刪除

為了優(yōu)化容器鏡像的大小,第一步應(yīng)該總是執(zhí)行“清理”。這將保證安裝和打包所殘余的內(nèi)容都被刪掉。這個(gè)過(guò)程到底需要什么取決于你的容器。對(duì)于以上的例子,只需要編輯 Containerfile 讓它包含以下幾行。

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

構(gòu)建修改后的 Containerfile 來(lái)顯著地減小鏡像(這個(gè)例子中是 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:刪除文檔和不需要的依賴(lài)包

許多包在安裝時(shí)會(huì)被建議拉下來(lái),包含一些弱依賴(lài)和文檔。這些在容器中通常是不需要的,可以刪除。 dnf 命令有選項(xiàng)可以表明它不需要包含弱依賴(lài)或文檔。

再次編輯 Containerfile ,并在 dnf install 行中添加刪除文檔和弱依賴(lài)的選項(xiàng):

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

構(gòu)建經(jīng)過(guò)以上修改后的 Containerfile 可以得到一個(gè)更小的鏡像(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:使用更小的容器基鏡像

前面的階段結(jié)合起來(lái),使得示例鏡像的大小減少了一半。但是仍然還有一些途徑來(lái)進(jìn)一步減小鏡像的大小。這個(gè)基鏡像 registry.fedoraproject.org/fedora:33 是通用的。它提供了一組軟件包,許多人希望這些軟件包預(yù)先安裝在他們的 Fedora Linux 容器中。但是,通用的 Fedora Linux 基鏡像中提供的包通常必須要的更多。Fedora 項(xiàng)目也為那些希望只從基本包開(kāi)始,然后只添加所需內(nèi)容來(lái)實(shí)現(xiàn)較小總鏡像大小的用戶(hù)提供了一個(gè) fedora-minimal 鏡像。

使用 podman image search 來(lái)查找 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。

當(dāng) registry.fedoraproject.org/fedora:33 被 registry.fedoraproject.org/fedora-minimal:33 替換后,需要用 microdnf 命令來(lái)替換 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 重新構(gòu)建后的鏡像大小如下所示 (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 

最開(kāi)始的鏡像大小是 467 MB。結(jié)合以上每個(gè)階段所提到的方法,進(jìn)行重新構(gòu)建之后可以得到最終大小為 169 MB 的鏡像。最終的 總 鏡像大小比最開(kāi)始的 基 鏡像小了 182 MB!

從零開(kāi)始構(gòu)建容器

前邊的內(nèi)容使用一個(gè)容器文件和 Podman 來(lái)構(gòu)建一個(gè)新的鏡像。還有最后一個(gè)方法要展示——使用 Buildah 來(lái)從頭構(gòu)建一個(gè)容器。Podman 使用與 Buildah 相同的庫(kù)來(lái)構(gòu)建容器。但是 Buildah 被認(rèn)為是一個(gè)純構(gòu)建工具。Podman 被設(shè)計(jì)來(lái)是為了代替 Docker 的。

使用 Buildah 從頭構(gòu)建的容器是空的——它里邊什么都 沒(méi)有 。所有的東西都需要安裝或者從容器外復(fù)制。幸運(yùn)地是,使用 Buildah 相當(dāng)簡(jiǎn)單。下邊是一個(gè)從頭開(kāi)始構(gòu)建鏡像的小的 Bash 腳本。除了運(yùn)行這個(gè)腳本,你也可以在終端逐條地運(yùn)行腳本中的命令,來(lái)更好的理解每一步都是做什么的。

  
 
 
  1. #!/usr/bin/env bash 
  2. set -o errexit 
  3. # 創(chuàng)建一個(gè)容器 
  4. CONTAINER=$(buildah from scratch) 
  5. # 掛載容器文件系統(tǒng) 
  6. MOUNTPOINT=$(buildah mount $CONTAINER) 
  7. # 安裝一個(gè)基本的文件系統(tǒng)和最小的包以及 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. # 復(fù)制網(wǎng)站 
  13. buildah copy $CONTAINER 'files/*' '/var/www/html/' 
  14. # 設(shè)置端口為 80/tcp 
  15. buildah config --port 80 $CONTAINER 
  16. # 啟動(dòng) httpd 
  17. buildah config --cmd "httpd -DFOREGROUND" $CONTAINER 
  18. # 將容器保存為一個(gè)鏡像 
  19. buildah commit --squash $CONTAINER web-scratch 

或者,可以通過(guò)將上面的腳本傳遞給 Buildah 來(lái)構(gòu)建鏡像。注意不需要 root 權(quán)限。

  
 
 
  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!而且 攻擊面 也減少了。甚至在最后的鏡像中都沒(méi)有安裝 DNF(或者 microDNF)。

結(jié)論

構(gòu)建一個(gè)比較小的容器鏡像有許多優(yōu)點(diǎn)。減少所需要的帶寬、磁盤(pán)占用以及攻擊面,都會(huì)得到更好的鏡像。只用很少的更改來(lái)減小鏡像的大小很簡(jiǎn)單。許多更改都可以在不改變結(jié)果鏡像的功能下完成。

只保存所需的二進(jìn)制文件和配置文件來(lái)構(gòu)建非常小的鏡像也是可能的。


當(dāng)前文章:如何構(gòu)建更小的容器
標(biāo)題路徑:http://www.5511xx.com/article/dhopeso.html