Docker網(wǎng)絡(luò)互聯(lián)原理及自定義網(wǎng)絡(luò)的使用

一、默認(rèn)網(wǎng)絡(luò)

Docker默認(rèn)在安裝好的時(shí)候就會(huì)自動(dòng)創(chuàng)建三個(gè)網(wǎng)絡(luò),我們可以使用docker network ls看到如下的三個(gè)網(wǎng)絡(luò)信息。

PS C:\Users\Think> docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
7b4d6fb49586   bridge    bridge    local
b1c115e96419   host      host      local
a8fa01727801   none      null      local
  • none,指沒(méi)有網(wǎng)絡(luò),如果容器啟動(dòng)的時(shí)候指定使用這個(gè)網(wǎng)絡(luò)docker run -it --network=none imagename,那么就代表這是一個(gè)隔離的容器,不與外界進(jìn)行交互。

  • host,指公用宿主機(jī)host的網(wǎng)絡(luò)資源,容器的網(wǎng)絡(luò)配置將和宿主機(jī)host一模一樣,優(yōu)點(diǎn)就是傳輸效率高,缺點(diǎn)就是容易和host造成端口沖突。

  • bridge,這是比較常用的網(wǎng)絡(luò),該網(wǎng)絡(luò)中默認(rèn)情況下host上會(huì)有一個(gè)docker0的虛擬網(wǎng)卡,如果在啟動(dòng)容器的時(shí)候不指定網(wǎng)絡(luò),那么默認(rèn)就會(huì)新建一個(gè)虛擬網(wǎng)卡橋接在docker0上,容器中自己也會(huì)新建一個(gè)虛擬網(wǎng)卡,這兩個(gè)虛擬網(wǎng)卡具有綁定關(guān)系,從而達(dá)到容器和宿主機(jī)的通信,以及和其它容器的通信,這種虛擬網(wǎng)卡的橋接技術(shù)被稱(chēng)為evth-pair技術(shù)。

    我們可以通過(guò)命令docker network inspect bridge查看這個(gè)網(wǎng)絡(luò)的一些配置信息。

    [
        {
            "Name": "bridge",
            "Id": "7b4d6fb49586097cc1501f5a0c9515678503a633578b55b1664fd91080682b92",
            "Created": "2021-11-19T12:02:14.406518392Z",
            "Scope": "local",
            # 橋接模式
            "Driver": "bridge",
            "EnableIPv6": false,
            "IPAM": {
                "Driver": "default",
                "Options": null,
                "Config": [
                    {
                      # 子網(wǎng)范圍172.17.0.0~172.17.255.255
                        "Subnet": "172.17.0.0/16",
                        # 網(wǎng)關(guān)地址,即docker0網(wǎng)卡的地址,它作為路由器轉(zhuǎn)發(fā)容器之間的通信
                        "Gateway": "172.17.0.1"
                    }
                ]
            },
            "Internal": false,
            "Attachable": false,
            "Ingress": false,
            "ConfigFrom": {
                "Network": ""
            },
            "ConfigOnly": false,
            # 已經(jīng)注冊(cè)橋接的容器列表
            "Containers": {
              # 容器ID
                "e0fd741857a1bdc27b01de96c7009869b811a409b5a69ecac309c91a061d8b2c": {
                    "Name": "tomcat1",
                    "EndpointID": "0cff81bc0f30577547b0375a2ffb276d009d307fd00027c33ada88134dec9f69",
                    "MacAddress": "02:42:ac:11:00:02",
                    # 分配該容器的內(nèi)部地址
                    "IPv4Address": "172.17.0.2/16",
                    "IPv6Address": ""
                }
            },
            "Options": {
                "com.docker.network.bridge.default_bridge": "true",
                "com.docker.network.bridge.enable_icc": "true",
                "com.docker.network.bridge.enable_ip_masquerade": "true",
                # 主機(jī)的地址
                "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
                # 主機(jī)的網(wǎng)卡
                "com.docker.network.bridge.name": "docker0",
                "com.docker.network.driver.mtu": "1500"
            },
            "Labels": {}
        }
    ]
    

    總的來(lái)說(shuō),正是默認(rèn)情況下我們使用了bridge橋接網(wǎng)絡(luò),使得host與容器之間的通信,以及容器與容器之間的通信都可以通過(guò)docker0作為路由器來(lái)進(jìn)行轉(zhuǎn)發(fā)。

