在現代 DevOps 與微服務架構中,一個應用系統通常由多個服務組成,例如 Web Server、資料庫、快取服務與 API Server。若每個容器都需要手動啟動,管理與部署會非常複雜。Docker Compose 是 Docker 官方提供的多容器管理工具,可以透過 docker-compose.yml 設定檔描述整個應用系統架構,只需一個指令即可同時啟動多個服務並自動建立網路與依賴關係。
為什麼使用 Docker Compose
如果沒有 Docker Compose,部署一個包含 Nginx、MySQL、Redis 的系統,可能需要多次執行 docker run 指令並手動配置 Port、Network 與環境變數。
- 統一管理多個容器
- 簡化 DevOps 部署流程
- 快速建立開發與測試環境
- 容器之間自動建立網路
- 方便 CI/CD 自動化
常用指令與說明
# 啟動所有服務(背景模式)
docker-compose up -d
# -d 代表 background 執行,不會佔用 terminal
# 停止並移除容器
docker-compose down
# down 會停止所有容器並移除網路與卷
# 查看容器狀態
docker-compose ps
# 列出目前所有服務容器狀態
# 查看服務日誌
docker-compose logs
# 可加服務名稱查看特定日誌,例如 docker-compose logs wordpress
# 重新啟動服務
docker-compose restart
# 重新啟動容器,更新設定立即生效
# 更新 Docker Image
docker-compose pull
# 下載最新映像檔,然後可重新啟動容器
範例:WordPress + MySQL
version: "3"
services:
wordpress:
image: wordpress # 使用官方 WordPress 映像檔
ports:
- "8080:80" # 對應本機 8080 port 到容器 80 port
environment:
WORDPRESS_DB_HOST: db # 連接資料庫服務名稱
WORDPRESS_DB_USER: root # DB 帳號
WORDPRESS_DB_PASSWORD: example # DB 密碼
db:
image: mysql:8 # 使用 MySQL 8
environment:
MYSQL_ROOT_PASSWORD: example # 設定 root 密碼
部署後檢查:
docker-compose ps
curl http://localhost:8080
# 查看容器運作狀態與測試網站是否可訪問
案例 2:Node.js + MongoDB
version: "3"
services:
node-app:
image: node:18 # Node.js 官方映像檔
working_dir: /app # 工作目錄
volumes:
- ./:/app # 將本地專案掛載到容器 /app
command: "node index.js" # 啟動 Node.js 應用
ports:
- "3000:3000" # 對應本機 3000 port
depends_on:
- mongo # 啟動前依賴 mongo 容器
mongo:
image: mongo:6 # MongoDB 官方映像檔
ports:
- "27017:27017" # 對應本機 27017 port
部署後檢查:
docker-compose ps
docker-compose logs node-app
curl http://localhost:3000
# 查看容器狀態、日誌與測試應用
案例 3:Python Flask + Redis + PostgreSQL
version: "3"
services:
flask-app:
image: python:3.11 # Python 官方映像檔
working_dir: /app
volumes:
- ./:/app # 掛載專案資料
command: "python app.py" # 啟動 Flask 應用
ports:
- "5000:5000" # 本機 5000 port 對應容器 5000
depends_on:
- redis # 依賴 redis 容器
- db # 依賴 db 容器
redis:
image: redis:7 # Redis 官方映像檔
ports:
- "6379:6379" # 對應本機 6379 port
db:
image: postgres:15 # PostgreSQL 官方映像檔
environment:
POSTGRES_PASSWORD: example # 設定資料庫密碼
ports:
- "5432:5432" # 對應本機 5432 port
部署後檢查:
docker-compose ps
docker-compose logs flask-app
curl http://localhost:5000
# 查看容器狀態與測試 Flask 網站
排錯技巧
docker-compose logs
# 查看容器日誌,找出錯誤訊息
docker-compose ps
# 確認容器是否啟動
docker-compose down
# 停止並清理所有容器,重新部署
FAQ 常見問題
Docker Compose 與 Dockerfile 差異是什麼?
Dockerfile 用於建立 Image,而 Docker Compose 管理多個容器服務。Dockerfile 描述映像檔建立方式,Compose 負責系統部署與多容器協調。
Docker Compose 可以用於正式環境嗎?
小型專案可使用 Compose 部署,對大型系統建議 Kubernetes。Compose 適合單機部署與開發測試,部署時仍建議搭配備份與監控。
docker-compose.yml 可以定義多少服務?
可定義多個服務,例如 Web、Database、Redis 等,Compose 會自動建立網路並管理依賴順序。
如何重新啟動服務?
使用 docker-compose restart 可重新啟動所有服務,適合更新設定後立即生效。
如何更新 Docker Image?
先執行 docker-compose pull 下載最新 Image,再使用 docker-compose up -d 重新建立容器。
docker-compose stop 與 down 差異?
stop 只停止容器,down 會停止並移除容器、網路與卷。down 適合完全重建環境。
Docker Compose 適合開發環境嗎?
非常適合,開發者只需 docker-compose up 就可快速建立完整開發環境,節省配置時間。
Docker Compose 與 Kubernetes 差別?
Compose 適合單機部署與測試,Kubernetes 適合大型叢集、擴展與自動化管理,兩者各有適用場景。
