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 時,該服務也可以在叢集外部訪問。

web 容器內,您與 db 的連線字串將類似於 postgres://db:5432,從主機,連線字串將類似於 postgres://{DOCKER_IP}:8001,例如 postgres://:8001,如果您的容器在本地執行。

更新網路上的容器

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

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

提示

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

連結允許您定義其他別名,以便一個服務可以從另一個服務訪問它。它們不需要啟用服務之間的通訊。預設情況下,任何服務都可以透過服務的名稱訪問任何其他服務。在以下示例中,db 可以透過主機名 dbdatabaseweb 訪問

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:
    # Use a custom driver
    driver: custom-driver-1
  backend:
    # Use a custom driver which takes special options
    driver: custom-driver-2
    driver_opts:
      foo: "1"
      bar: "2"

可以透過為每個連線的網路設定 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

使用預先存在的網路

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

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

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

更多參考資料

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