docker網(wǎng)絡(luò)深度研究

環(huán)境

centos7
yum install bridge-util tcpdump

linux network namespace

network namespace能創(chuàng)建多個隔離網(wǎng)絡(luò)空間,每個空間都有各自獨(dú)立的網(wǎng)卡和網(wǎng)絡(luò)信息。

## 查看網(wǎng)絡(luò)空間
ip netns add NAME
## 設(shè)置網(wǎng)絡(luò)空間名稱
ip netns set NAME NETNSID
## 刪除網(wǎng)絡(luò)空間
ip [-all] netns delete [NAME]
## 獲取當(dāng)前網(wǎng)絡(luò)空間 或者指定id的網(wǎng)絡(luò)空間名稱
ip netns identify [PID]

默認(rèn)的網(wǎng)絡(luò)空間namespace 是default,可以進(jìn)入其他網(wǎng)絡(luò)空間執(zhí)行程序

## 進(jìn)入testns執(zhí)行
ip netns exec testns bash
## 查看testns地址
ip addr
## 退出testns網(wǎng)絡(luò)空間
exit

veth pair

如果把網(wǎng)絡(luò)空間比喻成兩個路由器,veth pair就是連接兩個路由器的網(wǎng)線,可以讓隔離的網(wǎng)絡(luò)空間產(chǎn)生聯(lián)系。

veth pair
## 添加veth pair
ip link add veth1 type veth peer name veth2
## 這樣命令執(zhí)行后會產(chǎn)生兩個link設(shè)備 veth1 veth2,可以比喻成網(wǎng)線的兩頭
## 將veth1留在default命名空間里 將veth2放到testns命名空間里
## 移動veth2 并啟動
ip link set veth2 netns testns up
## 啟動veth1
ip link set veth1 up
## 設(shè)置veth1的ip
ip addr add 10.0.0.1/24 dev veth1
## 設(shè)置veth2的ip
ip netns exec testns ip addr add 10.0.0.2/24 dev veth2 

ping測試

ping 10.0.0.2
ip netns exec testns ping 10.0.0.1

bridge

網(wǎng)橋可以將多個網(wǎng)絡(luò)設(shè)備的網(wǎng)絡(luò)連通起來,實(shí)現(xiàn)ip轉(zhuǎn)發(fā)。即所有的ip包都發(fā)給橋接網(wǎng)卡,橋接網(wǎng)卡決定ip包流向哪個子網(wǎng)卡。類似交換機(jī)的功能。

網(wǎng)橋示意圖
## 添加一個橋接網(wǎng)卡
brctl addbr mybr0
## 添加一個網(wǎng)卡
brctl addif  veth1
## 刪除veth1的ip
ip addr del 10.0.0.1/24 dev veth1
## 設(shè)置mybr0的網(wǎng)絡(luò)地址
ip addr add 10.0.0.1/24 dev mybr0

這樣veth1,veth2就完全最為一個網(wǎng)線的作用了
testns連接外網(wǎng)

ip netns exec testns ip ro add default via 10.0.0.2

container network

linux docker的網(wǎng)絡(luò)利用的就是network namespace。

## 添加軟件連接
ln -s /var/run/docker/netns /var/run/netns
## 查看docker的網(wǎng)絡(luò)設(shè)備
docker network ls
## 查看netns
ip netns list

可以看見docker的每一個網(wǎng)卡就是network namespace,網(wǎng)卡的id和網(wǎng)絡(luò)空間是一致的。
docker容器對外網(wǎng)的訪問也是用的橋接網(wǎng)卡

## 會看見一個docker0的橋接網(wǎng)卡和一些veth的網(wǎng)卡
ip addr

docker利用的docker0橋接和veth pair讓docker容器上網(wǎng)和訪問docker宿主機(jī)

VXLAN

VXLAN(Virtual Extensible LAN),是一種網(wǎng)絡(luò)虛似化技術(shù),試圖改進(jìn)大型云計算的部署時的擴(kuò)展問題.可以說是對vlan的一種擴(kuò)展,由于vlan Header頭部限長是12bit, 導(dǎo)致vlan的限制個數(shù)是2^12=4096個,無法滿足日益增長的需求.目前 VXLAN 的報文 Header 內(nèi)有 24 bit,可以支持 2^24次方的 VNI 個數(shù)(VXLAN中通過 VNI 來識別,相當(dāng)于VLAN ID).
docker的overlay網(wǎng)絡(luò)利用的是vxlan,linux高版本內(nèi)置的疊加網(wǎng)絡(luò)類型。

## 查看docker的swarm網(wǎng)絡(luò)
docker network ls
##輸出
NETWORK ID          NAME                DRIVER              SCOPE
c96794a02093        bridge              bridge              local
5f0hj8eutx3o        ingress             overlay             swarm
izlz6tjselmy        mynet               overlay             swarm

## 這里有兩個swarm網(wǎng)絡(luò)

