Docker系列4:Docker網(wǎng)絡(luò)虛擬化基礎(chǔ)

一、網(wǎng)絡(luò)虛擬化技術(shù)介紹

目前成都創(chuàng)新互聯(lián)已為千余家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)頁空間、網(wǎng)站托管維護(hù)、企業(yè)網(wǎng)站設(shè)計、無錫網(wǎng)站維護(hù)等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

1、什么是虛擬化網(wǎng)絡(luò)

虛擬化網(wǎng)絡(luò)即由linux內(nèi)核所虛擬出來的網(wǎng)絡(luò),事實上,linux內(nèi)核可模擬多種網(wǎng)絡(luò)設(shè)備

  • 可模擬網(wǎng)線設(shè)備:模擬的網(wǎng)線設(shè)備是成對出現(xiàn)的,一個可用在容器內(nèi),一端用在交換機(jī)內(nèi)

  • 可模擬交換機(jī):容器接在這個交換機(jī)上,如果IP在同一網(wǎng)段,就可以實現(xiàn)互相通信,如下

? ??Docker系列4:Docker網(wǎng)絡(luò)虛擬化基礎(chǔ)

網(wǎng)絡(luò)虛擬化的解決方案有很多,例如:

  • OVS

  • SDN

在物理機(jī)上可以有多個虛擬交換機(jī),容器可以分別接在不同的虛擬交換機(jī)上,如果兩個虛擬交換機(jī)不在同一個網(wǎng)段,那么如何進(jìn)行通信呢?

? ??Docker系列4:Docker網(wǎng)絡(luò)虛擬化基礎(chǔ)?

此時需要進(jìn)行轉(zhuǎn)發(fā)

? ??Docker系列4:Docker網(wǎng)絡(luò)虛擬化基礎(chǔ)

  • 可借助于內(nèi)核轉(zhuǎn)發(fā)

  • 也可以借助于iptables轉(zhuǎn)發(fā)

2、如何實現(xiàn)兩個物理機(jī)上的容器怎么通信?

方法1:是橋接模式(比如vmware的橋接)

  • 橋接模式情況下,物理網(wǎng)卡會作為交換機(jī)來使用的

  • 所有虛擬機(jī)都接入到這個物理網(wǎng)卡所模擬的交換機(jī)

  • 然后在模擬出來一個網(wǎng)卡給物理機(jī)使用,這個模擬的網(wǎng)卡也接入到交換機(jī)上

? ??Docker系列4:Docker網(wǎng)絡(luò)虛擬化基礎(chǔ)

當(dāng)有數(shù)據(jù)包過來的時候,物理機(jī)網(wǎng)絡(luò)會判斷目標(biāo)mac

  • 如果是vm1,就將這個數(shù)據(jù)包轉(zhuǎn)發(fā)到vm1

  • 如果是物理機(jī)自己的mac地址,那就就將這個報文轉(zhuǎn)發(fā)給內(nèi)部虛擬的網(wǎng)卡

  • 不同主機(jī)上的容器,可以用橋接的方式來實現(xiàn)通信,就是將物理網(wǎng)卡作為交換機(jī)

? ??Docker系列4:Docker網(wǎng)絡(luò)虛擬化基礎(chǔ)

注意:

  • 橋接模式,代價是很大的,尤其在一個大規(guī)模部署的場景中,這樣做的結(jié)果就一定會導(dǎo)致網(wǎng)絡(luò)中的主機(jī)過多,導(dǎo)致風(fēng)暴。

方法2:NAT模式

  • 在nat模式場景下,每個容器都還是接入在一個虛擬交換機(jī),并且容器的網(wǎng)關(guān)需要指向這個交換機(jī)的地址,

  • 當(dāng)容器產(chǎn)生數(shù)據(jù)包的時候,這個數(shù)據(jù)就會發(fā)送到虛擬機(jī)換機(jī)上

  • 虛擬交換機(jī)是由內(nèi)核模擬的是,所以這個數(shù)據(jù)包會被內(nèi)核收到

  • 內(nèi)核就會檢查發(fā)現(xiàn)目標(biāo)主機(jī)是不是自己,如果不是自己,那么就會將這個數(shù)據(jù)包從網(wǎng)卡發(fā)送出去,這樣就完成了數(shù)據(jù)的發(fā)送。

