Compose 中的網路設定

重要

Docker 的文件引用並描述了 Compose V2 的功能。

自 2023 年 7 月起,Compose V1 已停止接收更新,且不再包含於新的 Docker Desktop 版本中。Compose V2 已取代它,並整合進所有目前的 Docker Desktop 版本。如需更多資訊,請參閱 遷移至 Compose V2

預設情況下,Compose 會為您的應用程式建立單一網路。服務的每個容器都會加入該預設網路,不僅可以被該網路上的其他容器連線,也能透過服務名稱進行服務發現。

注意

應用程式的網路名稱取決於「專案名稱」(project name),而專案名稱則取決於應用程式所在的目錄名稱。您可以使用 --project-name 旗標COMPOSE_PROJECT_NAME 環境變數 來覆寫專案名稱。

例如,假設您的應用程式位於名為 myapp 的目錄中,且您的 compose.yaml 檔案如下所示:

services:
  web:
    build: .
    ports:
      - "8000:8000"
  db:
    image: postgres
    ports:
      - "8001:5432"

當您執行 docker compose up 時,會發生以下情況:

  1. 建立一個名為 myapp_default 的網路。
  2. 使用 web 的配置建立一個容器。該容器以 web 為名稱加入 myapp_default 網路。
  3. 使用 db 的配置建立一個容器。該容器以 db 為名稱加入 myapp_default 網路。

現在,每個容器都可以解析服務名稱 webdb,並取得對應容器的 IP 位址。例如,web 的應用程式代碼可以連線到網址 postgres://db:5432 並開始使用 Postgres 資料庫。

請務必區分 HOST_PORT(主機連接埠)與 CONTAINER_PORT(容器連接埠)。在上述範例中,對於 dbHOST_PORT8001,而容器連接埠是 5432(Postgres 預設值)。網路中服務與服務之間的通訊使用的是 CONTAINER_PORT。當定義了 HOST_PORT 時,該服務也可以在叢集(swarm)外部存取。

web 容器內,連線至 db 的字串為 postgres://db:5432;而從主機機器連線時,字串則為 postgres://{DOCKER_IP}:8001,例如當容器在本地執行時,字串為 postgres://:8001

更新網路上的容器

如果您更改了服務的配置並執行 docker compose up 進行更新,舊容器將被移除,新容器則以不同的 IP 位址但相同的名稱加入網路。執行中的容器可以解析該名稱並連線至新的位址,但舊的位址將停止運作。

如果任何容器與舊容器建立了連線,這些連線將會中斷。容器有責任偵測此狀況、重新解析名稱並重新連線。

提示

請儘可能使用名稱而非 IP 來參照容器。否則,您將需要不斷更新所使用的 IP 位址。

「連結」(Links)允許您定義額外的別名,讓服務可以透過這些別名與其他服務連線。這並非服務之間通訊的必要條件;預設情況下,任何服務皆可透過服務名稱連線至其他服務。在以下範例中,web 可透過主機名稱 dbdatabase 連線至 db

services:

  web:
    build: .
    links:
      - "db:database"
  db:
    image: postgres

請參閱 連結參考 (links reference) 以取得更多資訊。

多主機網路

當在啟用 Swarm 模式的 Docker Engine 上部署 Compose 應用程式時,您可以利用內建的 overlay 驅動程式來實現多主機通訊。

Overlay 網路在建立時預設為 attachable(可附加)。您可以選擇將 attachable 屬性設為 false

請參閱 Swarm 模式章節 以了解如何設定 Swarm 叢集,並參考 多主機網路入門 以學習關於多主機 Overlay 網路的相關知識。

指定自訂網路

除了使用預設的應用程式網路外,您也可以使用頂層的 networks 鍵來指定自己的網路。這能讓您建立更複雜的拓撲結構,並指定自訂網路驅動程式與選項。您也可以利用它將服務連線至非由 Compose 管理、外部建立的網路。

每個服務可以使用服務層級的 networks 鍵來指定要連線的網路,這是一個參照頂層 networks 鍵下條目的名稱列表。

以下範例展示了一個定義兩個自訂網路的 Compose 檔案。proxy 服務與 db 服務是隔離的,因為它們沒有共同的網路。只有 app 可以同時與兩者通訊。

services:
  proxy:
    build: ./proxy
    networks:
      - frontend
  app:
    build: ./app
    networks:
      - frontend
      - backend
  db:
    image: postgres
    networks:
      - backend

networks:
  frontend:
    # Specify driver options
    driver: bridge
    driver_opts:
      com.docker.network.bridge.host_binding_ipv4: "127.0.0.1"
  backend:
    # Use a custom driver
    driver: custom-driver

透過為每個附加的網路設定 ipv4_address 和/或 ipv6_address,可以為網路設定靜態 IP 位址。

網路也可以被賦予自訂名稱

services:
  # ...
networks:
  frontend:
    name: custom_frontend
    driver: custom-driver-1

設定預設網路

除了(或作為替代)指定您自己的網路外,您也可以透過在 networks 下定義一個名為 default 的條目,來更改應用程式層級預設網路的設定。

services:
  web:
    build: .
    ports:
      - "8000:8000"
  db:
    image: postgres

networks:
  default:
    # Use a custom driver
    driver: custom-driver-1

使用現有網路

如果您已經使用 docker network create 指令在 Compose 之外手動建立了一個橋接(bridge)網路,您可以透過將該網路標記為 external,將您的 Compose 服務連線至該網路。

如果您希望容器加入一個現有的網路,請使用 external 選項

services:
  # ...
networks:
  network1:
    name: my-pre-existing-network
    external: true

Compose 不會嘗試建立名為 [projectname]_default 的網路,而是會尋找名為 my-pre-existing-network 的網路,並將您應用程式的容器連線至該網路。

更多參考資訊

關於可用網路設定選項的完整詳細資訊,請參閱以下參考資料:

© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.