Esta sección presenta la topología de red de contenedores y la comunicación en una sola máquina en modo de red de puente.
1. Introducción
Para contenedores en una sola máquina, Docker proporciona tres redes: puente, host y ninguna. Primero presentamos el modelo clásico de puente.
El puente de Linux es una herramienta de virtualización de red ampliamente utilizada en el kernel de Linux. A menudo se ve en OpenStack, Docker y Kubernetes.
Docker usa Bridge Network de manera predeterminada. Cuando se instala Docker, se creará un puente llamado docker0. Si la red no se especifica cuando se crea el contenedor, el contenedor se conectará a docker0 de forma predeterminada para lograr la comunicación de red del contenedor.
2. Instale docker y vea los cambios de red
En la sección anterior , se instaló Docker en la máquina virtual. Verificamos los cambios de la tarjeta de red, la tabla de enrutamiento, el puente de red y otros dispositivos de la máquina virtual.
- La tarjeta de red
agrega docker0, su dirección es 172.17.0.1/16
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
- La tabla de enrutamiento se
ejecutaroute -n
y Docker crea una ruta: el paquete enviado a 172.17.0.0/16 irá a 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
- El puente se
ejecutabrctl show
y se descubre que no hay interfaz en docker0
[root@docker1 ~]# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.0242a8646c32 no
- El espacio de nombres de la red se
ejecutaip netns
y vuelve vacío. En este momento, no hay espacio de nombres neto.
3. Crear un contenedor
3.1 Crear contenedor busybox
La imagen de busybox contiene varias herramientas de Linux. Utilizamos esta imagen para crear contenedores para experimentos.
Ejecutardocker run -it -d --name=bbox1 busybox
3.2 Ver cambios en la red del host
- La tarjeta de red
tiene una tarjeta de red veth adicional. Por el nombre, se puede ver que este es un dispositivo de par veth y está en docker0.
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
- 网桥
网桥多了一个接口,该接口就是上面的veth的网卡设备
[root@docker1 ~]# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.0242a8646c32 no vethe9a0e73
- 网络命名空间
执行ip netns
依然返回空。
其实docker会为每个容器创建net namespace,只是没挂载在/var/run/netns
目录下,所以用ip netns
命令查不到。
小tip:如果想用ip netns
查看,可以用ln –s创建软连接,自行搜索吧。
3.3 查看容器内部网络
执行docker exec -it bbox1 sh
进入容器
- 网卡及路由表
[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。
3.4 容器网络拓扑
结合上面的分析,画出当前网络拓扑如下:
3.5 两个容器
执行docker run -it -d --name=bbox2 busybox
,创建一个新容器。
网络拓扑如下:
bbox1 ping bbox2,就是简单的二层转发,过程如下:
- 在bbox1内部ping 172.17.0.4,根据bbox1的路由表的默认路由,报文从eth0发出,docker0上的vethe9a0e73收到;
- docker0就是虚拟交换机,遵从二层转发,根据目的mac查到对应的端口,将其送出;
- bbox2收到报文。
4.小节
- 安装Docker时,Docker会自动创建一个名为docker0的bridge
- 每个容器都有自己的net namespace
- 创建容器,如果不指定网络,则默认使用bridge模式并且连接到docker0
- 容器与docker0通过veth pair连接
下一节,我们介绍容器与外部的通信。点此处回到docker系列文章目录。
--------------------------------------------------------------------------------------------------------------------
本人微信公众号同步更新云计算、容器、网络、编程等文章,欢迎参观!