Docker網(wǎng)絡(luò)原理分析_第1頁
Docker網(wǎng)絡(luò)原理分析_第2頁
Docker網(wǎng)絡(luò)原理分析_第3頁
Docker網(wǎng)絡(luò)原理分析_第4頁
Docker網(wǎng)絡(luò)原理分析_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、Docker網(wǎng)絡(luò)原理分析Docker使用linux的bridge和veth虛擬網(wǎng)絡(luò)設(shè)備,以及network namespace對網(wǎng)絡(luò)進行虛擬化。Bridge看其名字是網(wǎng)橋,但實際上它的功能和交換機(switch)相似。Veth則是一對網(wǎng)絡(luò)接口,像是用一條網(wǎng)線連接起來的兩塊網(wǎng)卡。閱讀這篇文章前,應(yīng)該先了解linux的bridge和veth的原理和用法,熟悉brctl, ip, iptables三個重要命令的使用方法。一、Docker 經(jīng)典網(wǎng)絡(luò)架構(gòu):從上圖可知,每個docker容器通過一對veth連入bridge br0。Veth的一端在docker netns中,通常改名為eth0;另一端在de

2、fault或global netns中,通常命名為vethXXXXXXXX。上圖中將其命名為vnic11和vnic21。Bridge br0自帶一個網(wǎng)絡(luò)接口,相當(dāng)于主機的一張網(wǎng)卡,它的名字也叫br0。上圖相當(dāng)于一個bridge br0連接了三臺機器:host,docker1,docker2,它們形成了一個獨立的LAN。而主機的eth0則將主機連接到外部的交換機,和交換上的其它主機形成一個LAN?,F(xiàn)在配置網(wǎng)絡(luò)的IP:Host的eth0:將主機連接到外部交換機。Ip=81/24, 主機的網(wǎng)關(guān)為 dev eth0。Host的br0網(wǎng)絡(luò)接口: 將主機連接到內(nèi)

3、部交換機br0。Ip=/16。注意,當(dāng)同時為主機的eth0和br0設(shè)置IP時,它倆不能處于同一網(wǎng)段。Docker1的eth0:將docker1連接到交換機br0。Ip=00/16。Docker1 網(wǎng)關(guān)為。Docker2的eth0:將docker2連接到交換機br0。Ip=00/16。Docker2 網(wǎng)關(guān)為。這樣docker1,docker2以及host所形成的LAN就配置好了,它的網(wǎng)段為/16?,F(xiàn)在,docker1、docker2以及主機,這三臺設(shè)備可以正常通信了。那么,docker1和docker

4、2如何才能訪問host以外的世界呢?答案是NAT。也就是需要配置轉(zhuǎn)發(fā)機制,在網(wǎng)絡(luò)接口host:br0和host:eth0之間轉(zhuǎn)發(fā)數(shù)據(jù)包。配置轉(zhuǎn)發(fā)機制首先要開啟linux的網(wǎng)絡(luò)轉(zhuǎn)發(fā)功能,然后要在iptables中配置SNAT源地址轉(zhuǎn)換。上面就是docker默認使用的網(wǎng)絡(luò)模式(-net=bridge)。Docker daemon一啟動,就會創(chuàng)建bridge,不過名字叫做 docker0。并將網(wǎng)口docker0的IP配成了/16。以后每啟動一個容器,就自動為該容器創(chuàng)建veth pair,將一端連到bridge docker0,將另一端放入容器內(nèi),改名為eth0。容器內(nèi)的eth0的

5、ip配置為172.17.x.x/16,容器的網(wǎng)關(guān)配置為。下面,我們用命令一步一步創(chuàng)建該網(wǎng)絡(luò),以加深對docker網(wǎng)絡(luò)原理的理解。1. 啟動兩個docker容器,不要讓docker自動配置網(wǎng)絡(luò)docker run itd -name=docker1 -net=none test/ubuntu:14 /bin/bashdocker run itd -name=docker2 -net=none test/ubuntu:14 /bin/bash2. 找到容器的netns,將其連接到/var/run/netns/下,以便為其配置網(wǎng)卡。先找到docker容器的PID:docker1P

6、id=$(docker inspect -format=.State.Pid docker1)docker2Pid=$(docker inspect -format=.State.Pid docker2)再將docker容器的net namespace鏈接到/var/run/netns/:mkdir /var/run/netns #如果沒有該目錄,先創(chuàng)建。ln s /proc/$docker1Pid/ns/net /var/run/netns/docker1nsln s / proc/$docker1Pid/ns/net /var/run/netns/docker2ns現(xiàn)在,就可以查看一下這兩

7、個net namespace中的連接情況:ip netns exec docker1ns ip link list3. 創(chuàng)建網(wǎng)橋和虛擬網(wǎng)卡brctl addbr br0ip link add vnic11 type veth peer name vnic12ip link add vnic21 type veth peer name vnic22ip link list #查看所有l(wèi)ink將vnic11和vnic21 attach到網(wǎng)橋br0:brctl addif br0 vnic11brctl addif br0 vnic214. 把vnic12和vnic22分別放入docker1ns和d

8、ocker2ns,并重命名為eth0ip link set vnic12 netns docker1nsip link set vnic22 netns docker2nsip netns exec docker1ns ip link set vnic12 name eth0ip netns exec docker2ns ip link set vnic22 name eth05. 為網(wǎng)口br0, docker1ns:eth0, docker2ns:eth0配置IPip addr add /16 dev br0ip netns exec docker1ns ip addr ad

