<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

          共 2743字,需瀏覽 6分鐘

           ·

          2021-05-25 19:45

          來源:https://update.blog.csdn.net/article/details/112816434

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

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

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

          • 靈活性:即使是最復雜的應用程序也可以容器化。

          • 輕量化:容器共享主機內(nèi)核,使得它們遠比虛擬機高效。

          • 便攜性:可以做到本地編譯,到處運行。

          • 松耦合:容器自我封裝,一個容器被替換或升級不會打斷別的容器。

          • 安全性:容器對進程進行了嚴格的限制和隔離,而無需用戶進行任何配置。

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

          讓我們從一個示例開始,在該示例中,我們構建了一個 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 鏡像和類似的其他鏡像都經(jīng)過了優(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:經(jīng)過第一步優(yōu)化后鏡像大小為 330MB

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

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

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

          通過將 Dockerfile 修改為如下內(nèi)容,我們最終得到的鏡像大小為 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 容器并不是提供網(wǎng)頁(HTML、CSS 和 JavaScript 文件、圖片等)服務的最佳選擇,最好的選擇是使用像 Nginx 或 Apache 這樣的服務。在本例中,我將使用 Nginx。

          通過將 Dockerfile 修改為如下內(nèi)容,我們的鏡像最終大小是 22.4MB,如果我們運行這個容器,我們可以看到網(wǎng)頁可以正常工作,沒有任何問題(圖 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:最終容器的運行結果

          - END -


          31天拿下Kubernetes含金量最高的CKA+CKS證書!


           推薦閱讀 

          企業(yè)落地 Kubernetes 的核心技術方案
          這個程序占用CPU特別高!秒級定位線上問題
          從零開始搭建創(chuàng)業(yè)公司DevOps技術棧
          Linux 系統(tǒng)安全強化指南
          通過Nginx來實現(xiàn)禁止國外IP訪問網(wǎng)站
          不管你是開發(fā)還是運維,微服務這些你得知道!
          Shell 腳本進階,經(jīng)典用法及其案例
          搭建一套完整的企業(yè)級 K8s 集群(v1.20,kubeadm方式)
          60道常見的 Kubernetes 面試題總結



          點亮,服務器三年不宕機

          瀏覽 55
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

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

          手機掃一掃分享

          分享
          舉報
          <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在线播放 | 女同事的骚逼 | 天天添夜夜添免费视频 |