Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> 關於 Linux

Linux Docker 鏡像瘦身實戰:從 1GB 縮減至 10MB 的極簡 Dockerfile 寫法

編輯:關於 Linux

Docker 鏡像體積直接影響構建速度、部署時間、儲存成本與安全攻擊面。本文對比傳統 Ubuntu 基礎鏡像與 Alpine 極簡鏡像的 Dockerfile 寫法,示範如何將一個 Nginx + 2048 遊戲的鏡像從百 MB 級縮減至 10MB 以內,並解析關鍵優化原則。

鏡像體積對比

一、傳統寫法:Ubuntu 基礎鏡像(反面教材)

FROM ubuntu:12.04
RUN apt-get update
RUN apt-get install -y nginx zip curl
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
RUN curl -o /usr/share/nginx/www/master.zip -L https://codeload.github.com/gabrielecirulli/2048/zip/master
RUN cd /usr/share/nginx/www/ && unzip master.zip && mv 2048-master/* . && rm -rf 2048-master master.zip
EXPOSE 80
CMD ["/usr/sbin/nginx", "-c", "/etc/nginx/nginx.conf"]

問題分析

二、極簡寫法:Alpine 基礎鏡像(最佳實踐)

FROM alpine:latest
MAINTAINER alex 
RUN apk --update add nginx
COPY . /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

優化要點解析

問題影響
基礎鏡像過大(Ubuntu ~120MB+)下載慢、佔空間、攻擊面大
多層 RUN 產生大量層鏡像膨脹、快取失效率高
apt-get update 無快取每次構建重新下載套件索引
安裝套件含文檔/語言包/開發頭文件運行不需要的檔案佔空間
解壓後未清理原始壓縮檔雙重佔用空間
未清理 apt 快取/var/lib/apt/lists/* 殘留

三、進階瘦身技巧(通用原則)

1. 多階段建置 — 編譯環境與運行環境分離

# 階段 1:建置環境(含編譯工具、SDK)
FROM golang:1.21-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -o myapp

# 階段 2:運行環境(極簡)
FROM alpine:latest
RUN apk --no-cache add ca-certificates
COPY --from=builder /app/myapp /usr/local/bin/myapp
CMD ["myapp"]

2. 合併 RUN 指令減少層數

# 差:3 層
RUN apt-get update
RUN apt-get install -y nginx
RUN rm -rf /var/lib/apt/lists/*

# 好:1 層
RUN apt-get update && apt-get install -y nginx && rm -rf /var/lib/apt/lists/*

3. 使用 .dockerignore 排除無關檔案

# .dockerignore
.git
.gitignore
README.md
Dockerfile
*.log
node_modules
vendor
*.test
coverage

4. 清理套件管理器快取(同層完成)

# Debian/Ubuntu
RUN apt-get update && apt-get install -y  && apt-get clean && rm -rf /var/lib/apt/lists/*

# Alpine
RUN apk --update add  && rm -rf /var/cache/apk/*

# RHEL/CentOS
RUN yum install -y  && yum clean all && rm -rf /var/cache/yum/*

5. 移除文檔、語言包、開發頭文件

# Debian/Ubuntu
RUN apt-get install -y --no-install-recommends 

# Alpine 預設極簡,通常無需額外處理

6. 使用 distroless / scratch 基礎鏡像(極致)

# Google Distroless(僅含運行時依賴)
FROM gcr.io/distroless/static:nonroot
COPY --from=builder /app/myapp /myapp
USER 65532:65532
ENTRYPOINT ["/myapp"]

四、鏡像分析工具

# 查看鏡像層大小
docker history --no-trunc 

# 分析各層檔案佔用
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
  wagoodman/dive:latest 

# 檢視鏡像內容
docker export $(docker create ) | tar -tv

五、安全與合規加分項

  • 非 root 使用者執行:USER 1000:1000
  • 只讀根檔案系統:docker run --read-only
  • 掃描漏洞:trivy image 、docker scan
  • 簽名驗證:cosign sign / docker trust

遵循「單一職責、極簡基礎、多階段建置、同層清理」四大原則,配合 Alpine 或 Distroless 基礎鏡像,能將生產鏡像控制在極小體積,同時提升安全性與部署效率。

Copyright © Windows教程網 All Rights Reserved
優化點傳統寫法極簡寫法效果
基礎鏡像ubuntu:12.04 (~120MB)alpine:latest (~5MB)基礎體積減少 95%+
套件管理器apt-getapkapk 更輕量、快取機制佳
安裝參數無清理--update 隨用隨取無殘留索引檔
檔案複製RUN curl ... unzip ... mv ... rmCOPY . /path建置期準備靜態檔,運行期零下載
層數7+ 層4 層構建快、快取命中率高
最終鏡像大小~300-500MB~8-12MB極致瘦身