9、d 00/16 dev eth0ip netns exec docker1ns ip link set eth0 upip netns exec docker1ns ip route add default via ip netns exec docker2ns ip addr add 00/16 dev eth0ip netns exec docker2ns ip link set eth0 upip netns exec docker2ns ip route add default via 注意,必須先激活網(wǎng)口,才能配置網(wǎng)關(guān)。

10、6. 啟動所有網(wǎng)口ip link set br0 upip link set vnic11 upip link set vnic21 up至此,docker1,dockr2和主機可以相互通信了。7. 開啟linux的轉(zhuǎn)發(fā)功能:sysctl w net.ipv4.ip_forward=1,或者 echo 1 > /proc/sys/net/ipv4/ip_forward這樣,當(dāng)從br0收到包后,若目的地址不是host,則選擇合適的網(wǎng)絡(luò)接口(如eth0)發(fā)出去。從eth0收到包后,也會按一樣的規(guī)則做轉(zhuǎn)發(fā)處理。8. 配置SNAT, 將從docker來的包的源地址改為81i

11、ptables t nat A POSTROUTING s 00 j SNAT -to 81iptables t nat A POSTROUTING s 00 j SNAT -to 81至此,docker1和docker2就可以ping通host以外的世界了。可以嘗試一下:docker attach docker1ping 85 #到你的LAN中的其它機器。要想暫時離開(detach)docker容器,連續(xù)按Ctrl+p, Ctrl+q。下次還可以attach。注意,不要用exit命令,exit會

12、關(guān)閉容器,前面為容器所做的修改都會消失。9. 配置DNAT, 將docker容器內(nèi)的某個端口對外開放,允許主機外的程序訪問docker容器內(nèi)的服務(wù):iptables t nat A PREROUTING d 81 p tcp -dport 8080 j DNAT -to 00:80至此,有人通過tcp協(xié)議訪問81:8080時,如用瀏覽器訪問81:8080,linux會將其映射到docker2的80端口,即00:80。二、將docker容器加入本地網(wǎng)絡(luò)(和主機在同一網(wǎng)段192.168.1

13、.0/24)要將docker容器加入本地網(wǎng)絡(luò),即讓docker容器和host處于同一網(wǎng)段(/24),需要把虛擬交換機(bridge br1)與外部交換級聯(lián),形成一個廣播域。級聯(lián)的方法是:把host:eth0直接attach到bridge br1。這樣一來,host:eth0就不是host的有效網(wǎng)口了,故需要刪除host:eth0的ip,而要把host的ip設(shè)到網(wǎng)口br1上。另外,host的網(wǎng)關(guān)也要用dev br1。按照上述網(wǎng)絡(luò)拓撲,IP設(shè)置如下:host:eth0: 刪除其IP,將其直接連接到網(wǎng)橋br1。br1網(wǎng)口:設(shè)置為eth0原來的IP,即81/

14、24。主機的網(wǎng)關(guān)還是,但訪問外部的網(wǎng)口要換為br1。docker3:eth0:ip為85, 網(wǎng)關(guān)為。docker4:eth0:ip為86,網(wǎng)關(guān)為。下面,我們用命令一步一步創(chuàng)建該網(wǎng)絡(luò)。1. 啟動兩個docker容器,不要讓docker自動配置網(wǎng)絡(luò)docker run itd -name=docker3 -net=none test/ubuntu:14 /bin/bashdocker run itd -name=docker4 -net=none test/ubuntu:14 /bin/b

15、ash2. 找到容器的netns,將其連接到/var/run/netns/下,以便為其配置網(wǎng)卡。先找到docker容器的PID:docker3Pid=$(docker inspect -format=.State.Pid docker3)docker4Pid=$(docker inspect -format=.State.Pid docker4)再將docker容器的net namespace鏈接到/var/run/netns/:mkdir /var/run/netns #如果沒有該目錄,先創(chuàng)建。ln s /proc/$docker3Pid/ns/net /var/run/netns/dock

16、er3nsln s / proc/$docker4Pid/ns/net /var/run/netns/docker4ns現(xiàn)在,就可以查看一下這兩個net namespace中的連接情況:ip netns exec docker4ns ip link list3. 創(chuàng)建網(wǎng)橋和虛擬網(wǎng)卡brctl addbr br1ip link add vnic31 type veth peer name vnic32ip link add vnic41 type veth peer name vnic42ip link list #查看所有l(wèi)ink將vnic31和vnic41 attach到網(wǎng)橋br1:brct

17、l addif br1 vnic31brctl addif br1 vnic414. 把vnic32和vnic42分別放入docker3ns和docker4ns,并重命名為eth0ip link set vnic32 netns docker3nsip link set vnic42 netns docker4nsip netns exec docker3ns ip link set vnic32 name eth0ip netns exec docker4ns ip link set vnic42 name eth05. 為網(wǎng)口docker3ns:eth0, docker4ns:eth0配置

18、IP和網(wǎng)關(guān)ip netns exec docker3ns ip addr add 83/24 dev eth0ip netns exec docker3ns ip link set eth0 upip netns exec docker3ns ip route add default via ip netns exec docker4ns ip addr add 84/24 dev eth0ip netns exec docker4ns ip link set eth0 upip netns exec docker4ns ip route add d

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論