(二)学容器必须懂 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已经配置了 IP
172.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 网络,下一节我们将详细讨论。