?
本文檔使用 php中文網(wǎng)手冊 發(fā)布
注意:只有在使用 Compose 文件格式的版本2或更高版本時,本文才適用。網(wǎng)絡(luò)功能不支持版本1(傳統(tǒng))撰寫文件。
默認(rèn)情況下,組合設(shè)置一個網(wǎng)絡(luò)你的應(yīng)用程序。服務(wù)的每個容器都加入了默認(rèn)網(wǎng)絡(luò),并且兩者都是??蛇_(dá)網(wǎng)絡(luò)上的其他容器,以及可發(fā)現(xiàn)由它們在主機名上與容器名稱相同。
注:您的應(yīng)用程序的網(wǎng)絡(luò)是根據(jù)“項目名稱”命名的,該名稱基于它所在的目錄的名稱??梢允褂?code>--project-name標(biāo)志或者
COMPOSE_PROJECT_NAME
環(huán)境變量。
例如,假設(shè)應(yīng)用程序位于一個名為myapp
,而你的docker-compose.yml
看起來是這樣的:
version: "3"services: web: build: . ports: - "8000:8000" db: image: postgres ports: - "8001:5432"
當(dāng)運行docker-compose up
的時候,發(fā)生如下情況:
myapp_default
被創(chuàng)造了。
容器是使用web
的配置。它加入了網(wǎng)絡(luò)myapp_default
以這個名字web
。
容器是使用db
的配置。它加入了網(wǎng)絡(luò)myapp_default
以這個名字db
。
每個容器現(xiàn)在都可以查找主機名。web
或db
并獲取適當(dāng)容器的
IP 地址。例如,web
的應(yīng)用程序代碼可以連接到
URL postgres://db:5432
然后開始使用 Postgres 數(shù)據(jù)庫。
注意區(qū)分HOST_PORT
和區(qū)分是重要的CONTAINER_PORT
。在上面的例子中,db
中,HOST_PORT
是8001
和容器端口是5432
(postgres的默認(rèn)值)。網(wǎng)絡(luò)服務(wù)對服務(wù)通信使用CONTAINER_PORT
。何時HOST_PORT
被定義,該服務(wù)也可以在群外訪問。
在web
容器,連接字符串到db
看起來就像postgres://db:5432
,從主機上看,連接字符串看起來像postgres://{DOCKER_IP}:8001
...
如果對服務(wù)進(jìn)行配置更改并運行docker-compose up
要更新它,舊容器將被刪除,新容器將以不同的 IP 地址加入網(wǎng)絡(luò),但名稱相同。正在運行的容器將能夠查找該名稱并連接到新地址,但舊地址將停止工作。
如果任何容器與舊容器有連接,則它們將被關(guān)閉。容器的責(zé)任是檢測此狀態(tài),再次查找名稱并重新連接。
鏈接允許您定義額外的別名,通過它可以從另一個服務(wù)訪問服務(wù)。他們不需要啟用服務(wù)進(jìn)行通信 - 默認(rèn)情況下,任何服務(wù)都可以以該服務(wù)的名稱到達(dá)任何其他服務(wù)。在以下示例中,db
可以從web
主機名db
和以下位置訪問database
:
version: "3"services: web: build: . links: - "db:database" db: image: postgres
見鏈接參考想了解更多信息。
注意:本節(jié)中的指示信息涉及傳統(tǒng)的 Docker Swarm 操作,并且僅在針對傳統(tǒng) Swarm 集群時才起作用。有關(guān)將撰寫項目部署到較新的集成群模式的說明,請參閱 Docker Stacks 文檔。
何時將組合應(yīng)用程序部署到群集集群,您可以使用內(nèi)置的overlay
驅(qū)動程序,以啟用容器之間的多主機通信,而不更改組合文件或應(yīng)用程序代碼。
請參閱多主機網(wǎng)絡(luò)入門以了解如何設(shè)置 Swarm 群集。群集將overlay
默認(rèn)使用該驅(qū)動程序,但如果您愿意,您可以明確指定它 - 請參閱下文了解如何執(zhí)行此操作。
您可以使用頂級networks
密鑰指定您自己的網(wǎng)絡(luò),而不只是使用默認(rèn)的應(yīng)用程序網(wǎng)絡(luò)。這使您可以創(chuàng)建更復(fù)雜的拓?fù)洳⒅付ㄗ远x網(wǎng)絡(luò)驅(qū)動程序和選項。您還可以使用它將服務(wù)連接到不受
Compose 管理的外部創(chuàng)建的網(wǎng)絡(luò)。
每項服務(wù)都可以使用服務(wù)級別 networks
密鑰來指定要連接的網(wǎng)絡(luò),服務(wù)級別密鑰是頂級 networks
密鑰下引用條目的名稱列表。
以下是定義兩個自定義網(wǎng)絡(luò)的示例撰寫文件。proxy
服務(wù)與服務(wù)是隔離的db
,因為它們不共享共享的網(wǎng)絡(luò) - app
只能與兩者通話。
version: "3"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"
可以通過為每個連接的網(wǎng)絡(luò)設(shè)置 ipv4_address 和/或 ipv6_address 來為網(wǎng)絡(luò)配置靜態(tài) IP 地址。
有關(guān)可用網(wǎng)絡(luò)配置選項的詳細(xì)信息,請參閱下列參考資料:
頂層networks
鍵
服務(wù)級networks
鍵
除了指定您自己的網(wǎng)絡(luò)外,您還可以通過在networks
名稱下定義條目來更改應(yīng)用程序范圍的默認(rèn)網(wǎng)絡(luò)的設(shè)置default
:
version: "3"services: web: build: . ports: - "8000:8000" db: image: postgres networks: default: # Use a custom driver driver: custom-driver-1
如果希望容器加入現(xiàn)有網(wǎng)絡(luò),請使用external
期權(quán)*
networks: default: external: name: my-pre-existing-network
而不是試圖創(chuàng)建一個名為[projectname]_default
,將尋找一個名為my-pre-existing-network
并將應(yīng)用程序的容器連接到它。