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 時,會發生以下情況:
- 建立一個名為
myapp_default的網路。 - 使用
web的配置建立一個容器。該容器以web為名稱加入myapp_default網路。 - 使用
db的配置建立一個容器。該容器以db為名稱加入myapp_default網路。
現在,每個容器都可以解析服務名稱 web 或 db,並取得對應容器的 IP 位址。例如,web 的應用程式代碼可以連線到網址 postgres://db:5432 並開始使用 Postgres 資料庫。
請務必區分 HOST_PORT(主機連接埠)與 CONTAINER_PORT(容器連接埠)。在上述範例中,對於 db,HOST_PORT 是 8001,而容器連接埠是 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 可透過主機名稱 db 和 database 連線至 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: trueCompose 不會嘗試建立名為 [projectname]_default 的網路,而是會尋找名為 my-pre-existing-network 的網路,並將您應用程式的容器連線至該網路。
更多參考資訊
關於可用網路設定選項的完整詳細資訊,請參閱以下參考資料: