Conectar contenedores con Link

DockerBeginner
Practicar Ahora

Introducción

Docker es una herramienta potente para desplegar aplicaciones, pero inicialmente puede parecer compleja. Este desafío te guiará a través de la vinculación de contenedores Docker para crear una aplicación de múltiples contenedores. Comenzaremos con ejemplos sencillos y progresaremos gradualmente hacia una aplicación más compleja. Incluso si eres nuevo en Docker, te resultará fácil seguir los pasos. Exploraremos cómo hacer que los contenedores se comuniquen entre sí, lo cual es un aspecto fundamental para construir aplicaciones robustas con Docker.

Crear una imagen con Dockerfile

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

Tarea

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

Requisitos

  • Docker debe estar instalado en tu máquina.
  • Debes tener una aplicación my-app existente que desees contenerizar.

Resultado de ejemplo

  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 al contenedor en /app.
    • Instala los paquetes necesarios.
    • Expón el puerto 80 al mundo exterior.
    • Define una variable de entorno (aunque no la usemos en este ejemplo, mantén la instrucción).
    • Ejecuta app.py cuando el contenedor se inicie.

    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 navega a http://localhost:8080 para verificar que tu aplicación se está ejecutando correctamente.

    Aplicación web ejecutándose en el navegador

Vincular dos contenedores Docker

Ahora que tenemos una aplicación contenerizada, pasemos a la vinculación de contenedores. En este paso, aprenderemos a vincular dos contenedores Docker, permitiendo que se comuniquen entre sí. Este proceso es clave para crear aplicaciones de múltiples servicios dentro de Docker.

Tarea

Inicia contenedores de servicio Apache y MySQL, luego inicia un contenedor my_app que se vincule a ambos servicios para que puedas probar la conexión a MySQL desde dentro de my_app.

Requisitos

  • Necesitarás dos contenedores Docker: uno ejecutando Apache y otro ejecutando MySQL.
  • Inicia un contenedor adicional my_app que se vincule a los contenedores de Apache y MySQL.
  • Instala el cliente de MySQL dentro de my_app antes de probar la conexión a la base de datos.
  • Docker debe estar instalado en tu máquina.

Pista

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

Resultado de ejemplo

Accede a MySQL desde el contenedor my_app después de vincularlo a ambos servicios:

  1. Inicia 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. Inicia un contenedor MySQL llamado my_mysql, estableciendo la variable de entorno MYSQL_ROOT_PASSWORD en 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. Inicia un contenedor my_app que se vincule tanto al contenedor MySQL como al de Apache. Nota: El enlace es visible en la configuración del contenedor. Puedes inspeccionarlo con docker inspect my_app.

    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 la vinculación de forma diferente).

    Instala el cliente de MySQL dentro de my_app, luego conéctate al servicio MySQL vinculado:

    labex:project/ $ docker exec -it my_app bash
    root@859c201b7267:/app## apt-get update && apt install -y default-mysql-client
    root@859c201b7267:/app## mysql -h mysql -uroot -ppassword
    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)]>
    

Vincular múltiples contenedores Docker y usar variables de entorno

Basándonos en el paso anterior, esta parte añade dos nuevas ideas: un contenedor de aplicación se vincula a ambos servicios, y el contenedor recibe los ajustes de conexión a través de variables de entorno. En el Paso 2, solo demostraste que los contenedores vinculados pueden alcanzarse entre sí. En este paso, debes iniciar my_app2 con ambas opciones --link y las variables de entorno que describen los hosts de MySQL y Apache.

Tarea

Inicia tres contenedores: uno ejecutando Apache, uno ejecutando MySQL y uno ejecutando una aplicación personalizada. La aplicación personalizada debería poder acceder tanto a MySQL como a Apache.

Requisitos

  • Necesitarás tres contenedores Docker: Apache, MySQL y una aplicación personalizada.
  • Inicia my_app2 con ambos enlaces y estas variables de entorno: DB_HOST=mysql, DB_USER=root, DB_PASSWORD=password y APACHE_HOST=apache.
  • Instala curl dentro de my_app2 antes de probar la conexión a Apache, ya que la imagen my-app no lo incluye por defecto.
  • Docker debe estar instalado en tu máquina.

Resultado de ejemplo

  1. Inicia un contenedor Apache y uno MySQL como se describe en el Paso 2.

  2. Inicia 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. Entra en my_app2, instala curl y ejecuta curl http://apache/ para confirmar que el contenedor Apache vinculado es accesible.

    <html>
      <body>
        <h1>It works!</h1>
      </body>
    </html>
    

Resumen

En este desafío, aprendiste a vincular contenedores Docker para crear aplicaciones de múltiples contenedores. Progresamos desde un solo contenedor a pares vinculados y, finalmente, a una configuración de tres contenedores. Ahora tienes una comprensión de cómo aprovechar los enlaces de contenedores y el comando docker exec para permitir la comunicación entre diferentes servicios, lo que te permitirá construir aplicaciones más complejas. ¡Sigue experimentando y diviértete!

✨ Revisar Solución y Practicar✨ Revisar Solución y Practicar✨ Revisar Solución y Practicar