Docker網(wǎng)絡(luò)原理分析報(bào)告_第1頁
Docker網(wǎng)絡(luò)原理分析報(bào)告_第2頁
Docker網(wǎng)絡(luò)原理分析報(bào)告_第3頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

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

2、;另一端在default 或global netns中,通常命名為 vethXXXXXXXX上圖中將其命名為 vnic11 和 vnic21。 Bridge brO自帶一個(gè)網(wǎng)絡(luò)接口,相當(dāng)于主機(jī)的一網(wǎng)卡,它的名字也叫 brO。上圖相當(dāng)于一個(gè)bridge brO連接了三臺機(jī)器:host,dockerl, docker2,它們形成了一個(gè)獨(dú)立的LAN而主機(jī)的ethO則將主機(jī)連接 到外部的交換機(jī),和交換上的其它主機(jī)形成一個(gè) LAN現(xiàn)在配置網(wǎng)絡(luò)的IP :Host的ethO :將主機(jī)連接到外部交換機(jī)。lp=192.168.1.181/24, 主 機(jī)的網(wǎng)關(guān)為 192.168.1.1 dev ethO 。Hos

3、t的brO網(wǎng)絡(luò)接口 :將主機(jī)連接到部交換機(jī)br0°lp=10.0.0.1/16。注意,當(dāng)同時(shí)為主機(jī)的ethO和brO設(shè)置IP時(shí),它倆不能處于同一網(wǎng) 段。Docker1 的 ethO:將 docker1 連接到交換機(jī) brO。lp=10.0.0.100/16。Docker1 網(wǎng)關(guān)為 。Docker2 的 ethO:將 docker2 連接到交換機(jī) brO。lp=10.0.0.200/16。Docker2 網(wǎng)關(guān)為 。這樣docker1,docker2以及host所形成的LAN就配置好了,它的網(wǎng) 段為。現(xiàn)在,docker1、docker2以及主機(jī),這三臺設(shè)備 可以正常通信了。那么,dock

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

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

6、-format二'.State.Pid'docker1)docker2Pid=$(dockerinspect -format二'.State.Pid'docker2)再將 docker 容器的 net namespace 至U/var/run/netns/:mkdir /var/r un/netns #如果沒有該目錄,先創(chuàng)建In s /proc/$docker1Pid/ns/net /var/r un/netn s/docker1 nsIn s / proc/$docker1Pid/ns/ net /var/ru n/netn s/docker2 ns現(xiàn)在,就可

7、以查看一下這兩個(gè) net namespace中的連接情況:ip netns exec dockerl ns ip link list3. 創(chuàng)建網(wǎng)橋和虛擬網(wǎng)卡brctl addbr brOip link add vni c11 type veth peer n ame vni c12ip link add vni c21 type veth peer n ame vni c22ip link list # 查看所有 link將 vnic11 和 vnic21 attach 到網(wǎng)橋 br0 :brctl addif br0 vn ic11brctl addif br0 vni c214. 把vni

8、c12和vnic22分別放入docker1 ns和docker2ns,并重命名為 eth0ip link set vni c12 netns docker1 nsip link set vni c22 netns docker2 nsip netns exec docker1 ns ip link set vni c12 n ame eth0ip netns exec docker2 ns ip link set vni c22 n ame eth05. 為網(wǎng)口 br0, docker1 ns:eth0, docker2ns:eth0 配置 IPip netns exec docker1 ns

9、 ip link set eth0 upip netns exec docker2 ns ip link set eth0 upip netns exec docker2 ns ip route add default via 10.0.0.1 注意,必須先激活網(wǎng)口,才能配置網(wǎng)關(guān)。6. 啟動所有網(wǎng)口ip link set br0 upip link set vni c11 upip link set vni c21 up至此,docker1,dockr2和主機(jī)可以相互通信了。7. 開啟linux的轉(zhuǎn)發(fā)功能:sysctl - w n et.ipv4.ip_forward=1,或者echo 1 &

10、gt; /proc/sys/ net/ipv4/ip_forward這樣,當(dāng)從br0收到包后,若目的地址不是 host,則選擇合適的 網(wǎng)絡(luò)接口(如eth0 )發(fā)出去。從eth0收到包后,也會按一樣的規(guī) 則做轉(zhuǎn)發(fā)處理。8. 配置SNAT,將從docker來的包的源地址改為 iptables-t nat- A POSTROUTINGs 10.0.0.100- j SNATiptables-t nat- A POSTROUTINGs 10.0.0.200- j SNAT至此,dockerl和docker2就可以pi ng通host以外的世界了???以嘗試一下:docker attach docker

