Comunicación Docker-Bridge Network 01 entre contenedores

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
    ejecuta route -ny 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
    ejecuta brctl showy 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
    ejecuta ip netnsy 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,就是简单的二层转发,过程如下:

  1. 在bbox1内部ping 172.17.0.4,根据bbox1的路由表的默认路由,报文从eth0发出,docker0上的vethe9a0e73收到;
  2. docker0就是虚拟交换机,遵从二层转发,根据目的mac查到对应的端口,将其送出;
  3. bbox2收到报文。

4.小节

  • 安装Docker时,Docker会自动创建一个名为docker0的bridge
  • 每个容器都有自己的net namespace
  • 创建容器,如果不指定网络,则默认使用bridge模式并且连接到docker0
  • 容器与docker0通过veth pair连接

下一节,我们介绍容器与外部的通信。点此处回到docker系列文章目录

--------------------------------------------------------------------------------------------------------------------

本人微信公众号同步更新云计算、容器、网络、编程等文章,欢迎参观!

 

 

 

Supongo que te gusta

Origin www.cnblogs.com/sunqingliang/p/12728745.html
Recomendado
Clasificación