Compose 中的網路

重要

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

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

預設情況下,Compose 會為您的應用程式設定一個單獨的網路。服務的每個容器都加入預設網路,並且既可以被該網路上的其他容器訪問,也可以透過服務的名稱被發現。

注意

您的應用程式的網路名稱是基於“專案名稱”的,而專案名稱又基於它所在的目錄名稱。您可以使用--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 的應用程式程式碼可以連線到 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://:8001

更新網路上的容器

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

如果任何容器與舊容器有開啟的連線,它們將被關閉。容器有責任檢測此情況,再次查詢名稱並重新連線。

提示

儘可能透過名稱而不是 IP 地址引用容器。否則,您將需要不斷更新所使用的 IP 地址。

連結允許您定義額外的別名,透過這些別名,一個服務可以從另一個服務訪問。它們不是實現服務通訊所必需的。預設情況下,任何服務都可以透過該服務的名稱訪問任何其他服務。在以下示例中,web 可以透過主機名 dbdatabase 訪問 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

配置預設網路

除了指定您自己的網路之外,您還可以透過在 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 外部手動建立了橋接網路,您可以透過將網路標記為 external 來將您的 Compose 服務連線到它。

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

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

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

進一步參考資訊

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