Docker橋接網(wǎng)絡(luò)示意圖

在日常的生產(chǎn)環(huán)境中,docker0已經(jīng)很少被使用了,因?yàn)樗恢С质褂萌萜鞣?wù)名稱(chēng)進(jìn)行通信,推薦使用自定義網(wǎng)絡(luò)。

二、使用服務(wù)名

在上面網(wǎng)絡(luò)的講解中,我們知道了容器之間互相連通的原理,那么在host部署多個(gè)容器需要相互通信的時(shí)候,可以使用IP通信,但是問(wèn)題是,容器的IP地址并不是固定的,每次重啟后都有可能發(fā)生變更,使得維護(hù)成本變高,那么是否可以棄用IP,直接使用服務(wù)名進(jìn)行通信呢?就像注冊(cè)中心那樣?

默認(rèn)情況下,直接請(qǐng)求服務(wù)名肯定是不能通的,但是我們可以使用--link選項(xiàng)來(lái)為當(dāng)前容器打通需要聯(lián)系的其它容器。

PS C:\Users\Think> docker run -d -P --name tomcat01 tomcat
b610b3352558cd2db5a3155bcbff072fdf6b15e1a89be3c6266f931686f3125c
PS C:\Users\Think> docker run -d -P --link tomcat01 --name tomcat02 tomcat
ccb34a4cd1904f1075af874795b9c392e19ccdfca99c3d45ef0155967c785a04

此時(shí)tomcat02可以使用tomcat01的服務(wù)名進(jìn)行通信,但是反過(guò)來(lái)tomcat01不可以使用tomcat02的服務(wù)名進(jìn)行通信,除非tomcat01在啟動(dòng)的時(shí)候也使用--link進(jìn)行設(shè)置。

我們查看tomcat02的hosts文件:

PS C:\Users\Think> docker exec -it tomcat02 cat /etc/hosts
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
# 查看tomcat02的hosts文件,發(fā)現(xiàn)把tomcat01的ip地址和服務(wù)名稱(chēng)綁定了,從而達(dá)到訪(fǎng)問(wèn)服務(wù)名可以找到tomcat01的IP的目的
172.17.0.2      tomcat01 b610b3352558
172.17.0.3      ccb34a4cd190

我們?cè)俨榭磘omcat01的hosts文件,并沒(méi)有發(fā)現(xiàn)tomcat02的綁定信息:

PS C:\Users\Think> docker exec -it tomcat01 cat /etc/hosts
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2      b610b3352558

在日常的生產(chǎn)環(huán)境中,--link也已經(jīng)不被推薦使用了,不夠靈活強(qiáng)大,推薦使用自定義網(wǎng)絡(luò)。

三、自定義網(wǎng)絡(luò)

我們可以通過(guò)命令docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet創(chuàng)建自定義網(wǎng)絡(luò)mynet。

  • --driver bridge指定使用網(wǎng)絡(luò)的類(lèi)型,可以選擇none,host,bridge任何一種;
  • --subnet 192.168.0.0/16指定子網(wǎng)的范圍;
  • --gateway 192.168.0.1指定網(wǎng)關(guān)的地址;

然后我們查看網(wǎng)絡(luò)docker network ls就可以看到剛剛創(chuàng)建的自定義網(wǎng)絡(luò)了。

PS C:\Users\Think> docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
7b4d6fb49586   bridge    bridge    local
b1c115e96419   host      host      local
# 如下就是剛才新創(chuàng)建的自定義網(wǎng)絡(luò)
ab48e4649b9a   mynet     bridge    local
a8fa01727801   none      null      local

通過(guò)docker network inspect mynet查看自定義網(wǎng)絡(luò)的詳細(xì)信息:

