Día 20 - Docker en el campo de Batalla 5 - Mezclando todo


Querido diario:

Hoy es el vigésimo día en el frente. El enemigo no descansa, y en este campo de batalla digital, las redes de comunicación son nuestra línea de defensa y nuestro ataque. Los contenedores siguen siendo nuestro mayor aliado, pero para asegurar que nuestras unidades se comuniquen de manera eficiente y segura, necesitamos desplegar redes internas robustas.

Hemos avanzado mucho en la construcción de nuestros servicios y volúmenes, pero hoy debemos lograr que varios contenedores trabajen juntos, como una flota militar perfectamente sincronizada. Para ello, crearemos un entorno completo de contenedores interconectados, usando redes personalizadas. Esto nos permitirá establecer una comunicación fluida entre contenedores, aislarlos cuando sea necesario y tener control total sobre su tráfico.

Creación de una Red de Comunicación

La batalla comienza con la creación de una red propia. Esto nos da un control total sobre la conexión entre los contenedores, manteniéndolos aislados del resto del sistema, pero permitiendo que se comuniquen entre sí de manera segura.

Vamos a crear una red personalizada de Docker:

sudo docker network create --driver bridge mi_red_aislada

Explicación:

  • --driver bridge: Usamos el controlador bridge, que es el más común y crea redes virtuales aisladas en el host.
  • mi_red_aislada: Es el nombre de la red que estamos creando.

Ahora, hemos creado una red privada, una especie de zona segura en el campo de batalla donde nuestros contenedores podrán operar sin interferencias externas.

Lanzar Contenedores en la Red Creada

El siguiente paso es desplegar nuestros contenedores dentro de la red interna. Imaginemos que tenemos dos servicios básicos: un servidor web y un contenedor cliente que necesita comunicarse con él.

Lanzamos el servidor web (Nginx) y lo conectamos a la red mi_red_aislada:

sudo docker run -d --name servidor_web --network mi_red_aislada nginx

Y ahora lanzamos el contenedor cliente, también conectado a la misma red:

sudo docker run -d --name cliente_web --network mi_red_aislada busybox sleep 3600

Explicación:

  • Ambos contenedores están conectados a la red interna mi_red_aislada.
  • El contenedor servidor_web corre Nginx, mientras que el cliente_web corre un contenedor de BusyBox que usaremos para interactuar con el servidor web.

Ahora ambos contenedores están en la misma red interna, y pueden comunicarse usando el nombre del contenedor, que en este caso es servidor_web.

Comunicación entre Contenedores

Una vez desplegados nuestros contenedores, podemos probar su comunicación interna. Para hacerlo, nos conectamos al contenedor cliente_web y enviamos una solicitud HTTP al contenedor servidor_web.

sudo docker exec -it cliente_web wget -O- servidor_web

Este comando hace que el contenedor cliente intente obtener la página de Nginx del contenedor servidor. Dado que ambos están en la misma red interna, la comunicación será exitosa, y el cliente recibirá la página web del servidor Nginx.

Exponer Servicios al Mundo Exterior

Aunque los contenedores dentro de la misma red pueden comunicarse entre sí, a veces necesitamos que nuestros servicios sean accesibles desde fuera del campo de batalla. Para ello, expondremos el puerto del servidor web hacia el mundo exterior.

Ejecutamos este comando en el contenedor servidor_web:

sudo docker run -d -p 8080:80 --name servidor_web_externo --network mi_red_aislada nginx

Explicación:

  • -p 8080:80: Hace que el puerto 80 del contenedor (donde corre Nginx) esté accesible desde el puerto 8080 en el host.
  • --network mi_red_aislada: Mantiene el contenedor en la misma red interna.

Con esto, podemos acceder al servidor web desde el navegador usando la dirección http://localhost:8080. Este contenedor sigue aislado dentro de la red mi_red_aislada, pero su puerto está abierto al mundo exterior.

Conexión entre Contenedores y Servicios Externos

Pero en algunas ocasiones, nuestros contenedores necesitarán interactuar con servicios externos. Supongamos que tenemos un contenedor que necesita conectarse a una base de datos externa. Podemos configurar esto fácilmente usando Docker.

Para ilustrar cómo un contenedor puede interactuar con un servicio fuera de su red, lanzamos un contenedor que se conecta a un servicio MySQL externo.

Primero, lanzamos el contenedor MySQL en una red separada, pero de manera que pueda ser accesible desde otros contenedores.

sudo docker network create mysql_red

sudo docker run -d --name mysql_db --network mysql_red -e MYSQL_ROOT_PASSWORD=root_password mysql

Luego, lanzamos otro contenedor que necesita conectarse a esta base de datos:

sudo docker run -d --name app_con_mysql --network mi_red_aislada busybox sleep 3600

Ahora, dentro del contenedor app_con_mysql, podemos conectarnos a la base de datos MySQL a través de su nombre de contenedor, mysql_db. Este contenedor puede comunicarse con MySQL porque ambos están en redes conectadas entre sí.

Hoy hemos desplegado un entorno completo de comunicación entre contenedores, un sistema bien orquestado de redes internas, puertos expuestos, y comunicación entre contenedores y servicios externos. Al igual que un ejército bien coordinado, nuestros contenedores ahora pueden operar juntos en un campo de batalla digital sin barreras, pero con el control total sobre lo que se expone al exterior.

  • Redes privadas para comunicación interna segura.
  • Contenedores interconectados que comparten servicios de manera fluida.
  • Acceso controlado al mundo exterior a través de puertos expuestos.

¡La victoria está a nuestro alcance! Pero la guerra sigue, y mañana nos enfrentaremos a desafíos aún mayores. ¡Nos vemos en el próximo informe, reclutas!

Comentarios