Docker鏡像基本概念與構建指南
一、Docker鏡像基本概念
Docker鏡像是容器運行的基礎,包含應用程序及其運行所需的文件系統、依賴庫、環境變量和配置。其核心特性包括:
- 只讀性:鏡像本身不可修改,容器運行時在鏡像層之上創建可寫層。
- 分層存儲:由多個只讀層(Layer)疊加組成,每層對應Dockerfile中的一個指令。
- 可移植性:鏡像通過注冊中心(如Docker?Hub)實現跨環境部署。
二、鏡像的分層結構
1. 分層機制原理
- 聯合文件系統(UnionFS):將多個目錄(層)掛載到同一虛擬目錄,上層文件覆蓋下層同名文件。
- 層復用性:相同層的鏡像可共享存儲,減少磁盤占用。例如,基于ubuntu:22.04的多個鏡像共享基礎層。
- 寫時復制(Copy-on-Write):容器修改文件時,僅復制目標層到可寫層,不影響原始鏡像。
2. 典型分層示例
FROM?ubuntu:22.04 ????????# 基礎鏡像層(Layer 1)
RUN?apt-get?update ???????# 軟件源更新層(Layer 2)
COPY?app /opt/app ????????# 文件復制層(Layer 3)
CMD?["/opt/app/start.sh"] # 啟動命令層(Layer 4)
每層生成唯一哈希值,修改任意指令會重建后續所有層。
三、構建鏡像的詳細步驟
1. 編寫Dockerfile
# 指定基礎鏡像
FROM?python:3.9-slim
# 設置工作目錄
WORKDIR?/app
# 安裝依賴
COPY?requirements.txt .
RUN?pip?install --no-cache-dir?-r?requirements.txt
# 復制應用代碼
COPY?. .
# 暴露端口
EXPOSE?8000
# 啟動命令
CMD?["gunicorn", "app:app", "--bind", "0.0.0.0:8000"]
2. 構建鏡像
# -t指定鏡像標簽,.表示構建上下文路徑
docker?build -t?myapp:v1 .
# 查看構建過程日志(顯示分層詳情)
docker?build --progress=plain -t?myapp:v1 .
3. 驗證與優化
- 檢查分層結構:
?history myapp:v1
- 多階段構建(減少鏡像體積):
構建階段
FROM?golang:1.20 AS?builder
WORKDIR?/src
COPY?. .
RUN?go?build -o?/app
運行階段
FROM?alpine:3.18
COPY?--from=builder?/app /app
CMD?["/app"]
四、最佳實踐
- 精簡基礎鏡像:優先選擇Alpine、Distroless等輕量鏡像。
- 合并指令:減少層數,例如將多個RUN合并:
?apt-get?update &&?\
????apt-get install -y curl && \
????rm -rf /var/lib/apt/lists/*
- 使用.dockerignore:排除無關文件(如node_modules、.git)。
- 定期清理:刪除無用鏡像和中間層:
?system prune -a
五、常見問題
緩存失效:Dockerfile中指令順序變化會導致后續層緩存失效。
層大小控制:COPY/ADD指令會生成新層,大文件建議通過卷(Volume)掛載。
安全掃描:使用docker scan檢測鏡像漏洞。