來源:http://blog.csdn.net/update7
Docker簡介
Docker 是一個供軟體開發人員和系統管理員使用容器構建、運行和與分享應用程式的平臺,容器是在獨立環境中運行的行程,它運行在自己的檔案系統上,該檔案系統是使用 docker 鏡像構建的,鏡像中包含運行應用程式所需的一切(編譯后的代碼、依賴項、庫等等),鏡像使用 Dockerfile 檔案定義,
術語 dockerization 或 containerization 通常用于定義創建 Docker 容器的程序,
因為容器具備如下優點,所以很受歡迎:
- 靈活性:即使是最復雜的應用程式也可以容器化,
- 輕量化:容器共享主機內核,使得它們遠比虛擬機高效,
- 便攜性:可以做到本地編譯,到處運行,
- 松耦合:容器自我封裝,一個容器被替換或升級不會打斷別的容器,
- 安全性:容器對行程進行了嚴格的限制和隔離,而無需用戶進行任何配置,
在這篇文章中,我將重點討論如何優化 Docker 鏡像以使其輕量化,
優化程序
讓我們從一個示例開始,在該示例中,我們構建了一個 React 應用程式并將其容器化,運行 npx 命令并創建 Dockerfile 之后,我們得到了如圖 1 所示的檔案結構,
npx create-react-app app --template typescript

如果我們構建一個基礎的 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

第一步優化:使用輕量化基礎鏡像
在 Docker Hub(公共 Docker 倉庫)中,有一些鏡像可供下載,每個鏡像都有不同的特征和大小,
通常,相較于基于其他 Linux 發行版(例如 Ubuntu)的鏡像,基于 Alpine 或 BusyBox 的鏡像非常小,這是因為 Alpine 鏡像和類似的其他鏡像都經過了優化,其中僅包含最少的必須的軟體包,在下面的圖片中,你可以看到 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

第二步優化:多階段構建
通過多階段構建,我們可以在 Dockerfile 中使用多個基礎鏡像,并將編譯成品、組態檔等從一個階段復制到另一個階段,這樣我們就可以丟棄不需要的東西,
在本例中,我們部署 React 應用程式需要的是編譯后的代碼,我們不需要源檔案,也不需要 node_modules 目錄和 package.json 檔案等,
通過將 Dockerfile 修改為如下內容,我們最終得到的鏡像大小為 91.5MB,請記住,來自第一階段(第 1-4 行)的鏡像不會被自動洗掉,Docker 將它保存在 cache 中,如果我們在另一個構建鏡像程序中執行了相同的階段,就可以使鏡像構建更快,所以你必須手動洗掉第一階段鏡像,
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

現在我們有了一個 Dockerfile,它有兩個階段:在第一個階段中,我們編譯專案,在第二個階段中,我們在 web 服務器上部署應用程式,然而,Node 容器并不是提供網頁(HTML、CSS 和 JavaScript 檔案、圖片等)服務的最佳選擇,最好的選擇是使用像 Nginx 或 Apache 這樣的服務,
在本例中,我將使用 Nginx,另外,Nginx 系列面試題和答案全部整理好了,微信搜索?Java技術堆疊,在后臺發送:面試,?可以在線閱讀,
通過將 Dockerfile 修改為如下內容,我們的鏡像最終大小是 22.4MB,如果我們運行這個容器,我們可以看到網頁可以正常作業,沒有任何問題(圖 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;"]


近期熱文推薦:
1.1,000+ 道 Java面試題及答案整理(2021最新版)
2.別在再滿屏的 if/ else 了,試試策略模式,真香!!
3.臥槽!Java 中的 xx ≠ null 是什么新語法?
4.Spring Boot 2.5 重磅發布,黑暗模式太炸了!
5.《Java開發手冊(嵩山版)》最新發布,速速下載!
覺得不錯,別忘了隨手點贊+轉發哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/302354.html
標籤:其他
上一篇:分布式服務下,訊息中間件改造
