docker-网络-bridge

docker 里使用的最广泛的其实是bridge网络,Docker 安装时会创建一个 命名为 docker0 的 linux bridge。如果不指定–network,创建的容器默认都会挂到 docker0 上。

1
2
3
4
# yum install bridge-utils
# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.024224223ee8 no

当前 docker0 上没有任何其他网络设备,我们创建一个容器看看有什么变化。

1
2
3
4
# docker run -d httpd
# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.024224223ee8 no veth28c57d

一个新的网络接口 veth28c57d 被挂到了 docker0 上,veth28c57d就是新创建容器的虚拟网卡。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@docker ~]# docker exec -it 6a2ada6edfc6 bash
root@6a2ada6edfc6:/usr/local/apache2# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
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
16: eth0@if17: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::42:acff:fe11:2/64 scope link
valid_lft forever preferred_lft forever

容器有一个网卡 eth0@if17。大家可能会问了,为什么不是veth28c57d 呢?
实际上 eth0@if17 和 veth28c57d 是一对 veth pair。veth pair 是一种成对出现的特殊网络设备,可以把它们想象成由一根虚拟网线连接起来的一对网卡,网卡的一头(eth0@if17)在容器中,另一头(veth28c57d)挂在网桥 docker0 上,其效果就是将 if17 也挂在了 docker0 上。
我们还看到 eth0@if17 已经配置了 IP 172.17.0.2,为什么是这个网段呢?让我们通过 docker network inspect bridge 看一下 bridge 网络的配置信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# docker network inspect bridge
[
{
"Name": "bridge",
"Id": "064f3ba04375f9411145cecc6e64e2b2eb907af680d75ebf60928e2e7d38c538",
"Created": "2018-06-08T09:28:58.296820677+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Containers": {
"6a2ada6edfc6ca465af770f4fd12a65c663db441c370ec5928b25887d20c961b": {
"Name": "relaxed_lalande",
"EndpointID": "f645127fb3c6b2bd86adedefcfae3ce55861708da10df9d17c8b4c257686135c",
"MacAddress": "02:42:ac:11:00:02",
"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",
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "1500"
},
"Labels": {}
}
]

原来 bridge 网络配置的 subnet 就是 172.17.0.0/16,并且网关是 172.17.0.1。这个网关在哪儿呢?其实就对应着docker0

1
2
3
4
5
6
7
8
9
[root@docker ~]# ifconfig docker0
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 0.0.0.0
inet6 fe80::42:24ff:fe22:3ee8 prefixlen 64 scopeid 0x20<link>
ether 02:42:24:22:3e:e8 txqueuelen 0 (Ethernet)
RX packets 56 bytes 4371 (4.2 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 30 bytes 2723 (2.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

当前容器网络拓扑结构如图所示:
avatar

转自: bridge网络