摘要:在版本之后,引入了一套子命令來(lái)管理網(wǎng)絡(luò)。具體來(lái)說(shuō),網(wǎng)絡(luò)是通過(guò)一個(gè)叫的東西來(lái)進(jìn)行管理的,用命令對(duì)網(wǎng)絡(luò)進(jìn)行操作實(shí)際上是與進(jìn)行交互。內(nèi)置有五種網(wǎng)絡(luò)驅(qū)動(dòng),分別是驅(qū)動(dòng)驅(qū)動(dòng)驅(qū)動(dòng)驅(qū)動(dòng)驅(qū)動(dòng)。這些網(wǎng)絡(luò)驅(qū)動(dòng)為提供了多種網(wǎng)絡(luò)模式。
libnetwork
docker在1.9版本之后,引入了一套docker network子命令來(lái)管理docker網(wǎng)絡(luò)。這允許用戶可以根據(jù)他們應(yīng)用的拓?fù)浣Y(jié)構(gòu)創(chuàng)建虛擬網(wǎng)絡(luò)并將容器接入其所對(duì)應(yīng)的網(wǎng)絡(luò)。
具體來(lái)說(shuō),docker網(wǎng)絡(luò)是通過(guò)一個(gè)叫l(wèi)ibnetwork的東西來(lái)進(jìn)行管理的,用docker network命令對(duì)docker網(wǎng)絡(luò)進(jìn)行操作實(shí)際上是與libnetwork Api進(jìn)行交互。
libnetwork內(nèi)置有五種網(wǎng)絡(luò)驅(qū)動(dòng),分別是:bridge驅(qū)動(dòng)、host驅(qū)動(dòng)、overlay驅(qū)動(dòng)、remote驅(qū)動(dòng)、null驅(qū)動(dòng)。這些網(wǎng)絡(luò)驅(qū)動(dòng)為docker提供了多種網(wǎng)絡(luò)模式。下面我們簡(jiǎn)單說(shuō)說(shuō)各驅(qū)動(dòng)的作用:
bridge驅(qū)動(dòng)bridge驅(qū)動(dòng)即為通常說(shuō)的橋接模式,此驅(qū)動(dòng)為Docker的默認(rèn)驅(qū)動(dòng),該驅(qū)動(dòng)的作用為將Docker容器連接到docker默認(rèn)創(chuàng)建的docker0網(wǎng)橋上面,如果未指定--network選項(xiàng),創(chuàng)建的容器將默認(rèn)指向docker0,該驅(qū)動(dòng)即對(duì)應(yīng)docker的bridge網(wǎng)絡(luò)模式,通過(guò)NAT地址轉(zhuǎn)換使容器和外界進(jìn)行通信。
可使用如下命令查看docker0網(wǎng)橋,該網(wǎng)橋會(huì)在docker安裝后自動(dòng)配置:
ip addr
我們可以看到默認(rèn)的docker0網(wǎng)橋ip為172.17.0.1/16,在某些情況下假如我們宿主機(jī)網(wǎng)段與docker0網(wǎng)段相同,我們用bridge模式默認(rèn)的docker0網(wǎng)橋會(huì)與宿主機(jī)產(chǎn)生網(wǎng)段沖突問(wèn)題,這時(shí)候只需要更改docker0默認(rèn)的網(wǎng)段或者使用docker容器的--network選項(xiàng)選擇用戶自定義的網(wǎng)橋即可解決。
host驅(qū)動(dòng)該驅(qū)動(dòng)將docker容器與宿主機(jī)網(wǎng)絡(luò)處于同一個(gè)network namespace下,docker容器將使用宿主機(jī)的網(wǎng)卡、ip和端口信息,故容器與外界不進(jìn)行NAT地址轉(zhuǎn)換,增加了網(wǎng)絡(luò)性能,但是缺點(diǎn)是宿主機(jī)上已使用的端口docker容器不能再使用,該驅(qū)動(dòng)對(duì)應(yīng)docker的host網(wǎng)絡(luò)模式。
overlay驅(qū)動(dòng)此驅(qū)動(dòng)采用IETE標(biāo)準(zhǔn)的VXLAN方式,具體VXLAN實(shí)現(xiàn)方式這里暫不說(shuō)明,該驅(qū)動(dòng)主要用于創(chuàng)建容器的跨主機(jī)網(wǎng)絡(luò),對(duì)應(yīng)docker的user-defined網(wǎng)絡(luò)模式。
remote驅(qū)動(dòng)這個(gè)驅(qū)動(dòng)用于用戶向libnetwork提供自定義的網(wǎng)絡(luò)插件,并沒(méi)有實(shí)現(xiàn)任何網(wǎng)絡(luò)功能。
null驅(qū)動(dòng)null驅(qū)動(dòng)即為docker容器的none網(wǎng)絡(luò)模式,該模式并為docker容器提供任何網(wǎng)絡(luò)配置,只有docker容器自身的lo網(wǎng)卡,該模式一般用于一些特定的情況。
bridge網(wǎng)絡(luò)模式的實(shí)現(xiàn)方式我們常用的docker網(wǎng)絡(luò)模式一般都是bridge模式,下面我們來(lái)分析docker是如何實(shí)現(xiàn)橋接網(wǎng)絡(luò)的。
首先我們可以通過(guò)如下命令查看docker0網(wǎng)關(guān):
route -n
從如上命令可以看出所有指向ip為172.17.0.0/16的數(shù)據(jù)包都從docker0網(wǎng)卡轉(zhuǎn)發(fā)。
然后我們用docker run命令啟動(dòng)一個(gè)容器名為demo,進(jìn)入容器demo,同樣用ip addr或ifconfig命令查看網(wǎng)卡,我們可以看到如下兩個(gè)網(wǎng)卡:
lo網(wǎng)卡和eth0網(wǎng)卡。lo網(wǎng)卡即為容器自身的回環(huán)網(wǎng)卡,eth0網(wǎng)卡ip為172.17.0.3/16,和宿主機(jī)網(wǎng)卡docker0在同一網(wǎng)段,這時(shí)我們用route -n命令查看demo容器的網(wǎng)關(guān)如下:
可以看出demo的eth0網(wǎng)卡與宿主機(jī)的docker0網(wǎng)卡是相互連通的。
這時(shí)退出demo容器再來(lái)用ip addr查看宿主機(jī)的網(wǎng)絡(luò)設(shè)備,會(huì)發(fā)現(xiàn)有一塊以“veth”開(kāi)頭的網(wǎng)卡,如veth5653371,我們可以猜測(cè)veth5653371與demo容器內(nèi)的eth0網(wǎng)卡是一對(duì)veth設(shè)備(veth pair總是成對(duì)出現(xiàn)),veth設(shè)備的作用為用來(lái)連接兩個(gè)不同的network namespace,故docker0不是單純的網(wǎng)卡而是網(wǎng)橋了,這就是docker的bridge網(wǎng)絡(luò)模式的實(shí)現(xiàn)方式,通過(guò)連接docker0網(wǎng)橋來(lái)實(shí)現(xiàn)宿主機(jī)和容器的網(wǎng)絡(luò)互通。
iptables規(guī)則實(shí)現(xiàn)端口映射我們知道了docker的bridge網(wǎng)絡(luò)模式的網(wǎng)絡(luò)互通方式,那么docker是如何實(shí)現(xiàn)宿主機(jī)和容器的端口映射的呢?這一切都靠配置iptables規(guī)則來(lái)實(shí)現(xiàn),具體表現(xiàn)如下:
Docker安裝完成后,將默認(rèn)在宿主機(jī)系統(tǒng)上增加一些iptables規(guī)則,用iptables-save命令查看以下規(guī)則:
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
上面這條規(guī)則關(guān)系著Docker容器和外界的通信,含義是:將源地址為172.17.0.0/16的數(shù)據(jù)包(即Docker容器發(fā)出的數(shù)據(jù)),當(dāng)不是從docker0網(wǎng)卡發(fā)出時(shí)做SNAT。這樣docker容器訪問(wèn)外部的流量會(huì)認(rèn)為是宿主機(jī)發(fā)出的。
同理,docker容器和宿主機(jī)的端口映射也是通過(guò)iptalbes映射來(lái)實(shí)現(xiàn)的,假設(shè)我們啟動(dòng)一個(gè)容器將其端口8080映射到宿主機(jī)端口8080上,我們可以看到如下規(guī)則:
-A POSTROUTING -s 172.17.0.3/16 -d 172.17.0.3/16 -p tcp -m tcp --dport 8080 -j MASQUERADE -A DOCKER -d 172.17.0.3/16 ! -i docker0 -o docker0 -p tcp -m tcp --dport 8080 -j ACCEPT
該規(guī)則將訪問(wèn)宿主機(jī)8080端口的流量轉(zhuǎn)發(fā)到172.17.0.3/16(即demo容器的etho網(wǎng)卡)上,所以docker是通過(guò)配置iptalbes規(guī)則來(lái)實(shí)現(xiàn)端口映射的。
不同宿主機(jī)容器網(wǎng)絡(luò)互通到目前為止,我們所講的docker網(wǎng)絡(luò)環(huán)境僅僅是對(duì)單機(jī)而言的,要實(shí)現(xiàn)不同宿主機(jī)的網(wǎng)絡(luò)互通常常有多種方式,我這里選用的是flannel來(lái)實(shí)現(xiàn)不同宿主機(jī)容器的網(wǎng)絡(luò)互通,這也是kubernetes實(shí)現(xiàn)網(wǎng)絡(luò)互通的方式,要想知道flannel是如何實(shí)現(xiàn)網(wǎng)絡(luò)互通的,請(qǐng)查看我的下一篇博文:flannel解讀
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/27571.html
摘要:網(wǎng)絡(luò)主要是單機(jī)網(wǎng)絡(luò)和多主機(jī)通信模式。下面分別介紹一下的各個(gè)網(wǎng)絡(luò)模式。設(shè)計(jì)的網(wǎng)絡(luò)模型。是以對(duì)定義的元數(shù)據(jù)。用戶可以通過(guò)定義這樣的元數(shù)據(jù)來(lái)自定義和驅(qū)動(dòng)的行為。 前言 理解docker,主要從namesapce,cgroups,聯(lián)合文件,運(yùn)行時(shí)(runC),網(wǎng)絡(luò)幾個(gè)方面。接下來(lái)我們會(huì)花一些時(shí)間,分別介紹。 docker系列--namespace解讀 docker系列--cgroups解讀 ...
摘要:網(wǎng)絡(luò)主要是單機(jī)網(wǎng)絡(luò)和多主機(jī)通信模式。下面分別介紹一下的各個(gè)網(wǎng)絡(luò)模式。設(shè)計(jì)的網(wǎng)絡(luò)模型。是以對(duì)定義的元數(shù)據(jù)。用戶可以通過(guò)定義這樣的元數(shù)據(jù)來(lái)自定義和驅(qū)動(dòng)的行為。 前言 理解docker,主要從namesapce,cgroups,聯(lián)合文件,運(yùn)行時(shí)(runC),網(wǎng)絡(luò)幾個(gè)方面。接下來(lái)我們會(huì)花一些時(shí)間,分別介紹。 docker系列--namespace解讀 docker系列--cgroups解讀 ...
摘要:網(wǎng)絡(luò)主要是單機(jī)網(wǎng)絡(luò)和多主機(jī)通信模式。下面分別介紹一下的各個(gè)網(wǎng)絡(luò)模式。設(shè)計(jì)的網(wǎng)絡(luò)模型。是以對(duì)定義的元數(shù)據(jù)。用戶可以通過(guò)定義這樣的元數(shù)據(jù)來(lái)自定義和驅(qū)動(dòng)的行為。 前言 理解docker,主要從namesapce,cgroups,聯(lián)合文件,運(yùn)行時(shí)(runC),網(wǎng)絡(luò)幾個(gè)方面。接下來(lái)我們會(huì)花一些時(shí)間,分別介紹。 docker系列--namespace解讀 docker系列--cgroups解讀 ...
摘要:系列解讀系列解讀系列解讀系列解讀系列網(wǎng)絡(luò)模式解讀主要是隔離作用,主要是資源限制,聯(lián)合文件主要用于鏡像分層存儲(chǔ)和管理,是運(yùn)行時(shí),遵循了接口,一般來(lái)說(shuō)基于。凍結(jié)暫停中的進(jìn)程。配置時(shí)間都以微秒為單位,文件名中用表示。 前言 理解docker,主要從namesapce,cgroups,聯(lián)合文件,運(yùn)行時(shí)(runC),網(wǎng)絡(luò)幾個(gè)方面。接下來(lái)我們會(huì)花一些時(shí)間,分別介紹。 docker系列--name...
摘要:系列解讀系列解讀系列解讀系列解讀系列網(wǎng)絡(luò)模式解讀主要是隔離作用,主要是資源限制,聯(lián)合文件主要用于鏡像分層存儲(chǔ)和管理,是運(yùn)行時(shí),遵循了接口,一般來(lái)說(shuō)基于。凍結(jié)暫停中的進(jìn)程。配置時(shí)間都以微秒為單位,文件名中用表示。 前言 理解docker,主要從namesapce,cgroups,聯(lián)合文件,運(yùn)行時(shí)(runC),網(wǎng)絡(luò)幾個(gè)方面。接下來(lái)我們會(huì)花一些時(shí)間,分別介紹。 docker系列--name...
閱讀 1587·2021-09-24 10:38
閱讀 1520·2021-09-22 15:15
閱讀 3070·2021-09-09 09:33
閱讀 912·2019-08-30 11:08
閱讀 647·2019-08-30 10:52
閱讀 1260·2019-08-30 10:52
閱讀 2354·2019-08-28 18:01
閱讀 529·2019-08-28 17:55