## 軟連接
ln -s /var/run/docker/netns /var/run/netns

## 查看netns
ip netns
## 輸出
b082687d2205 (id: 25)
1-izlz6tjsel (id: 9)
1-5f0hj8eutx (id: 0)

## 進(jìn)入mynet網(wǎng)絡(luò)命名空間 id 1-izlz6tjsel
ip netns exec 1-izlz6tjsel  bash
## 查看地址
ip addr
## 輸出
2: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP 
    link/ether 1a:8a:ce:06:fe:95 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.1/24 scope global br0
       valid_lft forever preferred_lft forever
559: vxlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master br0 state UNKNOWN 
    link/ether 5a:62:26:73:8a:55 brd ff:ff:ff:ff:ff:ff link-netnsid 0
587: veth4@if586: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master br0 state UP 
    link/ether b2:aa:51:60:a3:38 brd ff:ff:ff:ff:ff:ff link-netnsid 10
## 可以看見br0的橋接網(wǎng)卡和vxlan0的vxlan網(wǎng)卡和veth4的veth網(wǎng)卡
## 查看veth4的網(wǎng)卡對應(yīng)網(wǎng)卡
ethtool -S veth4
## 輸出
NIC statistics:
     peer_ifindex: 586
## 根據(jù)link-netnsid 10 可以看出網(wǎng)卡插到了命名空間id10了 
## 查看命名空間
ip netns  list-id
## 輸出
nsid 10 (iproute2 netns name: a728e382a976)
nsid 11 (iproute2 netns name: f5ccfdfe9b81)
## 查看a728e382a976的網(wǎng)絡(luò)信息
ip netns exec a728e382a976 ip a
## 輸出
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
586: eth0@if587: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP 
    link/ether 02:42:0a:00:00:37 brd ff:ff:ff:ff:ff:ff link-netnsid 2
    inet 10.0.0.55/24 scope global eth2
       valid_lft forever preferred_lft forever
    inet 10.0.0.36/32 scope global eth2
       valid_lft forever preferred_lft forever
588: eth1@if589: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:ac:13:00:0c brd ff:ff:ff:ff:ff:ff link-netnsid 1
    inet 172.19.0.12/16 scope global eth1
       valid_lft forever preferred_lft forever

## 可以看見586對應(yīng)的eth0對應(yīng)的就是這里veth4
## 查看eth1對應(yīng)的網(wǎng)卡 ,這里的link-netnsid 1已經(jīng)不是正確的了,因?yàn)檫@個是docker容器的網(wǎng)絡(luò)空間序號,當(dāng)前并不在docker容器內(nèi)。
## 執(zhí)行ethtool
ip netns exec a728e382a976 ethtool -S eth1
## 輸出
NIC statistics:
     peer_ifindex: 589
## 退出mynet空間
exit
## 查看默認(rèn)網(wǎng)絡(luò)空間的589
ip link |grep 589
## 輸出
589: veth0641ce3@if588: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker_gwbridge state UP mode DEFAULT 
## 查看網(wǎng)橋信息
brctl show
## 輸出
bridge name bridge id       STP enabled interfaces
docker_gwbridge     8000.02423beaac26   no      veth0641ce3
                            veth1fa0be1
                            veth23e5fec
                            veth3196c2e
                            veth3d96fa6
                            veth4377740
                            veth9378d7a
                            vetha114976
                            vetha964f01
                            vethbd20bb9

## 可以看見 這個veth是屬于docker_gwbridge的

通過上述觀察可以畫出下圖

網(wǎng)絡(luò)示意圖
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載自 http://blog.opskumu.com/docker.html 一、Docker 簡介 Docke...
    極客圈閱讀 10,755評論 0 120
  • 概述 自從docker容器出現(xiàn)以來,容器的網(wǎng)絡(luò)通信就一直是大家關(guān)注的焦點(diǎn),也是生產(chǎn)環(huán)境的迫切需求。而容器的網(wǎng)絡(luò)通信...
    糙老爺們兒吃什么櫻桃閱讀 3,722評論 1 5
  • 五、Docker 端口映射 無論如何,這些 ip 是基于本地系統(tǒng)的并且容器的端口非本地主機(jī)是訪問不到的。此外,除了...
    R_X閱讀 1,961評論 0 7
  • 這本書里讓我印象深刻的有以下幾點(diǎn): 1.買房要慎重,因?yàn)槊媾R的經(jīng)濟(jì)壓力會讓你沒有足夠錢花在提升自己的生活品質(zhì),...
    三葉草amy閱讀 384評論 0 0
  • 1.為什麼要學(xué)習(xí)寫作: 因?yàn)槲乙?jīng)營Facebook粉絲團(tuán),衝人氣,寫很多好內(nèi)容分享給大家,分享我一路走來努力的過...
    李東東閱讀 242評論 1 2

友情鏈接更多精彩內(nèi)容