?
This document uses PHP Chinese website manual Release
本節(jié)中的信息解釋了 Docker 默認(rèn)網(wǎng)橋的 IPv6。這是一個(gè)在安裝 Docker 時(shí)自動(dòng)創(chuàng)建名稱(chēng)為bridge
的bridge
網(wǎng)絡(luò)。
由于 IPv4 地址耗盡, IETF 已經(jīng)在 RFC 2460中標(biāo)準(zhǔn)化了 IPv4后繼,Internet 協(xié)議版本6。這兩種協(xié)議(IPv4和 IPv6)都駐留在 OSI模型的第3層。
默認(rèn)情況下,Docker 守護(hù)程序(daemon)僅為IPv4配置容器網(wǎng)絡(luò)。您可以通過(guò)運(yùn)行帶有--ipv6
標(biāo)志的Docker 守護(hù)程序(daemon)來(lái)啟用 IPv4 / IPv6 雙棧支持。Docker 將docker0
使用 IPv6 鏈接本地地址fe80::1
設(shè)置網(wǎng)橋。
默認(rèn)情況下,創(chuàng)建的容器只會(huì)獲得鏈路本地 IPv6 地址。要將全局可路由的 IPv6 地址分配給您的容器,您必須指定一個(gè) IPv6 子網(wǎng)來(lái)從中選擇地址。啟動(dòng) Docker 守護(hù)進(jìn)程(daemon)時(shí),通過(guò)--fixed-cidr-v6
參數(shù)設(shè)置 IPv6子網(wǎng):
您可以直接運(yùn)行dockerd
這些標(biāo)志,但建議您將其設(shè)置在daemon.json
配置文件中。以下示例daemon.json
啟用 IPv6并將 IPv6子網(wǎng)設(shè)置為2001:db8:1::/64
。
{ "ipv6": true, "fixed-cid4-v6": "2001:db8:1::/64"}
Docker 容器的子網(wǎng)應(yīng)該至少有一個(gè)大小/80
,以便 IPv6地址可以以容器的 MAC 地址結(jié)束,并且可以防止 Docker 層中的 NDP 鄰居緩存失效問(wèn)題。
默認(rèn)情況下,--fixed-cidr-v6
參數(shù)使Docker為路由表添加一個(gè)新路由,方法是代表您運(yùn)行以下三個(gè)命令。若要防止自動(dòng)路由,請(qǐng)?jiān)O(shè)置ip-forward
到false
在daemon.json
文件或啟動(dòng)Docker守護(hù)進(jìn)程--ip-forward=false
旗子。然后,要獲得Docker將自動(dòng)為您創(chuàng)建的相同的路由表,請(qǐng)發(fā)出以下命令:
$ ip -6 route add 2001:db8:1::/64 dev docker0 $ sysctl net.ipv6.conf.default.forwarding=1$ sysctl net.ipv6.conf.all.forwarding=1
子網(wǎng)的所有通信量2001:db8:1::/64
將通過(guò)docker0
接口。
注:IPv 6轉(zhuǎn)發(fā)可能會(huì)干擾現(xiàn)有的IPv 6配置:如果使用路由器廣告為主機(jī)接口獲取IPv 6設(shè)置,請(qǐng)?jiān)O(shè)置
accept_ra
到2
使用以下命令。否則,啟用IPv 6的轉(zhuǎn)發(fā)將導(dǎo)致拒絕路由器廣告。 $sysctl net.ipv6.con.eth0.接受[醫(yī)]Ra=2
二次
二次
每個(gè)新容器都將從定義的子網(wǎng)中獲得一個(gè)IPv 6地址,并將添加一個(gè)默認(rèn)路由。eth0
通過(guò)守護(hù)進(jìn)程選項(xiàng)指定的地址在容器中。--default-gateway-v6
%28或default-gateway-v6
在daemon.json
%29(如有)。默認(rèn)網(wǎng)關(guān)默認(rèn)為fe80::1
...
此示例提供了一種檢查運(yùn)行容器中IPv 6網(wǎng)絡(luò)設(shè)置的方法。
docker run -it alpine ash -c "ip -6 addr show dev eth0; ip -6 route show"15: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 inet6 2001:db8:1:0:0:242:ac11:3/64 scope global valid_lft forever preferred_lft forever inet6 fe80::42:acff:fe11:3/64 scope link valid_lft forever preferred_lft forever2001:db8:1::/64 dev eth0 proto kernel metric 256fe80::/64 dev eth0 proto kernel metric 256default via fe80::1 dev eth0 metric 1024
在這個(gè)例子中,容器被分配一個(gè)帶有子網(wǎng)的鏈接本地地址。/64
%28fe80::42:acff:fe11:3/64
%29和全球可路由IPv 6地址%282001:db8:1:0:0:242:ac11:3/64
29%。容器將創(chuàng)建與2001:db8:1::/64
通過(guò)鏈路本地網(wǎng)關(guān)連接fe80::1
上eth0
...
服務(wù)器或虛擬機(jī)通常會(huì)獲得/64
IPv 6子網(wǎng)分配%28例如。2001:db8:23:42::/64
29%。在這種情況下,您可以進(jìn)一步拆分它,并提供Docker a/80
使用單獨(dú)的子網(wǎng)。/80
主機(jī)上其他應(yīng)用程序的子網(wǎng):
二次
二次
在此設(shè)置中,子網(wǎng)2001:db8:23:42::/64
從2001:db8:23:42:0:0:0:0
到2001:db8:23:42:ffff:ffff:ffff:ffff
附在eth0
,主人正在收聽(tīng)2001:db8:23:42::1
.子網(wǎng)2001:db8:23:42:1::/80
的地址范圍為2001:db8:23:42:1:0:0:0
到2001:db8:23:42:1:ffff:ffff:ffff
附在docker0
并將用于集裝箱。
如果您的Docker主機(jī)是IPv 6子網(wǎng)的唯一部分,但沒(méi)有分配IPv 6子網(wǎng),則可以使用NDP代理通過(guò)IPv 6將容器連接到Internet。如果具有IPv 6地址的主機(jī)2001:db8::c001
是子網(wǎng)的一部分。2001:db8::/64
IaaS提供商允許您配置IPv 6地址2001:db8::c000
到2001:db8::c00f
,您的網(wǎng)絡(luò)配置可能如下所示:
$ ip -6 addr show1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 inet6 ::1/128 scope host valid_lft forever preferred_lft forever2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000 inet6 2001:db8::c001/64 scope global valid_lft forever preferred_lft forever inet6 fe80::601:3fff:fea1:9c01/64 scope link valid_lft forever preferred_lft forever
將可配置地址范圍劃分為兩個(gè)子網(wǎng)2001:db8::c000/125
和2001:db8::c008/125
,使用以下方法daemon.json
設(shè)置。第一個(gè)子網(wǎng)將由主機(jī)上的非碼頭進(jìn)程使用,第二個(gè)子網(wǎng)將由Docker使用。
{ "ipv6": true, "fixed-cidr-v6": "2001:db8::c008/125"}
Docker子網(wǎng)位于由路由器管理并連接到eth0
所有由Docker分配地址的容器都將在路由器子網(wǎng)中找到,路由器可以直接與這些容器通信。
二次
二次
當(dāng)路由器希望向第一個(gè)容器發(fā)送IPv 6數(shù)據(jù)包時(shí),它將發(fā)送一個(gè)鄰居請(qǐng)求問(wèn)“誰(shuí)有2001:db8::c009
“但是,子網(wǎng)上沒(méi)有一個(gè)主機(jī)有地址;帶有地址的容器隱藏在Docker主機(jī)后面。因此,Docker主機(jī)必須偵聽(tīng)鄰居的請(qǐng)求,并響應(yīng)它是具有地址的設(shè)備。此功能稱(chēng)為NDP代理并由主機(jī)上的內(nèi)核處理。要啟用NDP代理,請(qǐng)執(zhí)行以下命令:
$ sysctl net.ipv6.conf.eth0.proxy_ndp=1
接下來(lái),將容器的IPv 6地址添加到NDP代理表中:
$ ip -6 neigh add proxy 2001:db8::c009 dev eth0
從現(xiàn)在開(kāi)始,內(nèi)核在設(shè)備上回答鄰居請(qǐng)求地址。eth0
.到此IPv 6地址的所有通信都通過(guò)Docker主機(jī)路由,Docker主機(jī)將根據(jù)其路由表通過(guò)docker0
裝置:
$ ip -6 route show2001:db8::c008/125 dev docker0 metric 12001:db8::/64 dev eth0 proto kernel metric 256
您必須執(zhí)行ip -6 neigh add proxy ...
命令對(duì)您的Docker子網(wǎng)中的每個(gè)IPv 6地址執(zhí)行命令。不幸的是,沒(méi)有通過(guò)執(zhí)行一個(gè)命令來(lái)添加整個(gè)子網(wǎng)的功能。另一種方法是使用ndp代理守護(hù)進(jìn)程,如ndppd...
使用可路由IPv 6地址可以實(shí)現(xiàn)不同主機(jī)上容器之間的通信。讓我們看看一個(gè)簡(jiǎn)單的DockerIPv 6集群示例:
二次
二次
碼頭主機(jī)在2001:db8:0::/64
子網(wǎng)。主機(jī)1被配置為從2001:db8:1::/64
子網(wǎng)到它的容器。它配置了三條路由:
將所有交通線(xiàn)路送至2001:db8:0::/64
通孔eth0
將所有交通線(xiàn)路送至2001:db8:1::/64
通孔docker0
將所有交通線(xiàn)路送至2001:db8:2::/64
通過(guò)帶有IP的主機(jī)22001:db8::2
Host 1還充當(dāng)OSI第3層上的路由器。當(dāng)其中一個(gè)網(wǎng)絡(luò)客戶(hù)端試圖聯(lián)系主機(jī)1的路由表中指定的目標(biāo)時(shí),Host 1將相應(yīng)地轉(zhuǎn)發(fā)通信量。它充當(dāng)它所知道的所有網(wǎng)絡(luò)的路由器:2001:db8::/64
,,,2001:db8:1::/64
,和2001:db8:2::/64
...
在主機(jī)2上,我們的配置幾乎相同。主機(jī)2的容器將從2001:db8:2::/64
.2號(hào)旅館配置了三條路線(xiàn):
將所有交通線(xiàn)路送至2001:db8:0::/64
通孔eth0
將所有交通線(xiàn)路送至2001:db8:2::/64
通孔docker0
將所有交通線(xiàn)路送至2001:db8:1::/64
通過(guò)帶有IP的主機(jī)12001:db8:0::1
主機(jī)1的不同之處在于網(wǎng)絡(luò)2001:db8:2::/64
通過(guò)其docker0
接口而Host 2到達(dá)2001:db8:1::/64
通過(guò)Host 1的IPv 6地址2001:db8::1
...
這樣,每個(gè)容器都能聯(lián)系到其他的容器。集裝箱Container1-*
共享同一個(gè)子網(wǎng),并直接聯(lián)系對(duì)方。之間的交通Container1-*
和Container2-*
將通過(guò)Host 1和Host 2路由,因?yàn)檫@些容器不共享相同的子網(wǎng)。
在切換環(huán)境中,每個(gè)主機(jī)都必須知道到每個(gè)子網(wǎng)的所有路由。在向群集添加或刪除主機(jī)后,始終必須更新主機(jī)的路由表。
在虛線(xiàn)下面顯示的圖表中的每個(gè)配置都由Docker處理:docker0
網(wǎng)橋IP地址配置、主機(jī)上到Docker子網(wǎng)的路由、容器IP地址和容器上的路由。線(xiàn)上的配置由用戶(hù)決定,可以適應(yīng)個(gè)人環(huán)境。
在路由網(wǎng)絡(luò)環(huán)境中,用第三層路由器替換第二層交換機(jī)?,F(xiàn)在,主機(jī)只需知道它們的默認(rèn)網(wǎng)關(guān)%28、路由器%29和到它們自己的容器的路由%28由Docker%29管理。路由器保存有關(guān)Docker子網(wǎng)的所有路由信息。當(dāng)您在此環(huán)境中添加或移除主機(jī)時(shí),您只需更新路由器中的路由表--而不是在每個(gè)主機(jī)上。
二次
二次
在這種情況下,同一主機(jī)的容器可以直接通信。不同主機(jī)上的容器之間的通信將通過(guò)它們的主機(jī)和路由器進(jìn)行路由。例如,從Container1-1
到Container2-1
將通過(guò)Host1
,,,Router
,和Host2
直到它到達(dá)Container2-1
...
若要使IPv 6地址在本例中保持較短,請(qǐng)使用/48
網(wǎng)絡(luò)分配給每個(gè)主機(jī)。主機(jī)使用/64
它的子網(wǎng)用于它自己的服務(wù),一個(gè)子網(wǎng)用于Docker。當(dāng)添加第三個(gè)主機(jī)時(shí),您將為子網(wǎng)添加一個(gè)路由。2001:db8:3::/48
在路由器中并在主機(jī)3上配置Docker--fixed-cidr-v6=2001:db8:3:1::/64
...
請(qǐng)記住,碼頭集裝箱的子網(wǎng)至少應(yīng)該有/80
這樣,IPv 6地址就可以以容器的MAC地址結(jié)束,從而防止了Docker層中NDP鄰居緩存失效的問(wèn)題。所以如果你有一個(gè)/64
為您的整個(gè)環(huán)境使用/76
主機(jī)和/80
為了容器。這樣您就可以使用4096主機(jī)和16主機(jī)。/80
每個(gè)人都有。
在虛線(xiàn)下面可視化的圖表中的每個(gè)配置都由Docker處理:docker0
網(wǎng)橋IP地址配置、主機(jī)上到Docker子網(wǎng)的路由、容器IP地址和容器上的路由。線(xiàn)上的配置由用戶(hù)決定,可以適應(yīng)個(gè)人環(huán)境。