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
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
Crear nuevas redes
Podemos crear redes para posteriormente conectarnos a ella, para ello usaremos el comando
docker network create nombre_red
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.