11、lpi ng 192.168.1.185 # 到你的LAN中的其它機(jī)器。要想暫時(shí)離開(detach)docker容器,連續(xù)按 Ctrl+p, Ctrl+q。下次還可以attach。注意,不要用exit命令,exit會關(guān)閉容器, 前面為容器所做的修改都會消失。9. 配置DNAT,將docker容器的某個(gè)端口對外開放,允許主機(jī)外的程 序訪問docker容器的服務(wù):iptables - t nat - A PREROUTING d 192.169.1.181- p tcp-dport 8080- j DNAT - -to 10.0.0.200:80至此,有人通過tcp協(xié)議訪問192.168.1.18

12、1:8080 時(shí),如用瀏覽 器訪問 192.168.1.181:8080 , linux 會將其映射到 docker2 的 80 端口,即 10.0.0.200:80 。二、將docker容器加入本地網(wǎng)絡(luò)(和主機(jī)在同一網(wǎng)段)host要將docker容器加入本地網(wǎng)絡(luò),即讓 docker容器和host處于同一 網(wǎng)段(),需要把虛擬交換機(jī)(bridge br1 )與外部 交換級聯(lián),形成一個(gè)廣播域。級聯(lián)的方法是:把host:eth0直接attach 到bridge br1。這樣一來,host:eth0 就不是host的有效網(wǎng)口了, 故需要刪除host:eth0的ip,而要把host的ip設(shè)到網(wǎng)口 br

13、1上。另外,host的網(wǎng)關(guān)也要用dev br1。按照上述網(wǎng)絡(luò)拓?fù)?,IP設(shè)置如 下:host:eth0:刪除其IP,將其直接連接到網(wǎng)橋br1。br1網(wǎng)口:設(shè)置為eth0原來的IP,即。主機(jī)的網(wǎng) 關(guān)還是,但訪問外部的網(wǎng)口要換為 br1。docker3:eth0 : ip 為 192.168.1.185, 網(wǎng)關(guān)為 。 docker4:eth0 : ip 為 ,網(wǎng)關(guān)為 。下面,我們用命令一步一步創(chuàng)建該網(wǎng)絡(luò)。1. 啟動兩個(gè)docker容器,不要讓docker自動配置網(wǎng)絡(luò)docker run itd -n ame二docker3 -net二none test/ub un tu:14/bin/bashdoc

14、ker run itd -n ame=docker4 -net二none test/ub un tu:14/bin/bash2. 找到容器的netns ,將其連接到/var/run/netns/下,以便為其配置網(wǎng)卡。先找到docker容器的PID:docker3Pid=$(dockerinspect -format二'.State.Pid'docker3)docker4Pid=$(dockerinspect -format= ' .State.Pid'docker4)再將 docker 容器的 net namespace 至U/var/run/netns/: m

15、kdir /var/ru n/netns #如果沒有該目錄,先創(chuàng)建。In s /proc/$docker3Pid/ns/net /var/ru n/net ns/docker3 nsIn s / proc/$docker4Pid/ns/ net /var/ru n/netn s/docker 4ns現(xiàn)在,就可以查看一下這兩個(gè) net namespace中的連接情況:ip netns exec docker4 ns ip link list3. 創(chuàng)建網(wǎng)橋和虛擬網(wǎng)卡brctl addbr br1ip link add vni c31 type veth peer n ame vni c32ip l

16、ink add vni c41 type veth peer n ame vni c42ip link list #查看所有 link將 vnic31 和 vnic41 attach 到網(wǎng)橋 br1 :brctl addif brl vnic31brctl addif brl vnic414. 把vnic32和vnic42分別放入docker3ns和docker4ns,并重命名 為 ethOip link set vni c32 netns docker3 nsip link set vni c42 netns docker4 nsip netns exec docker3 ns ip lin

17、k set vni c32 n ame eth0ip netns exec docker4 ns ip link set vni c42 n ame eth05. 為網(wǎng)口 docker3ns:eth0, docker4ns:eth0 配置 IP 和網(wǎng)關(guān)eth0ip netns exec docker3 ns ip link set eth0 upip netns exec docker3 ns ip route add default viaeth0ip netns exec docker4 ns ip link set eth0 up注意,必須先激活網(wǎng)口,才能配置網(wǎng)關(guān)。6. 啟動所有網(wǎng)口ip link set br1 upip link set vni c31 upip link set vni c41 up7. 配置主機(jī)的IP和網(wǎng)關(guān)需要刪除eth0的IP,配置br1的IP,并把網(wǎng)關(guān)配置到網(wǎng)口 br1。 如果是遠(yuǎn)程操作,必須用一條命令完成,因?yàn)楦鼡Q網(wǎng)口 IP時(shí)會斷 網(wǎng)。ip addr del 192.168.1.181/24 dev ethO; ip addr add 192.168.1.181/24 dev br1; ip route del default; ip route add default via 192.168.1.1 dev br1

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論