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