如何優(yōu)化Docker鏡像的大小詳解
什么是Docker
Docker是一個開源的虛擬化平臺,可以讓開發(fā)人員將應用程序和依賴項打包在輕量級容器中,然后可以輕松地在任何環(huán)境中運行。這樣,開發(fā)人員可以將容器作為獨立的可移植單元在不同的環(huán)境中部署和運行應用程序,而不用擔心環(huán)境的差異會對應用程序的行為產(chǎn)生影響。例如,您可以使用Docker在開發(fā)環(huán)境中測試應用程序,然后將容器部署到生產(chǎn)環(huán)境中運行??傊珼ocker可以讓開發(fā)人員更輕松地創(chuàng)建、部署和運行應用程序。
- 靈活性:即使是最復雜的應用程序也可以容器化。
- 輕量化:容器共享主機內(nèi)核,使得它們遠比虛擬機高效。
- 便攜性:可以做到本地編譯,到處運行。松耦合:容器自我封裝,一個容器被替換或升級不會打斷別的容器。
- 安全性:容器對進程進行了嚴格的限制和隔離,而無需用戶進行任何配置。
在這篇文章中,我將重點討論如何優(yōu)化 Docker 鏡像以使其輕量化。
優(yōu)化過程
讓我們從一個示例開始,在該示例中,我們構(gòu)建了一個 React 應用程序并將其容器化。運行 npx 命令并創(chuàng)建 Dockerfile 之后,我們得到了如圖 1 所示的文件結(jié)構(gòu)。
npx create-react-app app --template typescript
如果我們構(gòu)建一個基礎的 Dockerfile(如下所示),我們最終會得到一個 1.16 GB 的鏡像:
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
第一步優(yōu)化:使用輕量化基礎鏡像
在 Docker Hub(公共 Docker 倉庫)中,有一些鏡像可供下載,每個鏡像都有不同的特征和大小。
通常,相較于基于其他 Linux 發(fā)行版(例如 Ubuntu)的鏡像,基于 Alpine 或 BusyBox 的鏡像非常小。這是因為 Alpine 鏡像和類似的其他鏡像都經(jīng)過了優(yōu)化,其中僅包含最少的必須的軟件包。
在下面的圖片中,你可以看到 Ubuntu、Alpine、Node 和基于 Alpine 的 Node 鏡像之間的大小比較。
通過修改 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
第二步優(yōu)化:多階段構(gòu)建
通過多階段構(gòu)建,我們可以在 Dockerfile 中使用多個基礎鏡像,并將編譯成品、配置文件等從一個階段復制到另一個階段,這樣我們就可以丟棄不需要的東西。
我們部署 React 應用程序需要的是編譯后的代碼,我們不需要源文件,也不需要 node_modules 目錄和 package.json 文件等。
通過將 Dockerfile 修改為如下內(nèi)容,我們最終得到的鏡像大小為 91.5MB。請記住,來自第一階段(第 1-4 行)的鏡像不會被自動刪除,Docker 將它保存在 cache 中,如果我們在另一個構(gòu)建鏡像過程中執(zhí)行了相同的階段,就可以使鏡像構(gòu)建更快。所以你必須手動刪除第一階段鏡像。
FROM node:10-alpine AS build WORKDIR /app COPY app /app RUN npm install && npm run build FROM node:10-alpineWORKDIR /app RUN npm install -g webserver.local COPY --from=build /app/build ./build EXPOSE 3000 CMD webserver.local -d ./build
現(xiàn)在我們有了一個 Dockerfile,它有兩個階段:在第一個階段中,我們編譯項目,在第二個階段中,我們在 web 服務器上部署應用程序。
然而,Node 容器并不是提供網(wǎng)頁(HTML、CSS 和 JavaScript 文件、圖片等)服務的最佳選擇,最好的選擇是使用像 Nginx 或 Apache 這樣的服務。在本例中,我將使用 Nginx。
通過將 Dockerfile 修改為如下內(nèi)容,我們的鏡像最終大小是 22.4MB,如果我們運行這個容器,我們可以看到網(wǎng)頁可以正常工作,沒有任何問題。
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;"]
最終容器的運行結(jié)果
總結(jié)
您可以使用多種方法來優(yōu)化Docker鏡像大小。
這里列舉幾種常用的方法:
- 使用基礎鏡像:選擇一個較小的基礎鏡像來作為您的應用程序的鏡像。這樣,您的鏡像就不會包含多余的文件和依賴項。
- 使用多個鏡像:將您的應用程序拆分成多個鏡像,每個鏡像只包含一個特定的功能。這樣,您就可以在運行時動態(tài)加載鏡像,而不需要在每個鏡像中都包含所有功能。
- 壓縮鏡像:使用壓縮工具對鏡像進行壓縮,可以節(jié)省鏡像的空間。
- 清理無用文件:在構(gòu)建鏡像時,確保只包含必需的文件和依賴項。在構(gòu)建過程中,可以使用命令來清理緩存和無用的文件。
- 使用 alpine 版本的鏡像:alpine 版本的鏡像比普通版本的鏡像要小得多,因為它們只包含基本的 Linux 系統(tǒng)功能。因此,您可以使用 alpine 版本的鏡像來構(gòu)建您的應用程序。
- 刪除不必要的依賴項:在構(gòu)建鏡像時,確保只安裝必需的依賴
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
一文教你如何通過 Docker 快速搭建各種測試環(huán)境
這篇文章主要介紹了一文教你如何通過 Docker 快速搭建各種測試環(huán)境,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-07-07Ubuntu?環(huán)境下安裝?Docker環(huán)境詳解
這篇文章主要介紹了Ubuntu?環(huán)境下安裝?Docker環(huán)境詳解的相關(guān)資料,需要的朋友可以參考下2022-10-10修改Docker鏡像倉庫為阿里云鏡像或163鏡像的實現(xiàn)
docker本身的倉庫非常慢,但是國內(nèi)有阿里云的鏡像倉庫非???本文主要介紹了修改Docker鏡像倉庫為阿里云鏡像或163鏡像的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下2023-11-11docker 的java編譯環(huán)境構(gòu)建詳細介紹
這篇文章主要介紹了docker 的java編譯環(huán)境構(gòu)建詳細介紹的相關(guān)資料,具有一定的參考價值,需要的朋友可以參考下2016-11-11