Conexión de Contenedores mediante Enlaces

DockerBeginner
Practicar Ahora

Introducción

Docker es una herramienta excepcional para el despliegue de aplicaciones, aunque inicialmente pueda parecer compleja. Este desafío te guiará a través del proceso de enlace de contenedores Docker para construir una arquitectura multi-contenedor. Empezaremos con ejemplos básicos y progresaremos hacia una estructura más sofisticada. No importa si acabas de empezar con Docker, la guía está diseñada para ser fácil de seguir. Exploraremos cómo lograr que los contenedores se comuniquen entre sí, un aspecto fundamental para desarrollar aplicaciones robustas y escalables.

Crear una Imagen con Dockerfile

Antes de poder enlazar contenedores, necesitamos tener al menos una aplicación contenedorizada. En este paso, crearás un Dockerfile para tu imagen my-app. Este archivo definirá el entorno y la aplicación que se ejecutará dentro del contenedor.

Tarea

El objetivo de este paso es crear un Dockerfile para generar tu imagen personalizada my-app.

Requisitos

  • Docker debe estar instalado en tu máquina.
  • Debes tener preparada la aplicación my-app que deseas contenedorizar.

Ejemplo de Resultado

  1. Crea los archivos necesarios para el desafío:

    Crea un nuevo archivo llamado Dockerfile en la ruta /home/labex/project/ con el siguiente contenido:

    • Usa python:3.7-slim como imagen base.
    • Establece el directorio de trabajo en /app.
    • Copia el contenido del directorio actual dentro del contenedor en /app.
    • Instala los paquetes necesarios.
    • Expón el puerto 80 al exterior.
    • Define una variable de entorno (aunque no se use en este ejemplo, mantén la instrucción).
    • Ejecuta app.py al iniciar el contenedor.

    Crea un archivo llamado app.py en tu directorio de proyecto /home/labex/project/ con el siguiente contenido:

    import os
    
    os.system("wssh --address='0.0.0.0' --port=80")

    Crea un archivo llamado requirements.txt en tu directorio de proyecto /home/labex/project/ con el siguiente contenido:

    webssh==1.6.2
    labex:project/ $ pwd
    /home/labex/project
    labex:project/ $ ll
    total 12K
    -rw-r--r-- 1 labex labex 59 Jan 24 15:21 app.py
    -rw-r--r-- 1 labex labex 163 Jan 24 15:19 Dockerfile
    -rw-r--r-- 1 labex labex 14 Jan 24 15:21 requirements.txt
  2. Usa el comando docker build para construir la imagen my-app.

    labex:project/ $ docker images | grep my-app
    my-app latest 266edf714faf 30 seconds ago 170MB
  3. Inicia un nuevo contenedor usando la imagen my-app y observa el mapeo de puertos.

    labex:project/ $ docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    11f06f08d2d3 my-app "python app.py" 4 seconds ago Up 4 seconds 0.0.0.0:8080- hopeful_elgamal > 80/tcp
  4. Abre un navegador web y dirígete a http://localhost:8080 para verificar que tu aplicación se está ejecutando correctamente.

    Aplicación web ejecutándose en el navegador
✨ Revisar Solución y Practicar

Enlace de Dos Contenedores Docker

Ahora que tenemos una aplicación contenedorizada, procedamos a enlazar contenedores. En este paso, aprenderemos a conectar dos contenedores de Docker, permitiendo que se comuniquen entre sí. Este proceso es fundamental para crear aplicaciones compuestas por múltiples servicios.

Tarea

Enlazar un contenedor de servidor web Apache con un contenedor de base de datos MySQL.

Requisitos

  • Necesitarás dos contenedores Docker: uno ejecutando Apache y otro ejecutando MySQL.
  • Docker debe estar instalado en tu máquina.

Consejo

  • Recuerda abrir una nueva terminal para iniciar este paso y evitar conflictos con tu contenedor anterior.

Ejemplo de Resultado

Acceder a MySQL desde el contenedor de Apache:

  1. Lanza un contenedor Apache llamado my_apache basado en la imagen httpd, mapeando el puerto 80 del host al puerto 80 del contenedor.

    labex:project/ $ docker ps | grep my_apache
    a91a93216e84 httpd "httpd-foreground" 52 seconds ago Up 47 seconds 0.0.0.0:80- my_apache > 80/tcp
  2. Lanza un contenedor MySQL llamado my_mysql, configurando la variable de entorno MYSQL_ROOT_PASSWORD como password, usando la imagen mysql.

    labex:project/ $ docker ps | grep mysql
    0cb864cf97c6 mysql "docker-entrypoint.s…" 42 seconds ago Up 35 seconds 3306/tcp, 33060/tcp my_mysql
  3. Enlaza el contenedor Apache al contenedor MySQL.
    Nota: Para este paso, no se espera una salida de comando directa, pero el enlace será visible en las variables de entorno del contenedor. Puedes inspeccionar el contenedor con el comando docker inspect my_apache.

    labex:project/ $ docker ps | grep my_app
    859c201b7267 my-app "python app.py" 53 seconds ago Up 52 seconds 80/tcp my_app
  4. Usa el comando docker exec para acceder a la interfaz de línea de comandos de MySQL desde el contenedor my_app (deberás adaptar el comando si realizaste el enlace de forma distinta).

    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MySQL connection id is 8
    Server version: 8.3.0 MySQL Community Server - GPL
    
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    MySQL [(none)]>
✨ Revisar Solución y Practicar

Enlace de Múltiples Contenedores y Uso de Variables de Entorno

Basándonos en el paso anterior, ahora exploraremos cómo enlazar múltiples contenedores y aprovechar las variables de entorno para la configuración. Este paso muestra cómo crear entornos multi-contenedor más complejos y flexibles.

Tarea

Lanzar tres contenedores: uno con Apache, uno con MySQL y uno con una aplicación personalizada. La aplicación personalizada debe ser capaz de acceder tanto a MySQL como a Apache.

Requisitos

  • Necesitarás tres contenedores Docker: Apache, MySQL y una aplicación personalizada.
  • Docker debe estar instalado en tu máquina.

Ejemplo de Resultado

  1. Lanza un contenedor Apache y uno MySQL como se describió en el Paso 2.

  2. Lanza un contenedor de aplicación personalizada llamado my_app2 que pueda acceder tanto a MySQL como a Apache.

    labex:project/ $ docker ps | grep app2
    8945b42659a6 my-app "python app.py" 15 seconds ago Up 15 seconds 80/tcp my_app2
  3. Usa curl para acceder a la aplicación personalizada a través del contenedor Apache.

    <html>
      <body>
        <h1>It works!</h1>
      </body>
    </html>
✨ Revisar Solución y Practicar

Resumen

En este desafío, has aprendido a enlazar contenedores Docker para crear aplicaciones multi-contenedor. Hemos progresado desde un único contenedor hasta parejas enlazadas y, finalmente, una configuración de tres contenedores. Ahora comprendes cómo aprovechar los enlaces entre contenedores y el comando docker exec para permitir la comunicación entre diferentes servicios, lo que te permite construir aplicaciones más complejas. ¡Sigue experimentando y diviértete!