1. 程式人生 > 實用技巧 >容器(五)學容器必須懂 bridge 網路【27】

容器(五)學容器必須懂 bridge 網路【27】

(二)學容器必須懂 bridge網路

​ 本節學習應用最廣泛也是預設的 bridge 網路。

​ Docker 安裝時會建立一個 命名為 docker0 的 linux bridge。如果不指定--network,建立的容器預設都會掛到 docker0 上。

root@cuiyongchao:~# brctl show
bridge name	bridge id		STP enabled	interfaces
docker0		8000.0242b316d415	no		veth5693146
							vethea16017
							vethf263a23
root@cuiyongchao:~# 

​ 新建立一個容器,在docker0上新增的一個interface。一個新的網路介面veth6825577被掛到了docker0上,veth6825577就是新建立容器的虛擬網絡卡。

root@cuiyongchao:~# docker run -d  httpd
f02ffc0410f143cfc3065dc0210b28f4e745106eb097b4a4e2f2fde3993fce2d
root@cuiyongchao:~# brctl show
bridge name	bridge id		STP enabled	interfaces
docker0		8000.0242b316d415	no		veth5693146
							veth6825577
							vethea16017
							vethf263a23
root@cuiyongchao:~# 

​ 下面看一下容器的網路配置。

root@cuiyongchao:~# docker run --name sili -it busybox
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:04  
          inet addr:172.17.0.4  Bcast:172.17.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:6 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:516 (516.0 B)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

/ # 

​ 容器有一個網絡卡 eth0。大家可能會問了,為什麼不是brctl show查出來的vethab0efda 呢?

​ 實際上 eth0 和vethab0efda 是一對 veth pair。veth pair 是一種成對出現的特殊網路裝置,可以把它們想象成由一根虛擬網線連線起來的一對網絡卡,網絡卡的一頭(eth0)在容器中,另一頭(vethab0efda )掛在網橋 docker0上,其效果就是將eth0也掛在了 docker0 上。

​ 我們還看到eth0已經配置了 IP172.17.0.2,為什麼是這個網段呢?讓我們通過docker network inspect bridge`看一下 bridge 網路的配置資訊:

root@cuiyongchao:~# docker network inspect bridge 
[
    {
        "Name": "bridge",
        "Id": "aa9cc7a43b3f51e1d6f06ffbbb7f53843ad2379a5317a09388edcf7a35852853",
        "Created": "2020-10-29T12:14:27.3344923Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]

​ 原來 bridge 網路配置的 subnet 就是 172.17.0.0/16,並且閘道器是 172.17.0.1。這個閘道器在哪兒呢?大概你已經猜出來了,就是 docker0。

​ 容器建立時,docker 會自動從 172.17.0.0/16 中分配一個 IP,這裡 16 位的掩碼保證有足夠多的 IP 可以供容器使用。

​ 除了 none, host, bridge 這三個自動建立的網路,使用者也可以根據業務需要建立 user-defined 網路,下一節我們將詳細討論。