? ??Docker系列4:Docker網(wǎng)絡(luò)虛擬化基礎(chǔ)

注意:此時的問題問題是雖然能將數(shù)據(jù)發(fā)送出去,但是回不來

  • 因為C所發(fā)送出去的數(shù)據(jù)包的源地址是C1,而這個地址被交換機(jī)隱藏起來的是,網(wǎng)絡(luò)中的其他主機(jī)是找不到這個地址的,所以,回不來。

  • 如果想讓數(shù)據(jù)可以正常的回復(fù),就需要在H1主機(jī)上,在發(fā)送數(shù)據(jù)包的時候,將數(shù)據(jù)包的源地址修改成H1主機(jī)的地址,同時記錄下來這個轉(zhuǎn)發(fā)規(guī)則。

  • 這樣,當(dāng)回復(fù)數(shù)據(jù)的時候,只需要將數(shù)據(jù)回復(fù)給H1主機(jī),H1主機(jī)通過檢查地址轉(zhuǎn)換表,就知道了需要將這個數(shù)據(jù)包轉(zhuǎn)發(fā)給C1了。

以上兩種方式都存在各自的問題

  • 橋接方式:容器需要直接暴露在網(wǎng)絡(luò)中,容器太多的時候,容器形成風(fēng)暴

  • NAT方式:容器基于nat進(jìn)行通信,而且需要進(jìn)行兩次地址轉(zhuǎn)換,效率太低

方法3:疊加網(wǎng)絡(luò)(Overlay network),這種網(wǎng)絡(luò)是基于隧道模式實現(xiàn)的

  • 隧道模式下,也需要模擬一個交換機(jī),而且容器也是接在交換機(jī)上,如下圖

? ??Docker系列4:Docker網(wǎng)絡(luò)虛擬化基礎(chǔ)

  • 此時在進(jìn)行數(shù)據(jù)發(fā)送的時候,不會修改數(shù)據(jù)包的源IP 源mac,而是在會原來數(shù)據(jù)包的基礎(chǔ)上再封裝一層ip和mac

二、Docker網(wǎng)絡(luò)詳解

1、Docker的三種網(wǎng)絡(luò)

[root@host1?~]#?docker?network?ls
NETWORK?ID??????????NAME????????????????DRIVER??????????????SCOPE
591c75b7dbea????????bridge??????????????bridge??????????????local
386d8dc4beb8????????host????????????????host????????????????local
eb7b7cf29f29????????none????????????????null????????????????local

2、bridge就是橋接模式

  • 這個橋并不是物理網(wǎng)卡的橋,而是創(chuàng)建了一個純軟件的交換機(jī)叫做docker0

  • 可以用ip addr或者ip link show看到

[root@host1?~]#?ip?addr
1:?lo:?<LOOPBACK,UP,LOWER_UP>?mtu?65536?qdisc?noqueue?state?UNKNOWN?group?default?qlen?1000
??...
2:?ens33:?<BROADCAST,MULTICAST,UP,LOWER_UP>?mtu?1500?qdisc?pfifo_fast?state?UP?group?default?qlen?1000
??...
3:?ens37:?<BROADCAST,MULTICAST,UP,LOWER_UP>?mtu?1500?qdisc?pfifo_fast?state?UP?group?default?qlen?1000
??...
4:?docker0:?<NO-CARRIER,BROADCAST,MULTICAST,UP>?mtu?1500?qdisc?noqueue?state?DOWN?group?default?
????link/ether?02:42:a4:e8:44:11?brd?ff:ff:ff:ff:ff:ff
????inet?172.17.0.1/16?brd?172.17.255.255?scope?global?docker0
???????valid_lft?forever?preferred_lft?forever
[root@host1?~]#?ip?link?show
1:?lo:?<LOOPBACK,UP,LOWER_UP>?mtu?65536?qdisc?noqueue?state?UNKNOWN?mode?DEFAULT?group?default?qlen?1000
????link/loopback?00:00:00:00:00:00?brd?00:00:00:00:00:00
2:?ens33:?<BROADCAST,MULTICAST,UP,LOWER_UP>?mtu?1500?qdisc?pfifo_fast?state?UP?mode?DEFAULT?group?default?qlen?1000
????link/ether?00:0c:29:3f:bf:cf?brd?ff:ff:ff:ff:ff:ff
3:?ens37:?<BROADCAST,MULTICAST,UP,LOWER_UP>?mtu?1500?qdisc?pfifo_fast?state?UP?mode?DEFAULT?group?default?qlen?1000
????link/ether?00:0c:29:3f:bf:d9?brd?ff:ff:ff:ff:ff:ff
4:?docker0:?<BROADCAST,MULTICAST,UP,LOWER_UP>?mtu?1500?qdisc?noqueue?state?UP?mode?DEFAULT?group?default?
????link/ether?02:42:a4:e8:44:11?brd?ff:ff:ff:ff:ff:ff
6:?veth7c1728b@if5:?<BROADCAST,MULTICAST,UP,LOWER_UP>?mtu?1500?qdisc?noqueue?master?docker0?state?UP?mode?DEFAULT?group?default?
????link/ether?9a:be:3b:60:d7:2e?brd?ff:ff:ff:ff:ff:ff?link-netnsid?0

