Compose 中的網路

重要

Docker 的說明文件參考並說明了 Compose V2 的功能。

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

預設情況下,Compose 會為您的應用程式設定單一網路。服務的每個容器都會加入預設網路,並且可以由該網路上的其他容器存取,也可以透過服務名稱找到。

備註

您的應用程式網路會根據「專案名稱」命名,而專案名稱則基於其所在目錄的名稱。您可以使用--project-name 旗標COMPOSE_PROJECT_NAME 環境變數來覆寫專案名稱。

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

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 的應用程式程式碼可以連線到 URL postgres://db:5432 並開始使用 Postgres 資料庫。

請務必注意 HOST_PORTCONTAINER_PORT 之間的區別。在上述範例中,對於 dbHOST_PORT8001,而容器埠為 5432 (postgres 預設值)。網路服務到服務的通訊使用 CONTAINER_PORT。定義 HOST_PORT 時,也可以從 swarm 外部存取服務。

web 容器中,您與 db 的連線字串看起來像 postgres://db:5432,而從主機電腦來看,連線字串看起來像 postgres://{DOCKER_IP}:8001,例如,如果您的容器在本機執行,則為 postgres://localhost:8001

更新網路上的容器

如果您變更服務的設定並執行 docker compose up 來更新它,則舊的容器會被移除,而新的容器會以不同的 IP 位址但相同的名稱加入網路。正在執行的容器可以查詢該名稱並連線到新的位址,但舊的位址會停止運作。

如果任何容器與舊容器開啟連線,則會關閉這些連線。容器有責任偵測此情況,再次查詢名稱並重新連線。

提示

盡可能參考容器名稱,而不是 IP。否則,您需要不斷更新您使用的 IP 位址。

連結允許您定義額外的別名,透過這些別名,另一個服務可以從另一個服務存取。它們不需要啟用服務才能進行通訊。預設情況下,任何服務都可以透過該服務的名稱存取任何其他服務。在下列範例中,可以從主機名稱 dbdatabaseweb 存取 db

services:

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

請參閱連結參考以取得更多資訊。

多主機網路

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

覆蓋網路一律建立為 attachable。您可以選擇將attachable 屬性設定為 false

請參閱Swarm 模式章節,以瞭解如何設定 Swarm 叢集,以及多主機網路入門以瞭解多主機覆蓋網路。

指定自訂網路

您可以使用頂層 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

設定預設網路

除了或以及指定您自己的網路之外,您也可以透過在名為 defaultnetworks 下定義一個項目來更改應用程式範圍內預設網路的設定。

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

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

使用現有網路

如果您希望您的容器加入預先存在的網路,請使用 external 選項

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

Compose 不會嘗試建立名為 [專案名稱]_default 的網路,而是尋找名為 my-pre-existing-network 的網路,並將您的應用程式容器連接到它。

更多參考資訊

有關可用網路配置選項的完整詳細資訊,請參閱以下參考