目錄
1 Docker鏡像基礎概念
1.1 什么是Docker鏡像
1.2 鏡像的分層結構
2 docker build命令詳解
2.1 docker build基本語法
2.2 構建上下文概念
3 Dockerfile編寫實踐示例
3.1 Dockerfile指令詳解
3.1.1 FROM
3.1.2 RUN
3.1.3 COPY vs ADD
3.1.4 CMD vs ENTRYPOINT
3.1.5 EXPOSE
3.1.6 ENV
3.2 多階段構建
4 構建過程優化技巧
4.1 利用構建緩存
4.2 .dockerignore文件
4.3 構建參數(--build-arg)
4.4 鏡像大小優化
5 常見問題與解決方案
5.1 構建速度慢
5.2 鏡像體積過大
5.3 構建緩存失效
6 總結
1 Docker鏡像基礎概念
1.1 什么是Docker鏡像
- Docker鏡像是一個輕量級、可執行的獨立軟件包,包含運行某個軟件所需的所有內容:代碼、運行時環境、系統工具、系統庫和設置
- 鏡像采用分層存儲結構,每一層都是只讀的,這種設計使得鏡像可以高效地共享和復用
- 鏡像與容器的關系可以理解為:鏡像是靜態的定義,容器是鏡像運行時的實體
- 容器可以被創建、啟動、停止、刪除、暫停等,而鏡像是這些容器運行的基礎
1.2 鏡像的分層結構
Docker鏡像采用分層(Layer)的架構,這種設計帶來了諸多優勢:
- 共享資源:多個鏡像可以共享相同的底層鏡像層
- 空間效率:當鏡像更新時,只需傳輸變更的部分
- 快速構建:構建時可以復用已存在的層
- 不可變性:每一層都是只讀的,確保一致性

典型的Docker鏡像分層結構:
- 最底層是基礎操作系統層
- 中間層包含運行環境和依賴
- 上層包含應用特定文件
- 最上層是容器運行時添加的可寫層
2 docker build命令詳解
2.1 docker build基本語法
- docker build命令用于根據Dockerfile構建鏡像,其基本語法如下:
docker build [OPTIONS] PATH | URL | -
常用選項說明:
- -t, --tag:指定鏡像名稱和標簽,格式為name:tag
- -f, --file:指定Dockerfile路徑(默認是上下文路徑下的Dockerfile)
- --build-arg:設置構建時的變量
- --no-cache:構建時不使用緩存
- --pull:總是嘗試拉取新版本的基礎鏡像
- --target:多階段構建時指定目標階段
2.2 構建上下文概念
構建上下文(Build Context)是指docker build命令中PATH參數指定的目錄及其子目錄,Docker客戶端會將整個上下文目錄打包發送給Docker守護進程,因此:
- 上下文過大時會導致構建過程變慢
- 應該通過.dockerignore文件排除不必要的文件
- Dockerfile中的COPY/ADD指令只能操作上下文中的文件

- 客戶端將構建上下文打包發送給守護進程
- 守護進程解析Dockerfile
- 按順序執行構建指令
- 生成最終鏡像并存儲在本地
3 Dockerfile編寫實踐示例
3.1 Dockerfile指令詳解
3.1.1 FROM
- 指定基礎鏡像,必須是Dockerfile的第一條有效指令:
FROM ubuntu:20.04
3.1.2 RUN
- 執行命令并創建新的鏡像層,常用于安裝軟件包:
RUN apt-get update && apt-get install -y \package1 \package2 \&& rm -rf /var/lib/apt/lists/*
3.1.3 COPY vs ADD
兩者都用于復制文件,但ADD有額外功能:
- COPY:簡單復制文件/目錄
COPY ./app /usr/src/app
- ADD:除復制外還能解壓壓縮文件、支持URL
ADD http://example.com/file.tar.gz /tmp/
3.1.4 CMD vs ENTRYPOINT
- CMD:提供容器默認的執行命令,可被覆蓋
CMD ["python", "app.py"]
- ENTRYPOINT:配置容器啟動時運行的命令,不易被覆蓋
ENTRYPOINT ["python"] CMD ["app.py"]
3.1.5 EXPOSE
- 聲明容器運行時監聽的端口:
EXPOSE 8080
3.1.6 ENV
- 設置環境變量,可被后續指令使用:
ENV NODE_ENV=production
3.2 多階段構建
- 多階段構建可以顯著減小最終鏡像大小:

- 最終鏡像只包含運行所需內容,不包含構建工具
- 減小鏡像體積
- 提高安全性(減少攻擊面)
4 構建過程優化技巧
4.1 利用構建緩存
Docker會緩存已構建的層,合理組織Dockerfile可以最大化利用緩存:
- 將變化頻率低的指令放在前面
- 將變化頻率高的指令(如COPY源代碼)放在后面
- 合并相關RUN命令減少層數
4.2 .dockerignore文件
- 類似于.gitignore,用于排除不需要加入構建上下文的文件:
# 忽略git目錄
.git/# 忽略日志文件
*.log# 忽略臨時文件
tmp/# 忽略本地配置文件
config/local.ini
4.3 構建參數(--build-arg)
- 允許構建時傳入變量,增加Dockerfile靈活性:
ARG VERSION=latest FROM ubuntu:$VERSION
- 構建時指定:
docker build --build-arg VERSION=20.04 -t myapp .
4.4 鏡像大小優化
- 使用輕量級基礎鏡像(如alpine)
- 多階段構建
- 清理不必要的文件(如apt緩存)
- 合并RUN指令減少層數
- 使用docker-slim等工具進一步優化
5 常見問題與解決方案
5.1 構建速度慢
可能原因及解決方案:
- 大構建上下文:優化.dockerignore,減少上下文大小
- 網絡延遲:使用本地鏡像倉庫或國內鏡像源
- 未充分利用緩存:合理組織Dockerfile指令順序
- 復雜構建步驟:考慮使用多階段構建分離構建和運行環境
5.2 鏡像體積過大
- 使用docker history 分析各層大小
- 刪除不必要的中間文件和緩存
- 使用alpine等小型基礎鏡像
- 采用多階段構建
5.3 構建緩存失效
- 指令順序改變
- 上游基礎鏡像更新
- 構建參數變化
- 上下文文件變化
6 總結
Docker鏡像構建是容器化應用的關鍵環節,掌握docker build和Dockerfile的細節能夠顯著提高開發效率和部署質量。通過合理利用多階段構建、構建緩存、.dockerignore文件等技術,可以創建出高效、安全且體積小的Docker鏡像,為容器化應用奠定堅實基礎。