啟動一個容器

[root@host1?~]#?docker?run?--rm?--name?vh2?-it?busybox
/?#

此時物理機(jī)會多出一個網(wǎng)卡設(shè)備

[root@host1?~]#?ip?addr
1:?lo:?<LOOPBACK,UP,LOWER_UP>?mtu?65536?qdisc?noqueue?state?UNKNOWN?group?default?qlen?1000
?...
2:?ens33:?<BROADCAST,MULTICAST,UP,LOWER_UP>?mtu?1500?qdisc?pfifo_fast?state?UP?group?default?qlen?1000
?...
3:?ens37:?<BROADCAST,MULTICAST,UP,LOWER_UP>?mtu?1500?qdisc?pfifo_fast?state?UP?group?default?qlen?1000
?...
4:?docker0:?<BROADCAST,MULTICAST,UP,LOWER_UP>?mtu?1500?qdisc?noqueue?state?UP?group?default?
????link/ether?02:42:a4:e8:44:11?brd?ff:ff:ff:ff:ff:ff
????inet?172.17.0.1/16?brd?172.17.255.255?scope?global?docker0
???????valid_lft?forever?preferred_lft?forever
????inet6?fe80::42:a4ff:fee8:4411/64?scope?link?
???????valid_lft?forever?preferred_lft?forever
6:?veth7c1728b@if5:?<BROADCAST,MULTICAST,UP,LOWER_UP>?mtu?1500?qdisc?noqueue?master?docker0?state?UP?group?default?
????link/ether?9a:be:3b:60:d7:2e?brd?ff:ff:ff:ff:ff:ff?link-netnsid?0
????inet6?fe80::98be:3bff:fe60:d72e/64?scope?link?
???????valid_lft?forever?preferred_lft?forever
  • 這個 veth7c1728b@if5 其實就是所生成的一對網(wǎng)卡中,連接到docker0網(wǎng)橋上的那一部分

  • 也就是可以理解三個容器將網(wǎng)線插入到了交換機(jī)上

  • 網(wǎng)卡中 @?前面的部分是接入到虛擬機(jī)交換機(jī)中的部分

  • 網(wǎng)卡中 @ 后面的部分是容器的部分了

在容器中看一下網(wǎng)卡信息

/?#?ip?addr

可以通過brctl開控制和查看物理機(jī)網(wǎng)卡和容器網(wǎng)卡的對應(yīng)關(guān)系

[root@host1?~]#?yum?install?bridge-utils?-y
[root@host1?~]#?brctl?show
bridge?namebridge?idSTP?enabledinterfaces
docker08000.0242a4e84411noveth7c1728b

其實在使用了Docker0網(wǎng)橋的時候,系統(tǒng)是會自動生成一個iptables規(guī)則的【POSTROUNTING規(guī)則】

[root@host1?~]#?iptables?-L?-n?--line?-t?nat
Chain?PREROUTING?(policy?ACCEPT)
num??target?????prot?opt?source???????????????destination?????????
1????DOCKER?????all??--??0.0.0.0/0????????????0.0.0.0/0????????????ADDRTYPE?match?dst-type?LOCAL

Chain?INPUT?(policy?ACCEPT)
num??target?????prot?opt?source???????????????destination?????????

