Docker: Gestión de Redes

May 10, 2018
docker devops sistemas

docker logo

Redes en Docker

A la hora de crear aplicaciones con contenedores conectados entre si debemos usar las redes de Docker para poder comunicar los contenedores entre ellos. Imaginad por ejemplo que quiero crear un blog y para ello necesito una base de datos y un servidor de aplicaciones o algo parecido como mínimo. Podría crear dos contenedores, pero para que mi servidor/aplicación se conectase con la base de datos deberían poder verse. ¿Cómo podemos hacer eso? pues a través de las redes de Docker.

Listar redes

Para poder ver un listado de las redes que tenemos en nuestro sistema deberemos ejecutar el siguiente comando: docker network ls . Esto nos mostrará un listado de todas las redes que hayamos creado en el sistema, tanto nosotros como los contenedores que hayamos ejecutados o las redes por defecto de Docker, como son host y none

docker network ls

Red host

Docker nos crea una red host, esta es la red en la que se encuentra el anfitrión, es decir la propia máquina que corre Docker. Con esta red se gana velocidad a cambio de perder mucho en seguridad, por lo cual no recomiendo usarla para los contenedores. Personalmente pienso que si usamos contenedores para tener "contenida" la ejecución, hacerlo en la red del anfitrión no es una buena idea.

Información de redes

Para ver la información de una red, y por ejemplo conocer que contenedores la están utilizando, a parte de mucha mas información, tenemos el comando docker network inspect nombre_red

docker network inspect

Crear nuevas redes

Podemos crear redes para posteriormente conectarnos a ella, para ello usaremos el comando docker network create nombre_red

docker network create

Para ver todas las opciones que tenemos a la hora de crear la red ejecutaremos docker network create --help

Conectar contenedor a una red

Para poder conectar un contenedor a una red deberemos especificar a que red queremos conectarlo con la opción --network seguido del nombre de la red a la que queramos añadirlo. Por ejemplo para ejecutar un contenedor de mysql y añadirlo a la red que acabo de crear la orden sería la siguiente: docker container run -d --name blog_mysql --network blog mysql .

Para añadir un contenedor que ya existe a una red debemos usar el siguiente comando docker network connect id_de_red id_de_contenedor .

Desconectar un contenedor de una red

Para desconectar un contenedor de una red tenemos el siguiente comando docker network disconnect id_de_red id_de_contenedor .

Exposición de puertos

Cuando creamos/añadimos un contenedor a una red, por defecto todos los puertos estarán cerrados en la conexión hacia al exterior y todos abiertos para las máquinas que se encuentren dentro de la misma red. Esto significa que por ejemplo no haría falta exponer puertos del contenedor de mysql, ya que al encontrarse en la misma red que el contenedor de aplicación, podrán conectarse por el puerto sin problema, pero no podremos acceder al puerto de mysql desde fuera de la red, a no ser que lo expongamos

Servicio de DNS de Docker

El propio Docker monta un servicio DNS para poder intercomunicar los contenedores de una red entre ellos, así que dentro de una misma red podemos acceder a contenedores a través del nombre del contenedor o de un alias de red, que hayamos definido a través de --net-alias . Así por ejemplo del contenedor de aplicación yo podría hacer un ping blog_mysql sin necesidad de saber cual es la IP del contenedor dentro de la red. Es mas, es una mala práctica apuntar por IP entre contenedores, ya que estas cambian automáticamente.

comments powered by Disqus