docker入門之虛擬網絡概述

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段

當兩個網橋連接的容器處於同一個IP段,那麼兩個網橋之間的通信也十分簡單,我們只需要兩個虛擬的網卡將兩個網橋進行連接即可。

4.3)兩個網橋--不同IP段

兩個網橋--不同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工作圖

NATNAT

安裝了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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章