前面我們提到 Dockerfile 是將「環境與服務設定」寫成文字檔,來建構 image 並運行 container。但實際上,單一服務往往不夠,例如:
如果這兩個 container 彼此無法透過網路連線,那即使都成功啟動,也完全無法對外提供服務。因此,Docker 官方推薦使用 Docker Compose,這是一個可以定義多個服務(containers)間如何協作的工具。
Docker Compose 現在被改為 Docker CLI 的 plugin,所以需透過套件管理工具安裝:
sudo yum install docker-compose-plugin
安裝完成後,可透過以下指令檢查是否成功:
docker compose version
在專案根目錄中建立一個設定檔:
touch docker-compose.yml
services:  # 定義多個 container 組成的服務群
  nginx:  # 第一個服務:Nginx
    image: nginx:mainline-alpine  # 使用官方輕量 Nginx image
    ports:
      - "${NGINX_PORT:-8080}:8080"  # 對外映射:主機:容器
    volumes:
      - ./environmentConfig/nginx.conf:/etc/nginx/nginx.conf  # 覆蓋 Nginx 設定檔
    networks:
      - backend-local  # 加入內部自訂的 bridge 網路
    depends_on:
      - php  # 等待 php container 啟動後再啟動 nginx
  php:  # 第二個服務:PHP (Laravel 專案)
    image: "${IMAGE_NAME:-demo-php}"  # 支援 .env 設定 image 名稱
    build:  # 若 image 尚未存在,從 Dockerfile 建立
      context: ./  # Dockerfile 所在目錄(. 是當前目錄)
      dockerfile: Dockerfile
      args:
        - APP_ENV=${APP_ENV}  # 傳入建構參數(來自 .env)
    volumes:
      - ./environmentConfig/php.ini:/usr/local/etc/php/conf.d/local.ini
      - ./environmentConfig/www.conf:/usr/local/etc/php-fpm.d/www.conf
      - ./:/www  # 專案資料夾掛載進 container 的 /www
      - /www/vendor
      - /www/bootstrap/cache
    extra_hosts:
      - "host.docker.internal:host-gateway"
      # 讓 container 可透過 host.docker.internal 訪問主機 IP(Linux 上需加這行)
    expose:
      - "9003"
      # 開放給同網段容器使用的 port(但不對外公開)
    networks:
      - backend-local
networks:
  backend-local:
    driver: bridge  # 使用 bridge 模式建立內部虛擬網路
docker compose up -d --build