Skip to content

2. Docker 基本操作(含 Dockerfile 教學)

目標:看完就能自己寫出可用的 Dockerfile,並懂快取、權限、安全與常見坑。

2.1 Image 與 Layer 心法

  • Image 是一層一層的快照;Builder 從上到下比對每層,沒變就用快取 → 把最常變的步驟放後面(如 COPY . .)。
  • 盡量把「安裝依賴」與「複製程式碼」分開,善用快取。

2.2 最小可用 Dockerfile(Python/Flask)

# syntax=docker/dockerfile:1
FROM python:3.12-slim

# 讓輸出不緩衝、避免 .pyc
ENV PYTHONUNBUFFERED=1 PYTHONDONTWRITEBYTECODE=1
WORKDIR /app

# 先裝依賴(快取友善)
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 再複製程式碼(最常變)
COPY . .

# 非 root(安全)
RUN useradd -m appuser
USER appuser

# 文件化暴露埠(不等於開放)
EXPOSE 8080

# 容器啟動指令(exec 形式)
CMD ["python", "app.py"]

.dockerignore(務必加)

__pycache__/
*.pyc
.env
.git
.gitignore
node_modules/
dist/

2.3 常見指令(照這樣記)

  • FROM:基底映像(可用 AS build 命名階段)
  • WORKDIR:之後指令的工作目錄
  • COPY:把檔案放進 Image(99% 情況用 COPY,不是 ADD
  • RUN:建置階段的命令(裝依賴、編譯)
  • ARG / ENV
    • ARG 只在 build 階段有效;
    • ENV 也會留在 image,被容器繼承。
  • USER:切非 root 使用者
  • EXPOSE文件化埠號(實際開放要 -p 或 Compose 的 ports
  • ENTRYPOINT / CMD:啟動行為(用 exec 形式["bin","arg"]
  • HEALTHCHECK:健康檢查(讓編排器知道服務是否健康)

2.4 Multi-stage build(打造又小又乾淨的映像)

前端打包 → Nginx 服務靜態檔

FROM node:22-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm install --no-audit --no-fund
COPY public ./public
RUN mkdir -p dist && cp -r public/* dist/

FROM nginx:1.27-alpine
COPY --from=build /app/dist /usr/share/nginx/html
USER 101
EXPOSE 80
CMD ["nginx","-g","daemon off;"]

把編譯工具留在 build 階段,成品搬到跑服務的階段 → 體積小、表面積小

2.5 健康檢查(建議服務型容器都加)

HEALTHCHECK --interval=10s --timeout=2s --retries=5 \
  CMD curl -fsS http://localhost:8080/health || exit 1

2.6 10 條實戰準則

  1. .dockerignore 必備(排除 .git/.env 等)
  2. 基底映像選小(slim/alpine,或需除錯就選非極小)
  3. 先依賴、後程式碼(快取最大化)
  4. 固定版本(減少漂移)
  5. exec 形式CMD/ENTRYPOINT
  6. 非 root 執行
  7. 機密不要 bake 進 image(用 env/secrets)
  8. 合理合併 RUN 層,兼顧快取與可讀性
  9. 能 multi-stage 就 multi-stage
  10. HEALTHCHECK 讓編排器有依據

2.7 日常 CLI(精簡)

docker build -t my/app:dev .
docker run --rm -it -p 8080:8080 my/app:dev
docker images
docker rmi my/app:dev

參考資料