?
This document uses PHP Chinese website manual Release
Docker群體會生成兩種不同的流量:
控制和管理平面流量:這包括群管理消息,例如加入或離開群體的請求。此流量始終加密。
應(yīng)用程序數(shù)據(jù)平面流量:這包括集裝箱流量和往返于外部客戶端的流量。
本主題討論如何管理群集服務(wù)的應(yīng)用程序數(shù)據(jù)。有關(guān)通用群集網(wǎng)絡(luò)的更多詳細(xì)信息,請參閱Docker網(wǎng)絡(luò)參考架構(gòu)。
以下三種網(wǎng)絡(luò)概念對群集服務(wù)非常重要:
覆蓋網(wǎng)絡(luò)管理參與群集的Docker守護(hù)進(jìn)程之間的通信。您可以創(chuàng)建覆蓋網(wǎng)絡(luò),與獨立容器的用戶定義網(wǎng)絡(luò)相同。您也可以將服務(wù)附加到一個或多個現(xiàn)有覆蓋網(wǎng)絡(luò),以啟用服務(wù)到服務(wù)的通信。覆蓋網(wǎng)絡(luò)是使用overlay
網(wǎng)絡(luò)驅(qū)動程序的Docker網(wǎng)絡(luò)。
該入口網(wǎng)絡(luò)是一個特殊的覆蓋網(wǎng)絡(luò),便于服務(wù)的節(jié)點之間的負(fù)載均衡。當(dāng)任何swarm節(jié)點在已發(fā)布的端口上收到請求時,它將該請求交給一個名為的模塊IPVS
。IPVS
跟蹤參與該服務(wù)的所有IP地址,選擇其中的一個,并通過ingress
網(wǎng)絡(luò)將請求路由到它。該ingress
網(wǎng)絡(luò)時自動創(chuàng)建初始化或加入一個群。大多數(shù)用戶不需要定制其配置,但Docker 17.05和更高版本允許您這樣做。
該docker_gwbridge是一個橋接網(wǎng)絡(luò)連接覆蓋網(wǎng)(包括ingress
網(wǎng)絡(luò))到單個碼頭工人守護(hù)進(jìn)程的物理網(wǎng)絡(luò)。默認(rèn)情況下,服務(wù)運行的每個容器都連接到其本地Docker守護(hù)程序主機的docker_gwbridge
網(wǎng)絡(luò)。該docker_gwbridge
網(wǎng)絡(luò)時自動創(chuàng)建初始化或加入一個群。大多數(shù)用戶不需要定制其配置,但是Docker允許您這樣做。
參與swarm的Docker守護(hù)進(jìn)程需要通過以下端口相互通信的能力:
端口7946
TCP / UDP用于容器網(wǎng)絡(luò)發(fā)現(xiàn)。
4789
容器覆蓋網(wǎng)絡(luò)的端口UDP。
要創(chuàng)建覆蓋網(wǎng)絡(luò),請overlay
在使用該docker network create
命令時指定驅(qū)動程序:
$ docker network create \ --driver overlay \ my-network
上述命令沒有指定任何自定義選項,所以Docker分配一個子網(wǎng)并使用默認(rèn)選項。您可以看到有關(guān)使用網(wǎng)絡(luò)的信息docker network inspect
。
當(dāng)沒有容器連接到覆蓋網(wǎng)絡(luò)時,其配置并不令人興奮:
$ docker network inspect my-network[ { "Name": "my-network", "Id": "fsf1dmx3i9q75an49z36jycxd", "Created": "0001-01-01T00:00:00Z", "Scope": "swarm", "Driver": "overlay", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": null, "Config": [] }, "Internal": false, "Attachable": false, "Ingress": false, "Containers": null, "Options": { "com.docker.network.driver.overlay.vxlanid_list": "4097" }, "Labels": null }]
在上面的輸出中,請注意,驅(qū)動程序是覆蓋的,并且范圍是swarm,而不是您可能在其他類型的Docker網(wǎng)絡(luò)中看到的本地,主機或全局范圍。 該范圍表示只有參與群體的主機才能訪問此網(wǎng)絡(luò)。
網(wǎng)絡(luò)的子網(wǎng)和網(wǎng)關(guān)是在服務(wù)首次連接到網(wǎng)絡(luò)時動態(tài)配置的。以下示例顯示了與上述相同的網(wǎng)絡(luò),但有三個容器的redis
服務(wù)連接到它。
$ docker network inspect my-network[ { "Name": "my-network", "Id": "fsf1dmx3i9q75an49z36jycxd", "Created": "2017-05-31T18:35:58.877628262Z", "Scope": "swarm", "Driver": "overlay", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": null, "Config": [ { "Subnet": "10.0.0.0/24", "Gateway": "10.0.0.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "Containers": { "0e08442918814c2275c31321f877a47569ba3447498db10e25d234e47773756d": { "Name": "my-redis.1.ka6oo5cfmxbe6mq8qat2djgyj", "EndpointID": "950ce63a3ace13fe7ef40724afbdb297a50642b6d47f83a5ca8636d44039e1dd", "MacAddress": "02:42:0a:00:00:03", "IPv4Address": "10.0.0.3/24", "IPv6Address": "" }, "88d55505c2a02632c1e0e42930bcde7e2fa6e3cce074507908dc4b827016b833": { "Name": "my-redis.2.s7vlybipal9xlmjfqnt6qwz5e", "EndpointID": "dd822cb68bcd4ae172e29c321ced70b731b9994eee5a4ad1d807d9ae80ecc365", "MacAddress": "02:42:0a:00:00:05", "IPv4Address": "10.0.0.5/24", "IPv6Address": "" }, "9ed165407384f1276e5cfb0e065e7914adbf2658794fd861cfb9b991eddca754": { "Name": "my-redis.3.hbz3uk3hi5gb61xhxol27hl7d", "EndpointID": "f62c686a34c9f4d70a47b869576c37dffe5200732e1dd6609b488581634cf5d2", "MacAddress": "02:42:0a:00:00:04", "IPv4Address": "10.0.0.4/24", "IPv6Address": "" } }, "Options": { "com.docker.network.driver.overlay.vxlanid_list": "4097" }, "Labels": {}, "Peers": [ { "Name": "moby-e57c567e25e2", "IP": "192.168.65.2" } ] }]
有些情況下,您不想使用覆蓋網(wǎng)絡(luò)的默認(rèn)配置。有關(guān)可配置選項的完整列表,請運行該命令docker network create --help
。以下是一些最常見的更改選項。
默認(rèn)情況下,網(wǎng)絡(luò)的子網(wǎng)和網(wǎng)關(guān)在第一個服務(wù)連接到網(wǎng)絡(luò)時自動配置。使用--subnet
和--gateway
標(biāo)志創(chuàng)建網(wǎng)絡(luò)時,您可以配置這些設(shè)置。以下示例通過配置子網(wǎng)和網(wǎng)關(guān)擴展了前一個示例。
$ docker network create \ --driver overlay \ --subnet 10.0.9.0/24 \ --gateway 10.0.9.99 \ my-network
與群體有關(guān)的管理和控制平面數(shù)據(jù)始終是加密的。有關(guān)加密機制的更多詳細(xì)信息,請參閱Docker群集模式覆蓋網(wǎng)絡(luò)安全模型。
swarm節(jié)點之間的應(yīng)用程序數(shù)據(jù)默認(rèn)不加密。要在給定的覆蓋網(wǎng)絡(luò)上加密此流量,請使用此--opt encrypted
標(biāo)志docker network create
。這使得vxlan級別的IPSEC加密成為可能。這種加密會帶來不可忽視的性能損失,所以您應(yīng)該在生產(chǎn)中使用它之前對其進(jìn)行測試。
要將服務(wù)附加到現(xiàn)有的重疊網(wǎng)絡(luò),請將--network
標(biāo)志傳遞給docker service create
或?qū)?code>--network-add標(biāo)志傳遞給docker service update
。
$ docker service create \ --replicas 3 \ --name my-web \ --network my-network \ nginx
連接到覆蓋網(wǎng)絡(luò)的服務(wù)容器可以通過它相互通信。
要查看服務(wù)連接到哪個網(wǎng)絡(luò),請使用docker服務(wù)ls查找服務(wù)的名稱,然后使用docker service ps <service-name>列出網(wǎng)絡(luò)。 或者,要查看哪些服務(wù)的容器連接到網(wǎng)絡(luò),請使用docker網(wǎng)絡(luò)檢查<network-name>。 您可以從任何加入到swarm并處于運行狀態(tài)的swarm節(jié)點運行這些命令。
服務(wù)發(fā)現(xiàn)是Docker用來將來自服務(wù)的外部客戶端的請求路由到單個群集節(jié)點的機制,無需客戶端需要知道有多少節(jié)點參與服務(wù)或其IP地址或端口。您不需要發(fā)布在同一網(wǎng)絡(luò)上的服務(wù)之間使用的端口。例如,如果您有一個將其數(shù)據(jù)存儲在MySQL服務(wù)中的WordPress服務(wù),并且它們連接到相同的覆蓋網(wǎng)絡(luò),則不需要將MySQL端口發(fā)布到客戶端,只需發(fā)布WordPress HTTP端口。
使用虛擬IP(VIP)或DNS循環(huán)(DNSRR),服務(wù)發(fā)現(xiàn)可以以兩種不同的方式工作。您可以配置此服務(wù)。
默認(rèn)情況下,當(dāng)您將服務(wù)附加到網(wǎng)絡(luò)并且該服務(wù)發(fā)布一個或多個端口時,Docker會為該服務(wù)分配一個虛擬IP(VIP),這是客戶端到達(dá)該服務(wù)的“前端”。Docker保存服務(wù)中所有工作節(jié)點的列表,并在客戶端和其中一個節(jié)點之間路由請求。來自客戶端的每個請求可能會路由到不同的節(jié)點。
如果您將服務(wù)配置為使用DNS輪詢(DNSRR)服務(wù)發(fā)現(xiàn),則不會有單個虛擬IP。相反,Docker會為服務(wù)設(shè)置DNS條目,以便服務(wù)名稱的DNS查詢返回一個IP地址列表,并且客戶端直接連接到其中的一個。在您想使用自己的負(fù)載均衡器的情況下,DNS循環(huán)法很有用。要配置服務(wù)以使用DNSRR,請--endpoint-mode dnsrr
在創(chuàng)建新服務(wù)或更新現(xiàn)有服務(wù)時使用該標(biāo)志。
大多數(shù)用戶從不需要配置ingress
網(wǎng)絡(luò),但Docker 17.05和更高版本允許您這樣做。如果自動選擇的子網(wǎng)與網(wǎng)絡(luò)中已存在的子網(wǎng)沖突,或者需要自定義其他低級網(wǎng)絡(luò)設(shè)置(如MTU),則此功能非常有用。
定制ingress
網(wǎng)絡(luò)涉及到刪除和重新創(chuàng)建網(wǎng)絡(luò)。這通常在群體中創(chuàng)建任何服務(wù)之前完成。如果您有現(xiàn)有的發(fā)布端口的服務(wù),則需要先刪除這些服務(wù),然后才能刪除ingress
網(wǎng)絡(luò)。
在沒有ingress
網(wǎng)絡(luò)存在的時間內(nèi),不發(fā)布端口的現(xiàn)有服務(wù)將繼續(xù)運行,但沒有負(fù)載平衡。這會影響發(fā)布端口的服務(wù),例如發(fā)布端口80的WordPress服務(wù)。
使用檢查ingress
網(wǎng)絡(luò)docker network inspect ingress
,并刪除任何容器連接到它的服務(wù)。這些是發(fā)布端口的服務(wù),例如發(fā)布端口80的WordPress服務(wù)。如果所有這些服務(wù)都未停止,則下一步將失敗。
刪除現(xiàn)有的ingress
網(wǎng)絡(luò):$ docker network rm ingress警告!在刪除路由網(wǎng)格網(wǎng)絡(luò)之前,請確保群集中的所有節(jié)點運行相同的碼頭引擎版本。否則,刪除可能無效,新建入口網(wǎng)絡(luò)的功能將受到影響。你確定你要繼續(xù)嗎?Y / N
使用該--ingress
標(biāo)志創(chuàng)建一個新的覆蓋網(wǎng)絡(luò),以及要設(shè)置的自定義選項。本示例將MTU設(shè)置為1200,將子網(wǎng)設(shè)置為10.11.0.0/16
,并將網(wǎng)關(guān)設(shè)置為10.11.0.2
。$ docker network create \ -d overlay \ --ingress \ --subnet = 10.11.0.0 / 16 \ --gateway = 10.11.0.2 \ --opt com.docker.network.mtu = 1200 \ my-ingress 注意:您可以為你的ingress
網(wǎng)絡(luò)命名除了ingress
,但你只能有一個。嘗試創(chuàng)建第二個將失敗。
重新啟動您在第一步中停止的服務(wù)。
這docker_gwbridge
是一個將覆蓋網(wǎng)絡(luò)(包括ingress
網(wǎng)絡(luò))連接到單獨的Docker守護(hù)進(jìn)程物理網(wǎng)絡(luò)的虛擬橋。當(dāng)您初始化群集或?qū)ocker主機加入群集時,Docker會自動創(chuàng)建它,但它不是Docker設(shè)備。它存在于Docker主機的內(nèi)核中。如果您需要自定義其設(shè)置,則必須在將Docker主機加入群集之前或臨時從群集中暫時刪除主機之后執(zhí)行此操作。
您需要brctl
在您的操作系統(tǒng)上安裝該應(yīng)用程序才能刪除現(xiàn)有的網(wǎng)橋。包名是bridge-utils
。
停止Docker。
使用該brctl show docker_gwbridge
命令檢查是否存在調(diào)用的橋接設(shè)備docker_gwbridge
。如果是這樣,請使用它brctl delbr docker_gwbridge
。
啟動Docker。不要加入或初始化群體。
docker_gwbridge
使用您的自定義設(shè)置創(chuàng)建或重新創(chuàng)建橋梁。本例使用子網(wǎng)10.11.0.0/16
。有關(guān)可自定義選項的完整列表,請參閱橋接驅(qū)動程序選項。$ docker network create \ --subnet 10.11.0.0/16 \ --opt com.docker.network.bridge.name = docker_gwbridge \ --opt com.docker.network.bridge.enable_icc = false \ docker_gwbridge
初始化或加入群。
默認(rèn)情況下,所有swarm流量都通過相同的接口發(fā)送,包括控制和管理流量,以維護(hù)swarm本身以及數(shù)據(jù)流量進(jìn)出服務(wù)容器。
在Docker 17.06及更高版本中,可以--datapath-addr
在初始化或加入群集時通過傳遞該標(biāo)志來分隔此流量。如果有多個接口,則--advertise-addr
必須明確指定,如果未指定--datapath-addr
,--advertise-addr
則默認(rèn)為。關(guān)于加入,離開和管理群的--advertise-addr
流量將通過接口發(fā)送,并且服務(wù)容器之間的流量將通過--datapath-addr
接口發(fā)送。這些標(biāo)志可以采用IP地址或網(wǎng)絡(luò)設(shè)備名稱,例如eth0
。
這個例子初始化一個獨立的swarm --datapath-addr
。它假定您的Docker主機有兩個不同的網(wǎng)絡(luò)接口:10.0.0.1應(yīng)該用于控制和管理流量,192.168.0.1應(yīng)該用于與服務(wù)相關(guān)的流量。
$ docker swarm init --advertise-addr 10.0.0.1 --datapath-addr 192.168.0.1
這個例子加入了由主機管理的swarm 192.168.99.100:2377
,并將--advertise-addr
標(biāo)志設(shè)置為eth0
,并將--datapath-addr
標(biāo)志設(shè)置為eth1
。
$ docker swarm join \ --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2d7c \ --advertise-addr eth0 \ --datapath-addr eth1 \ 192.168.99.100:2377
將服務(wù)部署到群集
群體管理指南
Docker CLI參考
Swarm模式教程
Docker網(wǎng)絡(luò)參考架構(gòu)