CodeGym /Adesua ahorow /Docker SELF /優化 Dockerfile

優化 Dockerfile

Docker SELF
等級 14 , 課堂 0
開放

6.1 了解映像檔優化

Docker 映像檔雖然很小巧,但仍然會佔用空間。所以減小它們的大小是一項很重要的任務,這有助於改善效能,加速載入和部署容器,以及降低存儲成本。你可以通過改進 Dockerfile 來進行優化,因為它可以有很多不同的組織方式。在這節課程裡,我們將探討多種策略和最佳實踐,用來構建優化且輕量級的 Docker 映像檔。

為什麼減少 Docker 映像檔的大小很重要?

  1. 部署速度: 更小的映像檔可以更快地從 Docker registry 載入並部署到容器,這對自動化 CI/CD 系統尤為重要。
  2. 更高效的資源利用: 輕量級的映像檔佔用更少的磁碟空間,節省了網路在傳輸過程中的資源,並提供更高效的計算能力利用。
  3. 安全性: 更小的映像檔通常包含更少不必要的組件,這降低了潛在漏洞的風險。
  4. 簡化更新: 輕量級映像檔的更新速度更快,使用的資源更少,從而提升了維護的效率。

6.2 減少 Docker 映像檔尺寸的策略

1. 使用最小化的基礎映像檔

基礎映像檔的選擇會直接影響最終 Docker 映像檔的大小。使用諸如 alpine 這樣的最小化基礎映像檔,可以顯著減少映像檔的大小。

範例:

ubuntu 替換為 alpine:

dockerfile

# FROM ubuntu:20.04
FROM alpine:3.12

alpine 是一個輕量級的 Linux 發行版,大小約為 5 MB,而 ubuntu 的映像檔可能會達到數百 MB。

2. 最小化層的數量

Dockerfile 中的每個指令都會增加新的層。將多個指令合併到單個 RUN 中可以減少層的數量,從而幫助降低映像檔的總大小。

範例:

優化前:

dockerfile

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

優化後:

dockerfile

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

刪除套件管理員緩存 (rm -rf /var/lib/apt/lists/*) 會進一步刪去映像檔大小,移除安裝過程中的臨時文件。

3. 刪除臨時文件

安裝套件後刪除臨時文件和不需要的數據,有助於保持映像檔乾淨且輕量化。

範例:

dockerfile


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 範例:

Terminal


node_modules
dist
*.log
Dockerfile*
.dockerignore

5. 多階段構建 (multi-stage builds)

多階段構建允許使用多個中間映像檔來創建最終的輕量級映像檔,該映像檔僅包含必要的文件和依賴項。

範例:

dockerfile


# 構建階段
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:

dockerfile


RUN apt-get update && apt-get install -y --no-install-recommends curl git && \
    rm -rf /var/lib/apt/lists/*

7. 壓縮和最小化數據

使用工具進行數據壓縮和最小化,可以降低映像檔的大小。

範例:

壓縮文本文件和日誌:

dockerfile


RUN gzip /path/to/large/file.log

8. 刪除未使用的庫和依賴項

安裝必要套件後刪除未使用的庫和依賴項,有助於保持映像檔輕量化。

範例:

針對 Python 應用程式:

dockerfile


RUN pip install --no-cache-dir -r requirements.txt

6.3 優化的 Dockerfile 範例

範例 1: Node.js 的優化 Dockerfile

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

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 文件沒有改變的話。

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION