En este post abordaremos como es el funcionamiento de la red en Docker. Al instalar Docker en nuestro servidor por defecto nos creara 3 redes y una interfaz virtual.

$ docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
18639ead4406   bridge    bridge    local
e6329a914618   host      host      local
f8ad3cc4af8a   none      null      local

$ ip a

3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:a3:43:f5:98 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
    inet6 fe80::42:a3ff:fe43:f598/64 scope link
       valid_lft forever preferred_lft forever

La interfaz virtual tiene el nombre de docker0 y utiliza por defecto la red 172.17.0.1/16 en la que puede asignar 65,534 direcciones IP dentro de ella, esta red es utilizada para el bridge de Docker.

Tipos de red

Como vemos en las redes que nos crea por defecto Docker en la columna Driver hay diferentes tipos, vamos a profundizar en cada una de ellas.

1. Bridge

  • Funcionamiento: Es el driver predeterminado cuando creas una red Docker. Crea una interfaz virtual en el propio host (docker0) al que le asigna una red privada interna, otra interfaz virtual en los contenedores conectados a esta red para que puedan comunicarse entre sí y con el host. Cada contenedor conectado a una red bridge obtiene una dirección IP interna de la red anteriormente mencionada 172.17.0.1/16.
  • Uso: Ideal para la comunicación entre contenedores en el mismo host.

2. Host

  • Funcionamiento: Al utilizar este driver, los contenedores comparten el espacio de red del host. Esto significa que los contenedores ven la interfaz de red del host como si fuera suya, sin aislamiento de red entre ellos y el host. Es decir comparten la IP del host y la gestión de los puertos es sumamente importante ya que todos los contenedores comparten la misma IP, la del propio host.
  • Uso: Útil cuando se necesita un rendimiento de red máximo o cuando los contenedores deben gestionar el tráfico de red del host directamente.

3. Overlay

  • Funcionamiento: Permite que los contenedores en distintos hosts se comuniquen como si estuvieran en el mismo host, creando una red distribuida entre múltiples nodos de Docker. Este driver requiere una configuración adicional de servicios de descubrimiento y orquestación, como Docker Swarm.
  • Uso: Esencial para aplicaciones en clústeres Docker distribuidos, permitiendo la comunicación entre contenedores en diferentes hosts.

4. Macvlan

  • Funcionamiento: Permite asignar una dirección MAC a un contenedor, haciéndolo aparecer como un dispositivo físico en la red. El contenedor puede comunicarse directamente con otros dispositivos en la red sin pasar por el stack de red del Docker host. Esto quiere decir que se le asignara una IP en el rango de red que se le indique.
  • Uso: Útil en casos donde los contenedores necesitan aparecer como dispositivos físicos en la red o cuando se requiere una integración sin problemas con redes existentes que no gestionan bien el enrutamiento del tráfico a través de un bridge.

5. None

  • Funcionamiento: Este driver desactiva toda la red para el contenedor seleccionado. No se asigna ninguna interfaz de red al contenedor, aislando completamente su stack de red.
  • Uso: Ideal para contenedores que no necesitan comunicarse con el exterior ni con otros contenedores, pero que todavía necesitan ejecutarse por otras razones.

Ejemplos de trabajo con las redes de Docker

Creación de macvlan

Para la creación de una macvlan debemos especificarle la subred que deseamos en que se asignen los contendores, el gateway y por ultimo la interfaz de red por la que se conectara al exterior.

$ docker network create -d macvlan  --subnet=192.168.1.0/24  --gateway=192.168.1.1  -o parent=eth0 mi_red_macvlan

Creación de bridge

Si queremos crear otro bridge distinto al que crea Docker por defecto podemos tan solo dar una nuevo nombre o la red o personalizar la nueva red que vamos a usar.

$ docker network create -d bridge mi_bridge_personalizado
$ ip a 
br-732705db4fc9: mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:c8:e3:f7:11 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.1/16 brd 172.18.255.255 scope global br-732705db4fc9
valid_lft forever preferred_lft forever

Veremos que si no le especificamos red la crea justo en la red siguiente a 172.17.0.1/16

$ docker network create -d bridge --subnet=192.168.2.0/24 --gateway=192.168.2.1 mi_bridge_personalizado
$ br-57dfea567788: mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:d4:c4:4f:8c brd ff:ff:ff:ff:ff:ff
inet 192.168.2.1/24 brd 192.168.2.255 scope global br-57dfea567788
valid_lft forever preferred_lft forever

Configurar un contendor para que use un tipo de red

Vamos a pon de ejemplo arrancar un contenedor en la red de host, nos olvidamos de mapear puertos ya que el contenedor accede a los puertos del host como si fueran suyos y aumneta el rendimiento sin capas de red extra.

$ docker run -d --name mi_contenedor --network=host

Configurar red Overlay

Este paso se explica en la sección que hablamos de Docker Swarm.