<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Docker鏡像優(yōu)化:從1.16GB到22.4MB,真強!

          共 2847字,需瀏覽 6分鐘

           ·

          2021-08-27 23:25

          上一篇:深夜看了張一鳴的微博,讓我越想越后怕

          來源:猿某某

          Docker簡介


          Docker 是一個供軟件開發(fā)人員和系統(tǒng)管理員使用容器構建、運行和與分享應用程序的平臺。容器是在獨立環(huán)境中運行的進程,它運行在自己的文件系統(tǒng)上,該文件系統(tǒng)是使用 docker 鏡像構建的。鏡像中包含運行應用程序所需的一切(編譯后的代碼、依賴項、庫等等)。鏡像使用 Dockerfile 文件定義。


          術語 dockerization 或 containerization 通常用于定義創(chuàng)建 Docker 容器的過程。


          因為容器具備如下優(yōu)點,所以很受歡迎:


          • 靈活性:即使是最復雜的應用程序也可以容器化。
          • 輕量化:容器共享主機內核,使得它們遠比虛擬機高效。
          • 便攜性:可以做到本地編譯,到處運行。
          • 松耦合:容器自我封裝,一個容器被替換或升級不會打斷別的容器。
          • 安全性:容器對進程進行了嚴格的限制和隔離,而無需用戶進行任何配置。


          在這篇文章中,我將重點討論如何優(yōu)化 Docker 鏡像以使其輕量化。


          優(yōu)化過程


          讓我們從一個示例開始,在該示例中,我們構建了一個 React 應用程序并將其容器化。運行 npx 命令并創(chuàng)建 Dockerfile 之后,我們得到了如圖 1 所示的文件結構。
          npx create-react-app app --template typescript

          圖 1:文件結構


          如果我們構建一個基礎的 Dockerfile(如下所示),我們最終會得到一個 1.16 GB 的鏡像:
          FROM node:10 WORKDIR /appCOPY app /appRUN npm install -g webserver.localRUN npm install && npm run build EXPOSE 3000CMD webserver.local -d ./build

          圖 2:鏡像的初始大小為 1.16GB


          第一步優(yōu)化:使用輕量化基礎鏡像


          在 Docker Hub(公共 Docker 倉庫)中,有一些鏡像可供下載,每個鏡像都有不同的特征和大小。


          通常,相較于基于其他 Linux 發(fā)行版(例如 Ubuntu)的鏡像,基于 Alpine 或 BusyBox 的鏡像非常小。這是因為 Alpine 鏡像和類似的其他鏡像都經過了優(yōu)化,其中僅包含最少的必須的軟件包。在下面的圖片中,你可以看到 Ubuntu、Alpine、Node 和基于 Alpine 的 Node 鏡像之間的大小比較。


          圖 3:基礎鏡像的不同大小


          通過修改 Dockerfile 并使用 Alpine 作為基礎鏡像,我們的鏡像最終大小為 330MB:

          FROM node:10-alpine WORKDIR /appCOPY app /appRUN npm install -g webserver.localRUN npm install && npm run build EXPOSE 3000CMD webserver.local -d ./build

          圖 4:經過第一步優(yōu)化后鏡像大小為 330MB


          第二步優(yōu)化:多階段構建


          通過多階段構建,我們可以在 Dockerfile 中使用多個基礎鏡像,并將編譯成品、配置文件等從一個階段復制到另一個階段,這樣我們就可以丟棄不需要的東西。


          在本例中,我們部署 React 應用程序需要的是編譯后的代碼,我們不需要源文件,也不需要 node_modules 目錄和 package.json 文件等。


          通過將 Dockerfile 修改為如下內容,我們最終得到的鏡像大小為 91.5MB。請記住,來自第一階段(第 1-4 行)的鏡像不會被自動刪除,Docker 將它保存在 cache 中,如果我們在另一個構建鏡像過程中執(zhí)行了相同的階段,就可以使鏡像構建更快。所以你必須手動刪除第一階段鏡像。

          FROM node:10-alpine AS buildWORKDIR /appCOPY app /appRUN npm install && npm run build  FROM node:10-alpineWORKDIR /appRUN npm install -g webserver.localCOPY --from=build /app/build ./buildEXPOSE 3000CMD webserver.local -d ./build

          圖 5:第二步優(yōu)化后的鏡像大小為 91.5MB


          現(xiàn)在我們有了一個 Dockerfile,它有兩個階段:在第一個階段中,我們編譯項目,在第二個階段中,我們在 web 服務器上部署應用程序。然而,Node 容器并不是提供網頁(HTML、CSS 和 JavaScript 文件、圖片等)服務的最佳選擇,最好的選擇是使用像 Nginx 或 Apache 這樣的服務。在本例中,我將使用 Nginx。


          通過將 Dockerfile 修改為如下內容,我們的鏡像最終大小是 22.4MB,如果我們運行這個容器,我們可以看到網頁可以正常工作,沒有任何問題(圖 7)。
          FROM node:10-alpine AS buildWORKDIR /appCOPY app /appRUN npm install && npm run build  FROM nginx:stable-alpineCOPY --from=build /app/build /usr/share/nginx/htmlEXPOSE 80CMD ["nginx", "-g", "daemon off;"]

          圖 6:第三步優(yōu)化后的鏡像大小為 22.4MB


          圖 7:最終容器的運行結果


          感謝您的閱讀,也歡迎您發(fā)表關于這篇文章的任何建議,關注我,技術不迷茫!小編到你上高速。

              · END ·
          最后,關注公眾號互聯(lián)網架構師,在后臺回復:2T,可以獲取我整理的 Java 系列面試題和答案,非常齊全


          正文結束


          推薦閱讀 ↓↓↓

          1.不認命,從10年流水線工人,到谷歌上班的程序媛,一位湖南妹子的勵志故事

          2.如何才能成為優(yōu)秀的架構師?

          3.從零開始搭建創(chuàng)業(yè)公司后臺技術棧

          4.程序員一般可以從什么平臺接私活?

          5.37歲程序員被裁,120天沒找到工作,無奈去小公司,結果懵了...

          6.IntelliJ IDEA 2019.3 首個最新訪問版本發(fā)布,新特性搶先看

          7.這封“領導痛批95后下屬”的郵件,句句扎心!

          8.15張圖看懂瞎忙和高效的區(qū)別!

          一個人學習、工作很迷茫?


          點擊「閱讀原文」加入我們的小圈子!

          瀏覽 22
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  九九九九影院 | 国产熟女精品av 国产无码激情后入 | 天天爽天天日 | 亚洲无码免费视频在线观看 | 亚洲成人影视在线播放 |