Docker 開發環境

「在我電腦上可以跑啊!」——這句經典台詞的終極解藥就是 Docker。

Docker 讓你的開發環境與基礎設施完全一致,消除「開發環境沒問題,上線就炸掉」的噩夢。

🔥 Vibe Prompt

「幫我建立一個完整的 Docker 開發環境:包含 Python FastAPI 後端、PostgreSQL 資料庫、Redis 快取的多服務 docker-compose 配置,並區分 dev/staging/production 三種環境。」

Docker 核心概念

| 概念 | 說明 | 類比 | |------|------|------| | Image(映像檔) | 唯讀的模板,包含執行環境與程式碼 | 如同 ISO 安裝光碟 | | Container(容器) | Image 的執行實例 | 如同安裝好的作業系統 | | Dockerfile | 描述如何建置 Image 的腳本 | 如同安裝說明書 | | Volume(資料卷) | 持久化資料,獨立於容器生命週期 | 如同外接硬碟 | | Network(網路) | 容器間通訊的虛擬網路 | 如同區域網路 |

Dockerfile 最佳實踐

# 1. 使用多階段建置 (Multi-stage Build)
# 階段 1:編譯
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build

# 階段 2:執行(更小的 Image)
FROM node:20-alpine AS runner
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
EXPOSE 3000
CMD ["node", "dist/index.js"]

# 最終 image 大小:~150MB(而非 ~1.2GB)
# Python 範例
FROM python:3.12-slim AS builder

WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

Dockerfile 最佳實踐法則

| 法則 | 說明 | |------|------| | 精簡基底 | 使用 -alpine-slim 版本 | | 多階段建置 | 建置與執行分離,減少 Image 大小 | | 依賴快取 | 先複製 package.json / requirements.txt,再複製程式碼 | | 最小權限 | 不要用 root 執行,建立專用使用者 | | 單一職責 | 一個 Container 只跑一個程序 |

Docker Compose 多服務配置

version: '3.8'

services:
  api:
    build:
      context: .
      dockerfile: Dockerfile.dev
    ports:
      - "8000:8000"
    volumes:
      - .:/app  # 熱重載:本地程式碼映射到容器
    environment:
      - DATABASE_URL=postgresql://user:pass@db:5432/app
      - REDIS_URL=redis://cache:6379
    depends_on:
      - db
      - cache
    command: uvicorn main:app --reload --host 0.0.0.0 --port 8000

  db:
    image: postgres:16-alpine
    volumes:
      - pgdata:/var/lib/postgresql/data
    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=pass
      - POSTGRES_DB=app
    ports:
      - "5432:5432"

  cache:
    image: redis:7-alpine
    ports:
      - "6379:6379"

volumes:
  pgdata:

環境區分

# docker-compose.override.yml(開發環境覆蓋)
services:
  api:
    volumes:
      - .:/app  # 開發時掛載原始碼
    environment:
      - DEBUG=true
      - LOG_LEVEL=debug
# docker-compose.prod.yml(正式環境)
services:
  api:
    build:
      dockerfile: Dockerfile.prod
    restart: always
    deploy:
      replicas: 3  # 水平擴展
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8000/health"]

開發實戰技巧

# 常用 Docker Compose 指令

# 啟動所有服務(背景)
docker compose up -d

# 檢視日誌
docker compose logs -f api

# 重新建置某個服務
docker compose build api

# 執行一次性指令
docker compose exec api python manage.py migrate

# 重啟服務
docker compose restart api

# 停止並清除(保留資料卷)
docker compose down

# 完全清除(含資料卷)
docker compose down -v
# Docker 清理 

# 刪除所有停止的容器
docker container prune

# 刪除所有未使用的 image
docker image prune -a

# 一次清理所有東西
docker system prune -af --volumes

開發環境 vs 生產環境差異

| 項目 | 開發環境 | 生產環境 | |------|---------|---------| | 程式碼載入 | 掛載 volume 熱重載 | 編譯進 image | | 除錯工具 | 暴露 debug port | 關閉 | | 日誌 | 詳細輸出 | 結構化 JSON | | 資料庫 | 自動重置 | 持久化、定期備份 | | 擴展 | 單實例 | 多實例 + 負載均衡 | | 安全 | 寬鬆 CORS | 嚴格安全策略 |

實戰練習

💡 Vibe Coding 練習:請 AI 幫你:

  1. 為你的專案建立完整的 docker-compose 配置(前端 + 後端 + 資料庫 + 快取)
  2. 建立多階段 Dockerfile,將 Image 大小從 1GB 降到 100MB
  3. 建立 healthcheck 與自動重啟機制
  4. 建立開發/測試/生產三套環境配置
  5. 建立 CI/CD 用的 Docker 建置腳本

解鎖完整教學內容

本章為付費內容。加入專案即可解鎖超過 5000 字的深度解析,包含 10 個以上神級 Prompt 與真實 Source Code 範例!