Últimamente se habla mucho sobre contenedores, subrayando los beneficios de su uso para el desarrollo y despliegue de aplicaciones, y en ocasiones se hacen comparaciones erróneas con las Máquinas Virtuales. Este articulo pretende cubrir las opciones de red locales que ofrece Docker al crear contenedores.
Cuando el servicio de Docker inicia este crea localmente tres redes que ofrecen distintas capacidades.
$ docker network list
NETWORK ID NAME DRIVER SCOPE
d1cd6bdefdb7 bridge bridge local
e14adf7f1918 host host local
9c7b12187b80 none null local
Se puede observar los distintos tipos de red local en la columna de DRIVER.
- Bridge: Valor por defecto. Se utiliza cuando las aplicaciones son ejecutadas en contenedores independientes que necesitan comunicarse entre ellos.
- Host: Valor usado en contenedores independientes donde se busca compartir los servicios de red ofrecidos por el servidor donde el contenedor fue creado.
- Null: Deshabilita los servicios de red para dicho contenedor.
Host network
Este tipo de red comparte los servicios de red del equipo donde se ejecuta. Además de ofrecer las siguientes capacidades:
- Las interfaces de red del contenedor son idénticas a las de la máquina donde se ejecuta.
- Solo existe una red de tipo host por máquina.
- Es necesario especificar el tipo de red como argumento «–net=host».
- Ni container linking ni port mapping son soportados.
$ ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:92:e3:8c brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
valid_lft forever preferred_lft forever
$ docker run --net=host bash:5.0.17 ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:92:e3:8c brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
valid_lft forever preferred_lft forever
None network
Es posible crear un contenedor sin algún tipo de red asignada a el. Este contenedor es solo accesible a traves del shell del servidor donde fue creado.
Estos contenedores pueden ser útiles para la ejecución de tareas por lotes que no requieren conectividad hacia o desde ellos.
$ docker run --net=none bash:5.0.17 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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
Bridge network
Permite la creación de múltiples redes en el mismo servidor ofreciendo una separación lógica de la red, es decir, solo contenedores conectados a la misma red se pueden comunicar entre si.
$ docker run --net=bridge bash:5.0.17 ip addr show eth0
11: eth0@if12: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:50:00:03 brd ff:ff:ff:ff:ff:ff
inet 172.80.0.3/24 brd 172.80.0.255 scope global eth0
valid_lft forever preferred_lft forever
La red predeterminada creada por el servicio Docker al momento de iniciar es llamada bridge y crea un bridge llamado docker0 con los valores de una subnet en el rango de 172.80.0.0/24.
$ brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.0242eaa3ec7c no
Todos los contenedores creados en este servidor donde no se especifique su red serán conectados a esta red.