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