?
本文檔使用 PHP中文網(wǎng)手冊 發(fā)布
本節(jié)中的信息解釋了 Docker 默認(rèn)網(wǎng)橋的 IPv6。這是一個在安裝 Docker 時自動創(chuà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ò)。您可以通過運(yùn)行帶有--ipv6
標(biāo)志的Docker 守護(hù)程序(daemon)來啟用 IPv4 / IPv6 雙棧支持。Docker 將docker0
使用 IPv6 鏈接本地地址fe80::1
設(shè)置網(wǎng)橋。
默認(rèn)情況下,創(chuàng)建的容器只會獲得鏈路本地 IPv6 地址。要將全局可路由的 IPv6 地址分配給您的容器,您必須指定一個 IPv6 子網(wǎng)來從中選擇地址。啟動 Docker 守護(hù)進(jìn)程(daemon)時,通過--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)該至少有一個大小/80
,以便 IPv6地址可以以容器的 MAC 地址結(jié)束,并且可以防止 Docker 層中的 NDP 鄰居緩存失效問題。
默認(rèn)情況下,--fixed-cidr-v6
參數(shù)使Docker為路由表添加一個新路由,方法是代表您運(yùn)行以下三個命令。若要防止自動路由,請設(shè)置ip-forward
到false
在daemon.json
文件或啟動Docker守護(hù)進(jìn)程--ip-forward=false
旗子。然后,要獲得Docker將自動為您創(chuà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
將通過docker0
接口。
注:IPv 6轉(zhuǎn)發(fā)可能會干擾現(xiàn)有的IPv 6配置:如果使用路由器廣告為主機(jī)接口獲取IPv 6設(shè)置,請設(shè)置
accept_ra
到2
使用以下命令。否則,啟用IPv 6的轉(zhuǎn)發(fā)將導(dǎo)致拒絕路由器廣告。 $sysctl net.ipv6.con.eth0.接受[醫(yī)]Ra=2
二次
二次
每個新容器都將從定義的子網(wǎng)中獲得一個IPv 6地址,并將添加一個默認(rèn)路由。eth0
通過守護(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
在這個例子中,容器被分配一個帶有子網(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
通過鏈路本地網(wǎng)關(guān)連接fe80::1
上eth0
...
服務(wù)器或虛擬機(jī)通常會獲得/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
,主人正在收聽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)的唯一部分,但沒有分配IPv 6子網(wǎng),則可以使用NDP代理通過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
將可配置地址范圍劃分為兩個子網(wǎng)2001:db8::c000/125
和2001:db8::c008/125
,使用以下方法daemon.json
設(shè)置。第一個子網(wǎng)將由主機(jī)上的非碼頭進(jìn)程使用,第二個子網(wǎng)將由Docker使用。
{ "ipv6": true, "fixed-cidr-v6": "2001:db8::c008/125"}
Docker子網(wǎng)位于由路由器管理并連接到eth0
所有由Docker分配地址的容器都將在路由器子網(wǎng)中找到,路由器可以直接與這些容器通信。
二次
二次
當(dāng)路由器希望向第一個容器發(fā)送IPv 6數(shù)據(jù)包時,它將發(fā)送一個鄰居請求問“誰有2001:db8::c009
“但是,子網(wǎng)上沒有一個主機(jī)有地址;帶有地址的容器隱藏在Docker主機(jī)后面。因此,Docker主機(jī)必須偵聽鄰居的請求,并響應(yīng)它是具有地址的設(shè)備。此功能稱為NDP代理并由主機(jī)上的內(nèi)核處理。要啟用NDP代理,請執(zhí)行以下命令:
$ sysctl net.ipv6.conf.eth0.proxy_ndp=1
接下來,將容器的IPv 6地址添加到NDP代理表中:
$ ip -6 neigh add proxy 2001:db8::c009 dev eth0
從現(xiàn)在開始,內(nèi)核在設(shè)備上回答鄰居請求地址。eth0
.到此IPv 6地址的所有通信都通過Docker主機(jī)路由,Docker主機(jī)將根據(jù)其路由表通過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 ...
命令對您的Docker子網(wǎng)中的每個IPv 6地址執(zhí)行命令。不幸的是,沒有通過執(zhí)行一個命令來添加整個子網(wǎng)的功能。另一種方法是使用ndp代理守護(hù)進(jìn)程,如ndppd...
使用可路由IPv 6地址可以實(shí)現(xiàn)不同主機(jī)上容器之間的通信。讓我們看看一個簡單的DockerIPv 6集群示例:
二次
二次
碼頭主機(jī)在2001:db8:0::/64
子網(wǎng)。主機(jī)1被配置為從2001:db8:1::/64
子網(wǎng)到它的容器。它配置了三條路由:
將所有交通線路送至2001:db8:0::/64
通孔eth0
將所有交通線路送至2001:db8:1::/64
通孔docker0
將所有交通線路送至2001:db8:2::/64
通過帶有IP的主機(jī)22001:db8::2
Host 1還充當(dāng)OSI第3層上的路由器。當(dāng)其中一個網(wǎng)絡(luò)客戶端試圖聯(lián)系主機(jī)1的路由表中指定的目標(biāo)時,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號旅館配置了三條路線:
將所有交通線路送至2001:db8:0::/64
通孔eth0
將所有交通線路送至2001:db8:2::/64
通孔docker0
將所有交通線路送至2001:db8:1::/64
通過帶有IP的主機(jī)12001:db8:0::1
主機(jī)1的不同之處在于網(wǎng)絡(luò)2001:db8:2::/64
通過其docker0
接口而Host 2到達(dá)2001:db8:1::/64
通過Host 1的IPv 6地址2001:db8::1
...
這樣,每個容器都能聯(lián)系到其他的容器。集裝箱Container1-*
共享同一個子網(wǎng),并直接聯(lián)系對方。之間的交通Container1-*
和Container2-*
將通過Host 1和Host 2路由,因?yàn)檫@些容器不共享相同的子網(wǎng)。
在切換環(huán)境中,每個主機(jī)都必須知道到每個子網(wǎng)的所有路由。在向群集添加或刪除主機(jī)后,始終必須更新主機(jī)的路由表。
在虛線下面顯示的圖表中的每個配置都由Docker處理:docker0
網(wǎng)橋IP地址配置、主機(jī)上到Docker子網(wǎng)的路由、容器IP地址和容器上的路由。線上的配置由用戶決定,可以適應(yīng)個人環(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ī)時,您只需更新路由器中的路由表--而不是在每個主機(jī)上。
二次
二次
在這種情況下,同一主機(jī)的容器可以直接通信。不同主機(jī)上的容器之間的通信將通過它們的主機(jī)和路由器進(jìn)行路由。例如,從Container1-1
到Container2-1
將通過Host1
,,,Router
,和Host2
直到它到達(dá)Container2-1
...
若要使IPv 6地址在本例中保持較短,請使用/48
網(wǎng)絡(luò)分配給每個主機(jī)。主機(jī)使用/64
它的子網(wǎng)用于它自己的服務(wù),一個子網(wǎng)用于Docker。當(dāng)添加第三個主機(jī)時,您將為子網(wǎng)添加一個路由。2001:db8:3::/48
在路由器中并在主機(jī)3上配置Docker--fixed-cidr-v6=2001:db8:3:1::/64
...
請記住,碼頭集裝箱的子網(wǎng)至少應(yīng)該有/80
這樣,IPv 6地址就可以以容器的MAC地址結(jié)束,從而防止了Docker層中NDP鄰居緩存失效的問題。所以如果你有一個/64
為您的整個環(huán)境使用/76
主機(jī)和/80
為了容器。這樣您就可以使用4096主機(jī)和16主機(jī)。/80
每個人都有。
在虛線下面可視化的圖表中的每個配置都由Docker處理:docker0
網(wǎng)橋IP地址配置、主機(jī)上到Docker子網(wǎng)的路由、容器IP地址和容器上的路由。線上的配置由用戶決定,可以適應(yīng)個人環(huán)境。