[
    {
        "Name": "mynet",
        "Id": "ab48e4649b9a12ef3cd6b8c8d89940600248024a2cb8d4e9dfec2d6890403b01",
        "Created": "2021-11-19T14:52:33.152719594Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.0.0/16",
                    "Gateway": "192.168.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

此時(shí)還沒(méi)有容器使用該網(wǎng)絡(luò),所以Containers里面是空的,我們可以將新啟動(dòng)的容器指定在該自定義網(wǎng)絡(luò)內(nèi):

PS C:\Users\Think> docker run -d -P --net mynet --name tomcat03 tomcat
0fc443c83626813a76d0819db9ce90fb86150d42430e53bed482e01306bd7b29
PS C:\Users\Think> docker run -d -P --net mynet --name tomcat04 tomcat
d244676f904c29082b66a8d88d4633991bc4c7a2a2d3324cc753b32c7d436ca8
PS C:\Users\Think> docker network inspect mynet
[
    {
        "Name": "mynet",
        "Id": "ab48e4649b9a12ef3cd6b8c8d89940600248024a2cb8d4e9dfec2d6890403b01",
        "Created": "2021-11-19T14:52:33.152719594Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.0.0/16",
                    "Gateway": "192.168.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "0fc443c83626813a76d0819db9ce90fb86150d42430e53bed482e01306bd7b29": {
                "Name": "tomcat03",
                "EndpointID": "4c1fabf4694c727255d5f722e97315605c2feb361881a2101cac8f517ae1b134",
                "MacAddress": "02:42:c0:a8:00:02",
                "IPv4Address": "192.168.0.2/16",
                "IPv6Address": ""
            },
            "d244676f904c29082b66a8d88d4633991bc4c7a2a2d3324cc753b32c7d436ca8": {
                "Name": "tomcat04",
                "EndpointID": "c542546ae74ca4d35ed86cb39551dd570f791b6cf407de6ddfdadf0759ee4aa0",
                "MacAddress": "02:42:c0:a8:00:03",
                "IPv4Address": "192.168.0.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

這里mynet網(wǎng)絡(luò)里面的容器相互之間是可以聯(lián)通的,而且可以使用容器服務(wù)名進(jìn)行聯(lián)通,實(shí)現(xiàn)了--link的作用,但是和其它網(wǎng)絡(luò)的容器是不能聯(lián)通的,網(wǎng)段不同默認(rèn)都是不通的 。

如果存在場(chǎng)景需要聯(lián)通兩個(gè)不同網(wǎng)段中的容器,那么可以使用docker network connect networkName containerName,將某個(gè)容器加入到指定的網(wǎng)絡(luò)中。

PS C:\Users\Think> docker network connect mynet tomcat01
PS C:\Users\Think> docker network inspect mynet
[
    {
        "Name": "mynet",
        "Id": "ab48e4649b9a12ef3cd6b8c8d89940600248024a2cb8d4e9dfec2d6890403b01",
        "Created": "2021-11-19T14:52:33.152719594Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.0.0/16",
                    "Gateway": "192.168.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "0fc443c83626813a76d0819db9ce90fb86150d42430e53bed482e01306bd7b29": {
                "Name": "tomcat03",
                "EndpointID": "4c1fabf4694c727255d5f722e97315605c2feb361881a2101cac8f517ae1b134",
                "MacAddress": "02:42:c0:a8:00:02",
                "IPv4Address": "192.168.0.2/16",
                "IPv6Address": ""
            },
            "b610b3352558cd2db5a3155bcbff072fdf6b15e1a89be3c6266f931686f3125c": {
                "Name": "tomcat01",
                "EndpointID": "879bcfac611e21911284a926d133af7c2bbb483882e4c5bf606a5039aa894a66",
                "MacAddress": "02:42:c0:a8:00:04",
                "IPv4Address": "192.168.0.4/16",
                "IPv6Address": ""
            },
            "d244676f904c29082b66a8d88d4633991bc4c7a2a2d3324cc753b32c7d436ca8": {
                "Name": "tomcat04",
                "EndpointID": "c542546ae74ca4d35ed86cb39551dd570f791b6cf407de6ddfdadf0759ee4aa0",
                "MacAddress": "02:42:c0:a8:00:03",
                "IPv4Address": "192.168.0.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

我們會(huì)發(fā)現(xiàn)原來(lái)在別的網(wǎng)段下的tomcat01容器也被加入到mynet自定義網(wǎng)絡(luò)中來(lái)了。此時(shí)tomcat01容器就會(huì)同時(shí)擁有兩個(gè)IP地址。

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

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

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