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

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"]
| 問題 | 影響 | ||
|---|---|---|---|
| 基礎鏡像過大(Ubuntu ~120MB+) | 下載慢、佔空間、攻擊面大 | ||
多層 RUN 產生大量層 | 鏡像膨脹、快取失效率高 | ||
apt-get update 無快取 | 每次構建重新下載套件索引 | ||
| 安裝套件含文檔/語言包/開發頭文件 | 運行不需要的檔案佔空間 | ||
| 解壓後未清理原始壓縮檔 | 雙重佔用空間 | ||
| 未清理 apt 快取 | /var/lib/apt/lists/* 殘留 |
| 優化點 | 傳統寫法 | 極簡寫法 | 效果 |
|---|---|---|---|
| 基礎鏡像 | ubuntu:12.04 (~120MB) | alpine:latest (~5MB) | 基礎體積減少 95%+ |
| 套件管理器 | apt-get | apk | apk 更輕量、快取機制佳 |
| 安裝參數 | 無清理 | --update 隨用隨取 | 無殘留索引檔 |
| 檔案複製 | RUN curl ... unzip ... mv ... rm | COPY . /path | 建置期準備靜態檔,運行期零下載 |
| 層數 | 7+ 層 | 4 層 | 構建快、快取命中率高 |
| 最終鏡像大小 | ~300-500MB | ~8-12MB | 極致瘦身 |