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
時,將發生以下情況
- 將建立一個名為
myapp_default
的網路。 - 將使用
web
的配置建立一個容器。它以web
的名稱加入myapp_default
網路。 - 將使用
db
的配置建立一個容器。它以db
的名稱加入myapp_default
網路。
每個容器現在都可以查詢服務名稱 web
或 db
,並返回相應容器的 IP 地址。例如,web
的應用程式程式碼可以連線到 URL postgres://db:5432
並開始使用 Postgres 資料庫。
重要的是要注意 HOST_PORT
和 CONTAINER_PORT
之間的區別。在上面的示例中,對於 db
,HOST_PORT
是 8001
,容器埠是 5432
(postgres 預設值)。聯網的服務到服務通訊使用 CONTAINER_PORT
。當定義 HOST_PORT
時,該服務也可以在叢集外部訪問。
在 web
容器內,您與 db
的連線字串將類似於 postgres://db:5432
,從主機,連線字串將類似於 postgres://{DOCKER_IP}:8001
,例如 postgres://:8001
,如果您的容器在本地執行。
更新網路上的容器
如果您對服務進行了配置更改並執行 docker compose up
來更新它,則舊容器將被刪除,新容器將以不同的 IP 地址但在同一名稱下加入網路。正在執行的容器可以查詢該名稱並連線到新地址,但舊地址將停止工作。
如果任何容器與舊容器存在開啟的連線,則它們將被關閉。容器有責任檢測這種情況,再次查詢名稱並重新連線。
提示
儘可能使用名稱而不是 IP 引用容器。否則,您將需要不斷更新使用的 IP 地址。
連結容器
連結允許您定義其他別名,以便一個服務可以從另一個服務訪問它。它們不需要啟用服務之間的通訊。預設情況下,任何服務都可以透過服務的名稱訪問任何其他服務。在以下示例中,db
可以透過主機名 db
和 database
從 web
訪問
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
的網路並將您的應用程式的容器連線到它。
更多參考資料
有關可用的網路配置選項的完整詳細資訊,請參閱以下參考資料