Herramientas de usuario

Herramientas del sitio


informatica:sistemas_operativos:cursos:docker_a_fondo_introduccion_kubernetes:redes_docker

Las redes en Docker

Notas del curso Docker a fondo e Introducción a Kubernetes: aplicaciones basadas en contenedores

En este módulo vamos a hablar un poco del sistema de red en Docker. No vamos a entrar en detalles profundamente técnicos acerca de cómo integra Docker sus redes con el SO, cómo manipula las iptables o de qué manera se integra con el servicio de red de Windows. Lo que vamos a ver es la gestión de redes de Docker y algunos detalles de funcionamiento que pueden ser interesantes desde el punto de vista práctico.

En este módulo vas a ver los distintos tipos de red que tiene Docker, algunas de sus características y cómo manejar las redes en Docker.

¡Vamos allá!

Redes de tipo bridge

El primer tipo de red que vamos a ver es la red de tipo bridge. Toda máquina que es host de Docker (o sea que tiene el daemon de Docker instalado) tiene una red de este tipo, llamada bridge (también conocida como docker0). Esta es la red dentro de la que se ejecutan los contenedores por defecto.

Red bridge por defecto

Te presento al comando docker network ls. Este te listará todas las redes de Docker que tengas en tu máquina, así como su tipo:

En la imagen se puede observar que tenemos 4 redes.

Cuando ejecutas un contenedor con docker run dicho contenedor se asocia por defecto a la red llamada bridge (de tipo bridge):

La red bridge por defecto no tiene soporte de DNS. Eso significa que los contenedores solo pueden comunicarse a través de direcciones IP directas:

Por lo general, la red bridge por defecto no deberías usarla más que para ejecutar contenedores aislados.

Red propia de tipo bridge

Podemos crear redes adicionales de tipo bridge, las se comportarán del mismo modo, aunque con la diferencia de que en este caso sí que hay resolución de DNS. De hecho, esas redes son las que crea Docker Compose por nosotros.

Para crear esas redes usaremos el comando docker network create –driver bridge <nombre-red>:

Al ejecutar un contenedor podemos usar el modificador --network para indicar en qué red queremos que se ejecute:

En la imagen anterior puedes ver que el contenedor container1 puede acceder al contenedor container2 a través de su nombre. Eso es porque en estas redes el propio daemon de Docker monta un servidor de DNS.

Por defecto, Docker Compose crea una red bridge propia para ejecutar todos los contenedores.

Las redes bridge están aisladas unas de otras y su limitación principal es que todos los contenedores deben ejecutarse en la misma máquina. Cada contenedor obtiene su propia IP dentro de la red y espacio de puertos.

Redes de tipo host

En Docker una red de tipo host es una red que no está aislada de la máquina host que ejecuta los contenedores. Eso significa que:

  • Los contenedores no obtienen IP propia
  • Los contenedores comparten el espacio de puertos con el host

Así, si el host tiene un proceso que escucha por el puerto x, no se puede poner en marcha un contenedor en la red host que escuche a través de dicho puerto. Por el mismo motivo, no se pueden poner en marcha dos contenedores que escuchen a través del mismo puerto.

En la red host se hace caso omiso de las redirecciones de puerto.

Como puedes ver en la imagen anterior, se puede acceder al contenedor directamente usando http://localhost:80, ya que este no tiene IP propia y se ejecuta en la misma red y espacio de puertos que el host. Observa que no hay redirección de puertos (no se usa el parámetro -p de docker run). De hecho, el puerto 80 del host está ahora ocupado por el propio contenedor:

En la imagen se puede observar como el puerto 80 del host está abierto mientras el contenedor se está ejecutando y se libera al detener el contenedor.

La red de host no debería utilizarse de forma habitual: es útil en aquellos casos en que un contenedor abra un gran número de puertos y no se quiera redireccionarlos todos. Recuerda que bajo esa red los contenedores no reciben IP y comparten espacio de puertos con el host

Debido a su naturaleza especial solo puede existir una red host. Si usas el comando docker network create --driver host <nombre-red> te dará error si ya existe una red host previa.

La red de tipo host solo está soportada en Docker para Linux. Docker for Mac no la soporta y Docker for Windows tampoco (ni en contenedores Linux, ni en contenedores Windows). Docker for Windows en contenedores Windows tiene otros tipos de red, que vas a ver en el módulo específico de contenedores para Windows.

Manejo de redes en Docker

El comando docker network es el encargado de manejar las redes de Docker. Ya has visto el comando docker network create para crear redes. Análogamente existe el comando docker network rm para eliminar una red. Su sintaxis es docker network rm <id>:

Y por último, el comando docker network prune elimina todas las redes que no se utilicen. De vez en cuando (especialmente si “matas” contenedores ejecutándose con Docker Compose y no ejecutas el comando docker compose down) se pueden quedar redes creadas. Así que hacer limpieza de vez en cuando, tampoco viene mal.

Existen más subcomandos de docker network, pero esos son los fundamentales y los que usarás en tu día a día.

Y eso es todo lo más relevante en lo que respecta a la gestión de redes en Docker. Solo un apunte más: existen más tipos de redes (overlay, macvlan y otros), pero el objetivo aquí era que tuvieras una introducción a los tipos más básicos.

También debes saber que hay plugins de redes para Docker que permiten integrar Docker con otros sistemas de red, ofrecidos por terceros.

Vamos, ¡qué es todo un mundo!

informatica/sistemas_operativos/cursos/docker_a_fondo_introduccion_kubernetes/redes_docker.txt · Última modificación: por tempwin