<ins id="jxy61"><option id="jxy61"><menu id="jxy61"></menu></option></ins>
          1. 煉數成金 門戶 大數據 虛擬化 查看內容

            Docker鏡像優化:如何從1.16GB優化到22.4MB

            2021-3-1 15:09| 發布者: 煉數成金_小數| 查看: 22335| 評論: 0|原作者: 小灰灰 譯|來自: 分布式實驗室

            摘要: Docker是軟件開發者和系統管理員用容器構建、運行和共享應用程序的平臺。一個容器是一個運行在隔離環境中、擁有自己的文件系統上的進程;這個文件系統是使用Docker鏡像構建的。鏡像文件包括運行應用程序所需的一切( ...
            Docker是軟件開發者和系統管理員用容器構建、運行和共享應用程序的平臺。一個容器是一個運行在隔離環境中、擁有自己的文件系統上的進程;這個文件系統是使用Docker鏡像構建的。鏡像文件包括運行應用程序所需的一切(編譯后的代碼、依賴關系、庫等)。鏡像可以使用一個名為Dockerfile的文件來定義。

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

            容器之所以流行,是因為它們具有以下一些特點:
            靈活:即使是最復雜的應用也可以被容器化。
            輕量級:容器共享主機內核,使其比虛擬機更高效。
            可移植:可在本地編譯并在任何地方運行。
            松耦合:容器各自是獨立封裝的,允許一個容器被替換或升級而不影響、中斷其他容器。
            安全:容器采用積極的限制和隔離策略,不需要用戶進行任何配置。

            在本篇文章中,我將專注于優化Docker鏡像以實現輕量級。

            讓我們從一個例子開始:在這個例子中,我們構建了一個React應用程序,我們想要將其Docker化。運行npx命令并創建Dockerfile后,我們的文件結構就像圖1一樣。
            npx create-react-app app --template typescript

            圖1 文件結構

            如果我們構建一個基礎的Dockerfile,我們會得到一個如下所示的1.16GB的Docker鏡像:
            FROM node:10

            WORKDIR /app
            COPY app /app
            RUN npm install -g webserver.local
            RUN npm install && npm run build

            EXPOSE 3000
            CMD webserver.local -d ./build

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

            初次優化:使用輕量級的基礎鏡像
            在Docker Hub(公共Docker倉庫)中,有多個鏡像可供下載,每個鏡像都有不同的特點和大小。

            通常情況下,基于Alpine或BusyBox的鏡像與基于Ubuntu等其他Linux發行版的鏡像相比,體積極小。這是因為Alpine和其他的鏡像已經被優化,包含了最少的但必要的軟件包。在下圖中,你可以看到Ubuntu、Alpine、Node和基于Alpine的Node基礎鏡像大小的對比。

            圖3 不同大小的基礎鏡像

            通過修改Dockerfile,使用Alpine作為基礎鏡像,最后我們的鏡像大小是330MB:
            FROM node:10-alpine

            WORKDIR /app
            COPY app /app
            RUN npm install -g webserver.local
            RUN npm install && npm run build

            EXPOSE 3000
            CMD webserver.local -d ./build

            圖4 鏡像優化后大小是330MB

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

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

            通過將Dockerfile改成下面這樣,我們的鏡像最終大小為91.5 MB。值得注意的是,上一階段的鏡像(第1-4行)不會自動刪除,Docker會將其保存在緩存中,以便我們在另一個構建中使用相同階段時運行速度更快,所以必須手動刪除。
            FROM node:10-alpine AS build
            WORKDIR /app
            COPY app /app
            RUN npm install && npm run build

            FROM node:10-alpine
            WORKDIR /app
            RUN npm install -g webserver.local
            COPY --from=build /app/build ./build
            EXPOSE 3000
            CMD webserver.local -d ./build

            圖5 在第二次優化以后鏡像的大小是91.5MB

            現在,我們有一個Docker文件,其中定義有兩個階段:在第一個階段,我們編譯項目。在第二個階段,我們將應用程序部署在Web服務器上。然而,Node容器并不是服務靜態資源(HTML、CSS和JavaScript文件、圖片等)的較佳選擇,較佳的選擇是使用像Nginx或Apache這樣的服務器。在這種情況下,我選擇使用Nginx。

            通過將Docker文件改成下面這樣,我們的鏡像最終大小為22.4 MB。如果我們運行這個容器,我們可以看到這個應用能夠正常工作(圖7)。
            FROM node:10-alpine AS build
            WORKDIR /app
            COPY app /app
            RUN npm install && npm run build

            FROM nginx:stable-alpine
            COPY --from=build /app/build /usr/share/nginx/html
            EXPOSE 80
            CMD ["nginx", "-g", "daemon off;"]

            圖6 在第三次優化以后鏡像大小為22.4MB7

            圖7 執行容器的最終結果

            原文鏈接:https://medium.com/the-agile-crafter/docker-image-optimization-from-1-16gb-to-22-4mb-53fdb4c53311

            聲明:文章收集于網絡,版權歸原作者所有,為傳播信息而發,如有侵權,請聯系小編刪除,謝謝!

            歡迎加入本站公開興趣群
            軟件開發技術群
            興趣范圍包括:Java,C/C++,Python,PHP,Ruby,shell等各種語言開發經驗交流,各種框架使用,外包項目機會,學習、培訓、跳槽等交流
            QQ群:26931708

            Hadoop源代碼研究群
            興趣范圍包括:Hadoop源代碼解讀,改進,優化,分布式系統場景定制,與Hadoop有關的各種開源項目,總之就是玩轉Hadoop
            QQ群:288410967 

            鮮花

            握手

            雷人

            路過

            雞蛋

            相關閱讀

            最新評論

            熱門頻道

            • 大數據

            即將開課

             

            GMT+8, 2021-4-9 02:54 , Processed in 0.195044 second(s), 25 queries .

            年轻人手机在线观看