介紹

幾個月前,在為客戶進行關鍵部署時,我們遇到了一個意想不到的問題:部署花了很長時間才完成。罪魁禍首?臃腫的 Docker 映像。這個過程不僅令人沮喪,而且還導致我們無法承受的停機時間。

這次經歷給了我一個重要的教訓:小改變可以產生大影響。透過優化 Docker 映像,我們成功地將部署時間縮短了一半,節省了儲存成本,並提高了 CI/CD 管道的整體效率。今天,我將分享我們用於實現這一轉變的策略。


為什麼要優化 Docker 映像?

如果您曾經經歷過緩慢的建置、較長的部署時間或充滿超大映像的混亂註冊表,那麼您並不孤單。這就是為什麼減小圖像尺寸至關重要:

  1. 更快的建置:您的開發週期變得更快,讓您專注於重要的事情。

  2. 高效儲存:較小的映像可以節省 Docker 註冊表和電腦上的磁碟空間。

  3. 更快的部署:透過網路部署較小的映像要快得多。

  4. 增強的安全性:更少的元件意味著更少的漏洞。


我們縮小 Docker 映像的那一天

我記得在我們優化之後第一次執行docker images 。看到“之前”和“之後”的尺寸感覺就像在健身幾週後踏上體重計一樣 - 您會注意到差異,並且感覺很有價值。

以下是我們為實現這項轉變所遵循的具體步驟:


優化 Docker 映像的 7 種有效方法

1. 選擇一個最小的基礎鏡像

我們沒有從ubuntu:latest或其他大圖像開始,而是切換到alpine 。這項變更將影像大小從 800MB 減少到不到 30MB。

例子:

FROM alpine:latest

2.使用多階段建置

在許多專案中,例如 React 應用程式,我們可能具有建置依賴項(例如 Node.js 和 npm),這些依賴項僅在建置過程中需要,但在生產映像中不需要。透過使用多階段建置,我們可以將建置環境與執行時間環境分開,從而得到更小的鏡像。

例子:

在此範例中,我們將為 React 應用程式使用多階段建置:

# Build Stage
FROM node:16 AS builder
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm install
COPY . .
RUN npm run build

# Runtime Stage
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
CMD ["nginx", "-g", "daemon off;"]

在上面的 Dockerfile 中

  • 第一階段使用官方的node:16鏡像來安裝依賴項、建立React應用程式並產生靜態檔案。

  • 第二階段使用較小的 nginx:alpine 映像來為建置的 React 應用程式提供服務。

這種多階段方法可確保最終映像中僅包含必要的建置工件(建置目錄),從而保持映像大小最小並針對生產進行最佳化。


3.刪除不需要的文件

在除錯時,我們經常在建置中包含臨時檔案。透過新增.dockerignore文件,我們確保這些文件永遠不會進入映像。

範例.dockerignore:

node_modules
*.log
.git

4. 組合並最小化圖層

Dockerfile中的每個指令(例如RUNCOPYADD )都會在 Docker 映像中建立一個新圖層。太多的層會使影像尺寸膨脹。透過將多個指令組合到單一RUN語句中,您可以減少層數並最佳化影像。

例子:

而不是寫:

RUN apt-get update  
RUN apt-get install -y curl vim  
RUN apt-get clean  
RUN rm -rf /var/lib/apt/lists/*

將它們合而為一:

RUN apt-get update && apt-get install -y curl vim \
    && apt-get clean && rm -rf /var/lib/apt/lists/*

這種方法最大限度地減少了層數,並確保臨時檔案(例如快取)在同一層內被刪除,從而使圖像更小、更乾淨。


5.避免安裝不必要的依賴項

最初,我們的 Docker 映像有額外的庫「以防萬一」。隨著時間的推移,我們意識到這會導致影像臃腫和不必要的安全風險。透過僅指定執行時實際需要的依賴項,我們使映像更小、更安全。

例如,我們沒有為每個專案安裝大量程式庫,而是專注於最小的依賴項並避免不必要的套件。


6.使用docker-slim

我們流程的遊戲規則改變者是docker-slim 。該工具會自動分析您的圖像並透過刪除不必要的部分(例如未使用的檔案、二進位和庫)來減少圖像的大小,而不會影響功能。

使用docker-slim ,我們發現映像大小減少了高達 80%,這使其成為我們優化策略中的寶貴工具。

縮小影像的命令:

docker-slim build <image-name>

7.定期審核和修剪影像

Docker 映像會隨著時間的推移而累積,未使用的映像或圖層可能會佔用寶貴的空間。定期審核和修剪未使用的映像有助於維護乾淨的環境。

您可以透過執行以下命令刪除未使用的映像和圖層:

修剪未使用影像的命令:

docker system prune -f

刪除所有未使用的圖像的命令:

docker image prune -a -f

透過將定期修剪納入您的工作流程,您可以確保您的 Docker 環境保持精簡且有效率。


衡量成功

實現這些最佳化後,我們使用docker images來比較大小。結果令人震驚:

  • 優化前: 1.2GB

  • 優化後: 250MB

我們的部署不僅變得更快,而且雲端儲存成本也顯著下降。


結論

優化 Docker 映像似乎是一項小任務,但它為您的工作流程帶來的好處是巨大的。無論您是獨立開發人員還是大型團隊的一員,這些策略都可以發揮真正的作用。

那麼,你還在等什麼?深入研究您的Dockerfile ,開始最佳化,並享受更精簡、更快速部署的好處。


參考

  1. Docker 官方文件

  2. 編寫 Dockerfile 的最佳實踐


原文出處:https://dev.to/thenanjay/docker-image-optimization-reducing-size-for-faster-deployments-489g


共有 0 則留言