>_ ScaleSolutions大張旗鼓

Docker 容器化實戰:讓你的舊系統跑起來、不再崩潰

「這個在我電腦上明明沒問題,為什麼你的環境跑不了?」

這句話大概是軟體開發史上最讓人崩潰的一句話了。在我職業生涯的早期,每次新進一個同事,就要花半天甚至整天陪他設定開發環境。

後來我開始認真用 Docker,這個問題幾乎消失了。

我們的舊系統有多亂?

一個中等規模的 B2B 系統,後端的依賴通常包含:

  • SQL Server(有特定版本要求)
  • Redis(用來做快取和 Session)
  • RabbitMQ(訊息佇列)
  • 一個或多個自己寫的後端服務(可能 Port 還不一樣)
  • Nginx(本機模擬 Reverse Proxy)

過去要讓這一切跑起來,你需要一份長達 3 頁的安裝說明文件,而且這份文件通常是過期的。

Docker Compose 的解決方案

現在我的標準做法是在每個專案的根目錄放一個 docker-compose.yml

version: '3.9'
services:
  db:
    image: mcr.microsoft.com/mssql/server:2022-latest
    environment:
      SA_PASSWORD: "YourStr0ngPassword!"
      ACCEPT_EULA: "Y"
    ports:
      - "1433:1433"
    volumes:
      - sqldata:/var/opt/mssql

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

  rabbitmq:
    image: rabbitmq:3-management
    ports:
      - "5672:5672"
      - "15672:15672"  # Management UI

  api:
    build: ./src/YourApi
    depends_on:
      - db
      - redis
      - rabbitmq
    ports:
      - "5000:80"
    environment:
      ConnectionStrings__Default: "Server=db;..."
      Redis__Connection: "redis:6379"

volumes:
  sqldata:

現在新同事加入,只需要安裝 Docker Desktop,然後在專案根目錄執行:

docker compose up -d

等個 1 到 2 分鐘,整個開發環境就全部啟動了。沒有安裝說明文件,沒有版本衝突,沒有「我的系統上沒有這個功能」。

幾個實戰踩坑的筆記

1. Volume 的資料持久化

SQL Server 的資料如果沒有掛 Volume,每次 docker compose down 就會清空。記得在 services.db 加上 volumes: - sqldata:/var/opt/mssql,並且在最底部定義 volumes: sqldata:

2. 服務啟動順序

depends_on 只保證「容器啟動了」,不代表「服務準備好了」。SQL Server 啟動後還需要幾秒鐘才能接受連線。最好在你的應用啟動邏輯中加入重試機制(Retry with exponential backoff)。

3. 環境變數管理

不要把密碼寫死在 docker-compose.yml 裡,而是用 .env 檔案搭配 ${VARIABLE_NAME} 的方式引用,並把 .env 加入 .gitignore

# .env(加入 .gitignore)
MSSQL_SA_PASSWORD=YourStr0ngPassword!

容器化改善了我們團隊的協作效率,也讓 CI/CD 的部署流程變得更加可預測。如果你的專案還在用「上板說明文件」來設定環境,我真心推薦你花一個下午試試看 Docker Compose。

留言區