Chain?OUTPUT?(policy?ACCEPT)
num??target?????prot?opt?source???????????????destination?????????
1????DOCKER?????all??--??0.0.0.0/0???????????!127.0.0.0/8??????????ADDRTYPE?match?dst-type?LOCAL

Chain?POSTROUTING?(policy?ACCEPT)
num??target?????prot?opt?source???????????????destination?????????
1????MASQUERADE??all??--??172.17.0.0/16????????0.0.0.0/0???????????

Chain?DOCKER?(2?references)
num??target?????prot?opt?source???????????????destination?????????
1????RETURN?????all??--??0.0.0.0/0????????????0.0.0.0/0

docker的客戶端來源有三種

  • 宿主機(jī):例如在宿主機(jī)上訪問容器中的網(wǎng)站

  • 同一宿主機(jī)上的其他容器:兩個容器接在同一個物理機(jī)的同一個交換機(jī)上,必然可以通信

  • 其他宿主機(jī)或者其他宿主機(jī)上的容器:這種情況下需要通過nat方式或者疊加網(wǎng)絡(luò)的方式通信

3、host模式

一個容器中要隔離6類名稱空間

  • user

  • mount

  • pid

  • uts

  • net

  • ipc

思考:有三個容器,這個三個容器只隔離三個名稱空間 user mount pid,而另外三個是容器共享的,會是什么現(xiàn)象,如下圖

? ??Docker系列4:Docker網(wǎng)絡(luò)虛擬化基礎(chǔ)

  • 此時,各個容器有自己文件系統(tǒng)、用戶信息和進(jìn)程信息,并且是互不干擾的

  • 但是多個容器的主機(jī)名、網(wǎng)卡、協(xié)議棧是共享的,也就是主機(jī)名、地址都是相同的

  • 這樣一來,一個容器訪問另一個容器的上的資源的時候,直接用12.0.0.1就可以了

  • 比如一個容器安裝的apache,一個安裝了MySQL,一個安裝了php,那么這三個主機(jī)互相通信,就完全可以基于127地址來完成,因為他們用的是同一個協(xié)議棧。

讓容器共享物理機(jī)的名稱空間

  • 容器共享物理機(jī)的網(wǎng)卡名稱空間,這樣的話就是如果在容器中修改網(wǎng)卡,那么就會修改物理機(jī)的網(wǎng)卡的。

  • 這種模式就是docker 網(wǎng)絡(luò)中的第二類:host,也就是讓容器使用宿主機(jī)的網(wǎng)絡(luò)名稱空間

4、NULL模式

  • docker 網(wǎng)絡(luò)中的第三類:null

  • 如果一個容器的的網(wǎng)絡(luò)設(shè)置成null網(wǎng)絡(luò),那么也就是說這個容器是沒有網(wǎng)絡(luò),有的時候需要創(chuàng)建一個容器不需要和外部主機(jī)通信,那么就可以用這種方式。

5、容器模型分類示意圖

??Docker系列4:Docker網(wǎng)絡(luò)虛擬化基礎(chǔ)

  • 關(guān)閉模型容器(closed)

  • 橋解模型容器(bridged),這個橋是nat橋,不是物理橋,而且該模式是默認(rèn)模式

  • 聯(lián)盟模型容器(joined)

  • 開放模型容器(open)

6、查看創(chuàng)建容器的時網(wǎng)絡(luò)信息

查看一下 bridged 網(wǎng)絡(luò)模型信息

[root@host1?~]#?docker?network?inspect?bridge
????????...
????????...
????????????????????"Subnet":?"172.17.0.0/16",
????????????????????"Gateway":?"172.17.0.1"
????????...
????????...
????????...
????????????"com.docker.network.bridge.name":?"docker0",
????????...

查看容器的網(wǎng)絡(luò)類型

[root@host1?~]#?docker?container?inspect?vh2
????????...
????????...
????????...
????????"NetworkSettings":?{
????????????"Bridge":?"",
????????...
????????...
????????...

網(wǎng)站題目:Docker系列4:Docker網(wǎng)絡(luò)虛擬化基礎(chǔ)
當(dāng)前網(wǎng)址:http://bm7419.com/article16/iiosgg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、商城網(wǎng)站、網(wǎng)站設(shè)計公司微信小程序、定制開發(fā)、企業(yè)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司