1. 程式人生 > >Docker系列五:Docke Bridge網路原理,容器間網路通訊,對外通訊詳解

Docker系列五:Docke Bridge網路原理,容器間網路通訊,對外通訊詳解

docker中兩個容器之間的網路是如何連線到一起的?
檢視本機的docker網路

docker network ls
[[email protected] vagrant]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
bc09f52c660b        bridge              bridge              local
022dc4f6024c        host                host                local
ece3e2f6126f        none                null                local

檢視 bc09f52c660b  bridge的網路詳情
docker network inspect bc09f52c660b

我們會發現:
"Containers": {
            "c49f056b4a2d4d01e7ad0c5f4661ffc0a4982ad23f2c1563c25bfcc6b38602d8": {
                "Name": "test1",
                "EndpointID": "aa94a60ba56e2967d547f530580ed72ed560dae663db015fd4b02e448ff5d397",
                "MacAddress": "02:42:ac:11:00:03",
                "IPv4Address": "172.17.0.3/16",
                "IPv6Address": ""
            }
說明:"IPv4Address": "172.17.0.3/16" 連結到了bridge 上面了

檢視本機的網路ip a
[[email protected] vagrant]# ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    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: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:6c:3e:95 brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic enp0s3
       valid_lft 77956sec preferred_lft 77956sec
    inet6 fe80::a00:27ff:fe6c:3e95/64 scope link 
       valid_lft forever preferred_lft forever
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:9c:91:a8 brd ff:ff:ff:ff:ff:ff
    inet 192.168.205.20/24 brd 192.168.205.255 scope global enp0s8
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe9c:91a8/64 scope link 
       valid_lft forever preferred_lft forever
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:81:43:bc:79 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:81ff:fe43:bc79/64 scope link 
       valid_lft forever preferred_lft forever
10: 
[email protected]
: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP link/ether 3a:20:a7:29:46:d8 brd ff:ff:ff:ff:ff:ff link-netnsid 1 inet6 fe80::3820:a7ff:fe29:46d8/64 scope link valid_lft forever preferred_lft forever

vath是連結到docker0上面的,下面開始驗證:
使用brctl工具
yum install bridge-utils
brctl show

bridge name	bridge id		STP enabled	interfaces
docker0		8000.02428143bc79	no		veth0b277e8

veth0b277e8這是docker0的介面,看看上面的ip a 的第十條資料
10: veth0b277e8 是不是docker0的介面呢?

現在,我們在創立一個容器:
docker run -d --name test2 busybox /bin/sh -c "while true; do sleep 3000;done"
docker network inspect bridge

"Containers": {
            "c3ea5d284e9ac34843dda43b9d24b0570dec9dceb8e65fc18c4fc2473200ca8f": {
                "Name": "test2",
                "EndpointID": "13c202260334af4fd6e765e8f5156308646252a6fcaecbfb4ac3252b7ad111b4",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            },
            "c49f056b4a2d4d01e7ad0c5f4661ffc0a4982ad23f2c1563c25bfcc6b38602d8": {
                "Name": "test1",
                "EndpointID": "aa94a60ba56e2967d547f530580ed72ed560dae663db015fd4b02e448ff5d397",
                "MacAddress": "02:42:ac:11:00:03",
                "IPv4Address": "172.17.0.3/16",
                "IPv6Address": ""
            }
        },

發現containers又多了一個連結

ip a檢視

10: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP 
    link/ether 3a:20:a7:29:46:d8 brd ff:ff:ff:ff:ff:ff link-netnsid 1
    inet6 fe80::3820:a7ff:fe29:46d8/64 scope link 
       valid_lft forever preferred_lft forever
14: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP 
    link/ether d6:fe:1a:49:5d:7b brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::d4fe:1aff:fe49:5d7b/64 scope link 
       valid_lft forever preferred_lft forever
veth這個線連結上了

[[email protected] vagrant]# brctl show
bridge name	bridge id		STP enabled	interfaces
docker0		8000.02428143bc79	no		veth0b277e8
							            veth91f5757
我們發現docker0有兩個介面了

容器是如何訪問外網的?
內部的容器連結上docker0,docker通過NAT和外部相連結