本小节介绍bridge network模式下,单机上的容器网络拓扑及通讯。html
对于单机上的容器,Docker提供了bridge、host、none三种网络。咱们首先介绍经典的bridge模式。
Linux bridge是Linux内核中普遍使用的网络虚拟化工具,在OpenStack、Docker、Kubernetes中,经常能看到它的身影。
Docker默认使用Bridge Network。Docker安装时会建立一个名为docker0的bridge,建立容器时若是不指定网络,则默认将容器链接在docker0上,实现容器的网络通讯。linux
上一节在虚拟机上安装了docker,咱们查看虚拟机上网卡、路由表、网桥等设备的变化。web
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP
link/ether 08:00:27:70:b6:ef brd ff:ff:ff:ff:ff:ff
inet 192.168.0.11/24 brd 192.168.0.255 scope global noprefixroute enp0s3
valid_lft forever preferred_lft forever
inet6 fe80::da96:cef:9147:bcc1/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
link/ether 02:42:a8:64:6c:32 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
route -n
,docker建立了一条路由:发往172.17.0.0/16的报文,会走到docker0[root@docker1 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.1 0.0.0.0 UG 100 0 0 enp0s3
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.0.0 0.0.0.0 255.255.255.0 U 100 0 0 enp0s3
brctl show
,发现docker0上尚未interface[root@docker1 ~]# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.0242a8646c32 no
ip netns
,返回空,此时尚未net namespace。busybox镜像包含了各类linux工具,咱们用该镜像建立容器来作实验。
执行docker run -it -d --name=bbox1 busybox
docker
5: vethe9a0e73@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP
link/ether 1e:ec:13:2e:96:e4 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::1cec:13ff:fe2e:96e4/64 scope link
valid_lft forever preferred_lft forever
[root@docker1 ~]# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.0242a8646c32 no vethe9a0e73
ip netns
依然返回空。/var/run/netns
目录下,因此用ip netns
命令查不到。ip netns
查看,能够用ln –s建立软链接,自行搜索吧。执行docker exec -it bbox1 sh
进入容器shell
[root@docker1 ~]# docker exec -it bbox1 sh
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 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
4: eth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
/ #
/ # route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.17.0.1 0.0.0.0 UG 0 0 0 eth0
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
能够发现,容器的网卡eth0跟bridge上的vethe9a0e73是一对veth pair设备,而且容器内部的默认路由指向docker0的IP 172.17.0.1。编程
结合上面的分析,画出当前网络拓扑以下:微信
执行docker run -it -d --name=bbox2 busybox
,建立一个新容器。
网络拓扑以下:网络
bbox1 ping bbox2,就是简单的二层转发,过程以下:app
下一节,咱们介绍容器与外部的通讯。点击此处回到docker系列文章目录。工具
原创文章,若是转载,请声明出处!
-----------------------------------------------------------------------------------------------
本人微信公众号同步更新云计算、容器、网络、编程等文章,欢迎参观!