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