6.1 了解映像檔優化
Docker 映像檔雖然很小巧,但仍然會佔用空間。所以減小它們的大小是一項很重要的任務,這有助於改善效能,加速載入和部署容器,以及降低存儲成本。你可以通過改進 Dockerfile 來進行優化,因為它可以有很多不同的組織方式。在這節課程裡,我們將探討多種策略和最佳實踐,用來構建優化且輕量級的 Docker 映像檔。
為什麼減少 Docker 映像檔的大小很重要?
- 部署速度: 更小的映像檔可以更快地從 Docker registry 載入並部署到容器,這對自動化 CI/CD 系統尤為重要。
- 更高效的資源利用: 輕量級的映像檔佔用更少的磁碟空間,節省了網路在傳輸過程中的資源,並提供更高效的計算能力利用。
- 安全性: 更小的映像檔通常包含更少不必要的組件,這降低了潛在漏洞的風險。
- 簡化更新: 輕量級映像檔的更新速度更快,使用的資源更少,從而提升了維護的效率。
6.2 減少 Docker 映像檔尺寸的策略
1. 使用最小化的基礎映像檔
基礎映像檔的選擇會直接影響最終 Docker 映像檔的大小。使用諸如 alpine
這樣的最小化基礎映像檔,可以顯著減少映像檔的大小。
範例:
將 ubuntu
替換為 alpine
:
# FROM ubuntu:20.04
FROM alpine:3.12
alpine
是一個輕量級的 Linux 發行版,大小約為 5 MB,而 ubuntu
的映像檔可能會達到數百 MB。
2. 最小化層的數量
Dockerfile 中的每個指令都會增加新的層。將多個指令合併到單個 RUN
中可以減少層的數量,從而幫助降低映像檔的總大小。
範例:
優化前:
RUN apt-get update
RUN apt-get install -y curl
RUN apt-get install -y git
RUN rm -rf /var/lib/apt/lists/*
優化後:
RUN apt-get update && apt-get install -y curl git && rm -rf /var/lib/apt/lists/*
刪除套件管理員緩存 (rm -rf /var/lib/apt/lists/*)
會進一步刪去映像檔大小,移除安裝過程中的臨時文件。
3. 刪除臨時文件
安裝套件後刪除臨時文件和不需要的數據,有助於保持映像檔乾淨且輕量化。
範例:
RUN apt-get update && apt-get install -y curl git && \
apt-get clean && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
4. 使用 .dockerignore
.dockerignore
文件可以排除構建上下文中的不必要的文件和目錄,從而減少映像檔大小並加速構建過程。
.dockerignore
範例:
node_modules
dist
*.log
Dockerfile*
.dockerignore
5. 多階段構建 (multi-stage builds)
多階段構建允許使用多個中間映像檔來創建最終的輕量級映像檔,該映像檔僅包含必要的文件和依賴項。
範例:
# 構建階段
FROM node:14 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# 最終階段
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
在此範例中,第一个階段構建應用程式,而最終階段僅使用構建結果,進一步縮小最終映像檔的大小。
6. 優化套件安裝
僅安裝必要的套件以及利用套件管理員的最小安裝選項,可以降低映像檔的大小。
範例:
使用 --no-install-recommends
引數對於 apt-get
:
RUN apt-get update && apt-get install -y --no-install-recommends curl git && \
rm -rf /var/lib/apt/lists/*
7. 壓縮和最小化數據
使用工具進行數據壓縮和最小化,可以降低映像檔的大小。
範例:
壓縮文本文件和日誌:
RUN gzip /path/to/large/file.log
8. 刪除未使用的庫和依賴項
安裝必要套件後刪除未使用的庫和依賴項,有助於保持映像檔輕量化。
範例:
針對 Python 應用程式:
RUN pip install --no-cache-dir -r requirements.txt
6.3 優化的 Dockerfile 範例
範例 1: Node.js 的優化 Dockerfile
FROM node:14-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
這個範例使用了多階段構建。應用程式首先在中間階段完成構建,然後構建的結果被複製到基於 Nginx 的最終映像中。
範例 2: Python 的優化 Dockerfile
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "app.py"]
在這個範例中,使用的是輕量化的基礎映像 python:3.9-slim
。依賴項的安裝被獨立為一個步驟,這可以讓 Docker 利用快取功能,如果 requirements.txt
文件沒有改變的話。
GO TO FULL VERSION