Conectar contenedores con Link

DockerBeginner
Practicar Ahora

Introducción

Docker es una herramienta eficaz para implementar aplicaciones, pero al principio puede parecer compleja. En este desafío aprenderá a vincular contenedores de Docker para crear una aplicación de varios contenedores. Comenzará con ejemplos sencillos y avanzará gradualmente hasta una aplicación más compleja. Aunque sea nuevo en Docker, podrá seguir el procedimiento con facilidad. Aprenderá a hacer que los contenedores se comuniquen entre sí, un aspecto fundamental para crear aplicaciones sólidas con Docker.

Crear una imagen con Dockerfile

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

Tareas

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

Requisitos

  • Docker debe estar instalado en su equipo.
  • Debe tener una aplicación my-app existente que desee introducir en un contenedor.

Sugerencias

  • Defina las entradas de la imagen antes de crear y ejecutar el contenedor.

Resultado de ejemplo

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

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

    • Use python:3.7-slim como imagen base.
    • Establezca /app como directorio de trabajo.
    • Copie el contenido del directorio actual al contenedor, en /app.
    • Instale los paquetes necesarios.
    • Exponga el puerto 80 al exterior.
    • Defina una variable de entorno (aunque no se utiliza en este ejemplo, conserve la instrucción).
    • Ejecute app.py cuando se inicie el contenedor.

    Cree un archivo llamado app.py en el directorio del proyecto /home/labex/project/ con el siguiente contenido:

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

    Cree un archivo llamado requirements.txt en el directorio del 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. Use el comando docker build para crear la imagen my-app.

    labex:project/ $ docker images | grep my-app
    my-app latest 266edf714faf 30 seconds ago 170MB
    
  3. Inicie un contenedor nuevo usando la imagen my-app y observe la asignación 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. Abra un navegador web y vaya a http://localhost:8080 para verificar que la aplicación se está ejecutando correctamente.

    Aplicación web ejecutándose en el navegador

Vincular dos contenedores de Docker

Ahora que ya tiene una aplicación en un contenedor, puede pasar a vincular contenedores. En este paso aprenderá a vincular dos contenedores de Docker para que puedan comunicarse entre sí. Este proceso es fundamental para crear aplicaciones con varios servicios dentro de Docker.

Tareas

Inicie contenedores de servicios de Apache y MySQL. Después, inicie un contenedor my_app vinculado a ambos servicios para probar la conexión con MySQL desde my_app.

Requisitos

  • Necesitará dos contenedores de Docker: uno que ejecute Apache y otro que ejecute MySQL.
  • Inicie un contenedor my_app adicional vinculado a los contenedores de Apache y MySQL.
  • Instale el cliente de MySQL dentro de my_app antes de probar la conexión con la base de datos.
  • Docker debe estar instalado en su equipo.

Sugerencias

  • Abra un terminal nuevo para iniciar este paso y evitar conflictos con el contenedor anterior.

Resultado de ejemplo

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

  1. Inicie un contenedor de Apache llamado my_apache basado en la imagen httpd, asignando 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. Inicie un contenedor de MySQL llamado my_mysql, establezca la variable de entorno MYSQL_ROOT_PASSWORD en password y use 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. Inicie un contenedor my_app vinculado a los contenedores de MySQL y Apache. Nota: el vínculo aparece en la configuración del contenedor. Puede 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. Use el comando docker exec para acceder a la interfaz de línea de comandos de MySQL desde el contenedor my_app (deberá adaptar el comando si realizó los vínculos de otra manera).

    Instale el cliente de MySQL dentro de my_app y, después, conéctese al servicio de 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 varios contenedores de Docker y usar variables de entorno

A partir del paso anterior, esta parte incorpora dos ideas nuevas: un contenedor de aplicación se vincula a ambos servicios y recibe la configuración de conexión mediante variables de entorno. En el paso 2 solo comprobó que los contenedores vinculados pueden comunicarse entre sí. En este paso debe iniciar my_app2 con las dos opciones --link y con las variables de entorno que describen los hosts de MySQL y Apache.

Tareas

Inicie tres contenedores: uno que ejecute Apache, otro que ejecute MySQL y otro que ejecute una aplicación personalizada. La aplicación personalizada debe poder acceder tanto a MySQL como a Apache.

Requisitos

  • Necesitará tres contenedores de Docker: Apache, MySQL y una aplicación personalizada.
  • Inicie my_app2 con ambos vínculos y estas variables de entorno: DB_HOST=mysql, DB_USER=root, DB_PASSWORD=password y APACHE_HOST=apache.
  • Instale curl dentro de my_app2 antes de probar la conexión con Apache, porque la imagen my-app no lo incluye de forma predeterminada.
  • Docker debe estar instalado en su equipo.

Sugerencias

  • Reutilice los contenedores de servicios del paso 2 e inspeccione el contenedor de la aplicación nuevo si necesita confirmar sus vínculos o su entorno.

Resultado de ejemplo

  1. Inicie un contenedor de Apache y otro de MySQL como se describe en el paso 2.

  2. Inicie 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. Entre en my_app2, instale curl y ejecute curl http://apache/ para confirmar que se puede acceder al contenedor de Apache vinculado.

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

Resumen

En este desafío aprendió a vincular contenedores de Docker para crear aplicaciones de varios contenedores. Avanzó desde un único contenedor hasta pares de contenedores vinculados y, finalmente, una configuración de tres contenedores. Ahora comprende cómo aprovechar los vínculos entre contenedores y el comando docker exec para permitir la comunicación entre distintos servicios y crear aplicaciones más complejas. Siga experimentando y disfrute del proceso.

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