Herramientas de usuario

Herramientas del sitio


informatica:sistemas_operativos:cursos:docker_a_fondo_introduccion_kubernetes:redes_docker

¡Esta es una revisión vieja del documento!


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

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