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(務必加)
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 條實戰準則
.dockerignore必備(排除.git/、.env等)- 基底映像選小(slim/alpine,或需除錯就選非極小)
- 先依賴、後程式碼(快取最大化)
- 固定版本(減少漂移)
- 用 exec 形式 的
CMD/ENTRYPOINT - 以 非 root 執行
- 機密不要 bake 進 image(用 env/secrets)
- 合理合併
RUN層,兼顧快取與可讀性 - 能 multi-stage 就 multi-stage
- 加
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