docker 入門之虛擬網絡概述
一、什麼是虛擬化網絡1)命名空間2)設備和命名空間3)虛擬網絡設備4)虛擬網橋4.1)單個網橋4.2)兩個網橋--同IP段4.3)兩個網橋--不同IP段二、容器網絡-NAT模式三、容器網絡-橋接模式
一、什麼是虛擬化網絡
1)命名空間
在前面我們瞭解過,命名空間一共有六種:
1.UTS
:主機名和域名
2.User
:用戶和用戶組
3.Mount
:文件系統
4.IPC
:信號量、消息隊列和共享內存
5.PID
:進程編號
6.Network
:網絡設備、網絡棧、端口等
今天我們要了解的是Network
2)設備和命名空間
一個設備只能屬於一個命名空間,如果將一個網卡分配給單獨的命名空間,那麼這個網卡對於其他命名空間來說是不可見的。
3)虛擬網絡設備
Linux支持的二層設備和三層設備的虛擬化,其中網卡屬於二層設備。
虛擬網卡:在Linux中,虛擬網卡總是成對
出現
虛擬網橋設備:用一個軟件模擬一個交換機
4)虛擬網橋
在服務器安裝了docker之後,docker應用會創建一個名爲docker0
的網橋,地址爲172.17.0.1
[root@node1 ~]# ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:ceff:fe71:2880 prefixlen 64 scopeid 0x20<link>
ether 02:42:ce:71:28:80 txqueuelen 0 (Ethernet)
RX packets 15 bytes 1164 (1.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 31 bytes 3052 (2.9 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
4.1)單個網橋
單個網橋因爲在虛擬網絡中,網卡總是以對
的方式出現,所以但我們創建了一個容器之後,如果該容器使用了網橋,那麼這時候服務器上會多出一個虛擬的網卡,而這個網卡被綁定在網橋上,另個網卡在容器中。
爲了驗證以上理論,我們可以使用docker container ps 查看容器個數,然後再使用ifconfig 查看虛擬網卡個數。其中以vet開頭的網卡爲docker的虛擬網卡。
[root@node1 ~]# docker container ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d1745c9b3c8e web1:v2 "/bin/httpd -f -h /d…" 7 days ago Up 7 days http_1
2e45357a5285 busybox "sh" 7 days ago Up 7 days b1
[root@node1 ~]# ip add
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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:50:56:8b:ab:21 brd ff:ff:ff:ff:ff:ff
inet 192.168.100.75/24 brd 192.168.100.255 scope global dynamic ens160
valid_lft 52420sec preferred_lft 52420sec
inet6 fe80::3781:c50a:ba27:fb89/64 scope link
valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ce:71:28:80 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:ceff:fe71:2880/64 scope link
valid_lft forever preferred_lft forever
13: veth3487b78@if12: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP
link/ether 8e:8d:c8:b2:44:d0 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::8c8d:c8ff:feb2:44d0/64 scope link
valid_lft forever preferred_lft forever
17: vethc9f32ca@if16: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP
link/ether 2a:24:5c:84:e5:c3 brd ff:ff:ff:ff:ff:ff link-netnsid 1
inet6 fe80::2824:5cff:fe84:e5c3/64 scope link
valid_lft forever preferred_lft forever
[root@node1 ~]#
可以看出現在服務器上有兩個容器,相對應的,服務器多了兩塊虛擬的網卡,那麼怎麼去驗證這兩個虛擬網卡是否真的如我們所說的一樣,是屬於docker0網橋的呢?我們可以使用brctl
去查看
[root@node1 ~]# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.0242ce712880 no veth3487b78
vethc9f32ca
通過上下對比,我們應該能驗證之前的結論了吧!
單個網橋的通信:在上圖中,不難發現,假設S1和S2需要通信,可以直接通過網橋doker0進行通信。
4.2)兩個網橋--同IP段
兩個網橋--同ip段當兩個網橋連接的容器處於同一個IP段,那麼兩個網橋之間的通信也十分簡單,我們只需要兩個虛擬的網卡將兩個網橋進行連接即可。
4.3)兩個網橋--不同IP段
兩個網橋--不同IP段當兩個docker網橋所連接的容器處於不同的IP地址段時,S1和S3之間的通信就顯得沒那麼容易了…
S1和S3所屬的網段不同,意味着兩個容器必須要通過網關才能尋找到對方,即使他們在一臺服務器中!如果是簡單的通信,那麼我們可以開啓Linux Kernel
中的轉發
功能,實現兩個網段的通信。在上圖中,我們在兩個docker網橋中間多加了一個容器,該容器可以只用來處理轉發流量或者實現NAT等功能,這樣也可以實現同一服務器上不同的網橋之間通信。
二、容器網絡-NAT模式
在docker中,默認的網絡模式爲NAT模式,在安裝了docker之後,可以發現iptables
的NAT鏈多了幾條規則。
[root@node1 ~]# iptables -t nat -vnL
Chain PREROUTING (policy ACCEPT 404K packets, 36M bytes)
pkts bytes target prot opt in out source destination
80 5420 DOCKER all -- * * 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL
Chain INPUT (policy ACCEPT 82399 packets, 8968K bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 12551 packets, 755K bytes)
pkts bytes target prot opt in out source destination
0 0 DOCKER all -- * * 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL
Chain POSTROUTING (policy ACCEPT 12551 packets, 755K bytes)
pkts bytes target prot opt in out source destination
0 0 MASQUERADE all -- * !docker0 172.17.0.0/16 0.0.0.0/0
Chain DOCKER (2 references)
pkts bytes target prot opt in out source destination
0 0 RETURN all -- docker0 * 0.0.0.0/0 0.0.0.0/0
[root@node1 ~]#
我們可以查看docker的虛擬網絡列表:
[root@node1 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
1013a713a33f bridge bridge local
f40346977195 host host local
b911a3cde6ad none null local
[root@node1 ~]#
docker中NAT工作圖
安裝了docker之後,docker會在內核開啓路由
功能
[root@node1 ~]# cat /proc/sys/net/ipv4/ip_forward
1
[root@node1 ~]#
在NAT網絡中,docker0作爲一個三層設備,既充當了一個交換機又充當了S1和S2的網關,當S1訪問外網服務時,流量會送Kernel接收並處理,這中間kernel會查找路由表,確定如何轉發。
三、容器網絡-橋接模式
如果使用NAT模式,在某種情況下,會顯得效率低,因爲流量需經過NAT的轉換纔可以被髮送。
橋接模式:即將虛擬網卡直接橋接到物理網卡中(物理網卡此時被作爲交換機使用),在橋接模式下,物理網卡可以處理非本網卡的流量。
使用橋接模式後,物理網卡會虛擬出一個軟網卡,專門處理原本到達物理網卡的流量。
在上圖中,如果物理網卡收到一個MAC地址爲S1的報文,其會將該報文轉發給S1容器,收到MAC地址爲S2的報文即轉發給S2,如果收到一個MAC地址爲本地物理網卡的MAC報文,那麼將會交給軟網卡處理。此時的物理網卡就是一個交換機。
但是使用橋接模式也有一些弊端,比如廣播風暴,所以我們以後會介紹隧道協議overlay network