幾個月前,在為客戶進行關鍵部署時,我們遇到了一個意想不到的問題:部署花了很長時間才完成。罪魁禍首?臃腫的 Docker 映像。這個過程不僅令人沮喪,而且還導致我們無法承受的停機時間。
這次經歷給了我一個重要的教訓:小改變可以產生大影響。透過優化 Docker 映像,我們成功地將部署時間縮短了一半,節省了儲存成本,並提高了 CI/CD 管道的整體效率。今天,我將分享我們用於實現這一轉變的策略。
如果您曾經經歷過緩慢的建置、較長的部署時間或充滿超大映像的混亂註冊表,那麼您並不孤單。這就是為什麼減小圖像尺寸至關重要:
更快的建置:您的開發週期變得更快,讓您專注於重要的事情。
高效儲存:較小的映像可以節省 Docker 註冊表和電腦上的磁碟空間。
更快的部署:透過網路部署較小的映像要快得多。
增強的安全性:更少的元件意味著更少的漏洞。
我記得在我們優化之後第一次執行docker images
。看到“之前”和“之後”的尺寸感覺就像在健身幾週後踏上體重計一樣 - 您會注意到差異,並且感覺很有價值。
以下是我們為實現這項轉變所遵循的具體步驟:
我們沒有從ubuntu:latest
或其他大圖像開始,而是切換到alpine
。這項變更將影像大小從 800MB 減少到不到 30MB。
例子:
FROM alpine:latest
在許多專案中,例如 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 應用程式提供服務。
這種多階段方法可確保最終映像中僅包含必要的建置工件(建置目錄),從而保持映像大小最小並針對生產進行最佳化。
在除錯時,我們經常在建置中包含臨時檔案。透過新增.dockerignore
文件,我們確保這些文件永遠不會進入映像。
範例.dockerignore:
node_modules
*.log
.git
Dockerfile
中的每個指令(例如RUN
、 COPY
、 ADD
)都會在 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/*
這種方法最大限度地減少了層數,並確保臨時檔案(例如快取)在同一層內被刪除,從而使圖像更小、更乾淨。
最初,我們的 Docker 映像有額外的庫「以防萬一」。隨著時間的推移,我們意識到這會導致影像臃腫和不必要的安全風險。透過僅指定執行時實際需要的依賴項,我們使映像更小、更安全。
例如,我們沒有為每個專案安裝大量程式庫,而是專注於最小的依賴項並避免不必要的套件。
docker-slim
我們流程的遊戲規則改變者是docker-slim
。該工具會自動分析您的圖像並透過刪除不必要的部分(例如未使用的檔案、二進位和庫)來減少圖像的大小,而不會影響功能。
使用docker-slim
,我們發現映像大小減少了高達 80%,這使其成為我們優化策略中的寶貴工具。
縮小影像的命令:
docker-slim build <image-name>
Docker 映像會隨著時間的推移而累積,未使用的映像或圖層可能會佔用寶貴的空間。定期審核和修剪未使用的映像有助於維護乾淨的環境。
您可以透過執行以下命令刪除未使用的映像和圖層:
修剪未使用影像的命令:
docker system prune -f
刪除所有未使用的圖像的命令:
docker image prune -a -f
透過將定期修剪納入您的工作流程,您可以確保您的 Docker 環境保持精簡且有效率。
實現這些最佳化後,我們使用docker images
來比較大小。結果令人震驚:
優化前: 1.2GB
優化後: 250MB
我們的部署不僅變得更快,而且雲端儲存成本也顯著下降。
優化 Docker 映像似乎是一項小任務,但它為您的工作流程帶來的好處是巨大的。無論您是獨立開發人員還是大型團隊的一員,這些策略都可以發揮真正的作用。
那麼,你還在等什麼?深入研究您的Dockerfile
,開始最佳化,並享受更精簡、更快速部署的好處。
原文出處:https://dev.to/thenanjay/docker-image-optimization-reducing-size-for-faster-deployments-489g