Docker Compose 多容器應用編排

A comprehensive guide to Docker Compose for multi-container application orchestration

Docker Compose 簡介

Docker Compose 是一個用於定義和執行多容器 Docker 應用程式的工具。透過 Compose,您可以使用 YAML 檔案來配置應用程式的服務,然後使用單一指令即可建立並啟動所有服務。

為什麼需要 Docker Compose?

在實際應用中,一個完整的應用程式通常需要多個服務協同運作,例如:

  • Web 伺服器
  • 資料庫
  • 快取服務
  • 訊息佇列

如果手動逐一啟動這些容器,不僅繁瑣且容易出錯。Docker Compose 解決了這個問題,讓您可以:

  1. 一鍵部署:使用單一指令啟動整個應用程式堆疊
  2. 版本控制:將基礎設施配置以程式碼的形式管理
  3. 環境一致性:確保開發、測試和生產環境的一致性
  4. 服務隔離:每個服務在獨立的容器中運行

安裝 Docker Compose

Linux 系統安裝

1
2
3
4
5
6
7
8
# 下載 Docker Compose 最新版本
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 賦予執行權限
sudo chmod +x /usr/local/bin/docker-compose

# 驗證安裝
docker-compose --version

macOS 和 Windows

如果您已安裝 Docker Desktop,Docker Compose 已經包含在內,無需額外安裝。

使用 Docker Compose V2 (推薦)

Docker Compose V2 已整合到 Docker CLI 中,可以直接使用 docker compose 指令(注意沒有連字號):

1
2
3
# V2 語法
docker compose version
docker compose up -d

YAML 檔案結構

Docker Compose 使用 docker-compose.yml 檔案來定義服務。以下是基本結構:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
version: "3.9"

services:
  service_name:
    image: image_name:tag
    container_name: custom_name
    ports:
      - "host_port:container_port"
    volumes:
      - host_path:container_path
    environment:
      - ENV_VAR=value
    depends_on:
      - other_service
    networks:
      - network_name
    restart: always

networks:
  network_name:
    driver: bridge

volumes:
  volume_name:

重要配置項說明

配置項說明
versionCompose 檔案格式版本
services定義應用程式中的各個服務
image指定使用的 Docker 映像檔
build指定 Dockerfile 路徑進行建構
ports連接埠映射
volumes資料卷掛載
environment環境變數設定
depends_on服務依賴關係
networks網路配置
restart重啟策略

常用指令

基本操作指令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# 啟動所有服務(背景執行)
docker-compose up -d

# 停止所有服務
docker-compose down

# 停止並移除資料卷
docker-compose down -v

# 查看服務狀態
docker-compose ps

# 查看服務日誌
docker-compose logs -f [service_name]

# 重新建構映像檔
docker-compose build

# 重新建構並啟動
docker-compose up -d --build

服務管理指令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 啟動特定服務
docker-compose start [service_name]

# 停止特定服務
docker-compose stop [service_name]

# 重啟特定服務
docker-compose restart [service_name]

# 進入容器執行指令
docker-compose exec [service_name] bash

# 執行一次性指令
docker-compose run [service_name] [command]

擴展服務

1
2
# 擴展服務實例數量
docker-compose up -d --scale web=3

實際範例:WordPress + MySQL

以下是一個完整的 WordPress 網站部署範例,包含 WordPress 和 MySQL 兩個服務。

目錄結構

1
2
3
4
wordpress-project/
├── docker-compose.yml
├── .env
└── wp-content/

docker-compose.yml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
version: "3.9"

services:
  # MySQL 資料庫服務
  db:
    image: mysql:8.0
    container_name: wordpress_db
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    networks:
      - wordpress_network

  # WordPress 服務
  wordpress:
    image: wordpress:latest
    container_name: wordpress_app
    depends_on:
      - db
    ports:
      - "8080:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: ${MYSQL_USER}
      WORDPRESS_DB_PASSWORD: ${MYSQL_PASSWORD}
      WORDPRESS_DB_NAME: ${MYSQL_DATABASE}
    volumes:
      - wordpress_data:/var/www/html
      - ./wp-content:/var/www/html/wp-content
    networks:
      - wordpress_network

  # phpMyAdmin(可選)
  phpmyadmin:
    image: phpmyadmin:latest
    container_name: wordpress_pma
    depends_on:
      - db
    ports:
      - "8081:80"
    restart: always
    environment:
      PMA_HOST: db
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
    networks:
      - wordpress_network

networks:
  wordpress_network:
    driver: bridge

volumes:
  db_data:
  wordpress_data:

.env 環境變數檔案

1
2
3
4
MYSQL_ROOT_PASSWORD=your_root_password_here
MYSQL_DATABASE=wordpress
MYSQL_USER=wordpress_user
MYSQL_PASSWORD=your_password_here

啟動與管理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 啟動 WordPress 網站
docker-compose up -d

# 查看執行狀態
docker-compose ps

# 查看日誌
docker-compose logs -f wordpress

# 停止網站
docker-compose down

# 完全清除(包含資料)
docker-compose down -v

啟動後,您可以透過以下網址存取:

  • WordPress:http://localhost:8080
  • phpMyAdmin:http://localhost:8081

進階技巧

使用多個 Compose 檔案

您可以使用多個 Compose 檔案來區分不同環境:

1
2
3
4
5
# 基礎配置 + 開發環境
docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d

# 基礎配置 + 生產環境
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d

健康檢查配置

1
2
3
4
5
6
7
8
9
services:
  web:
    image: nginx
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s

資源限制

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
services:
  web:
    image: nginx
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 512M
        reservations:
          cpus: '0.25'
          memory: 256M

總結

Docker Compose 是管理多容器應用程式的強大工具。透過本文的介紹,您應該已經了解:

  1. Docker Compose 的基本概念和優勢
  2. 如何安裝和設定 Docker Compose
  3. YAML 檔案的結構和常用配置
  4. 基本和進階的操作指令
  5. 如何使用 Docker Compose 部署實際應用

建議您親自動手實作,從簡單的範例開始,逐步掌握 Docker Compose 的各種功能。這將大大提升您在容器化應用部署方面的效率。

參考資源

comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy