Conectar contenedores con enlace

DockerDockerBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

Docker es una herramienta poderosa para desplegar aplicaciones, pero puede parecer compleja al principio. Este desafío lo guiará a través del enlace de contenedores de Docker para crear una aplicación multi-contenedor. Comenzaremos con ejemplos simples y progresaremos gradualmente hacia una aplicación más compleja. Incluso si es nuevo en Docker, debería resultar fácil de seguir. Exploraremos cómo hacer que los contenedores se comuniquen entre sí, que es un aspecto fundamental de la construcción de aplicaciones robustas con Docker.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/NetworkOperationsGroup(["Network Operations"]) docker(("Docker")) -.-> docker/DockerfileGroup(["Dockerfile"]) docker/ContainerOperationsGroup -.-> docker/start("Start Container") docker/ContainerOperationsGroup -.-> docker/exec("Execute Command in Container") docker/ImageOperationsGroup -.-> docker/images("List Images") docker/NetworkOperationsGroup -.-> docker/network("Manage Networks") docker/DockerfileGroup -.-> docker/build("Build Image from Dockerfile") subgraph Lab Skills docker/start -.-> lab-49351{{"Conectar contenedores con enlace"}} docker/exec -.-> lab-49351{{"Conectar contenedores con enlace"}} docker/images -.-> lab-49351{{"Conectar contenedores con enlace"}} docker/network -.-> lab-49351{{"Conectar contenedores con enlace"}} docker/build -.-> lab-49351{{"Conectar contenedores con enlace"}} end

Crea una imagen con Dockerfile

Antes de poder enlazar contenedores, necesitamos tener al menos una aplicación empaquetada en un contenedor. 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

  • Debes tener Docker instalado en tu máquina.
  • Deberías tener una aplicación my-app existente que desees empaquetar en un contenedor.

Resultado 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:

    • Utiliza 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.
    • Expone el puerto 80 al mundo exterior.
    • Define una variable de entorno (aunque no la usamos en este ejemplo, mantén la instrucción).
    • Ejecuta app.py cuando el contenedor se inicia.

    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. Utiliza 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 utilizando la imagen my-app, y anota 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.

Web app running in browser
✨ Revisar Solución y Practicar

Vincular dos contenedores de Docker

Ahora que tenemos una aplicación empaquetada en un contenedor, pasemos a vincular contenedores. En este paso, aprenderemos cómo vincular dos contenedores de Docker, lo que les permitirá comunicarse entre sí. Este proceso es fundamental para crear aplicaciones multi-servicio dentro de Docker.

Tarea

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

Requisitos

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

Pista

  • Recuerda abrir una nueva terminal para comenzar este paso para que no haya conflicto con tu contenedor anterior.

Resultado ejemplo

Accede a MySQL desde el contenedor de Apache:

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

    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 de MySQL llamado my_mysql, estableciendo la variable de entorno MYSQL_ROOT_PASSWORD en password, utilizando 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. Vincula el contenedor de Apache con el contenedor de 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. Utiliza el comando docker exec para acceder a la interfaz de línea de comandos de MySQL desde el contenedor my_app (debes adaptar el comando si has enlazado de manera diferente).

    Bienvenido al monitor de MariaDB. Los comandos terminan con ; o \g.
    Su identificador de conexión MySQL es 8
    Versión del servidor: 8.3.0 MySQL Community Server - GPL
    
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab y otros.
    
    Escriba 'help;' o '\h' para obtener ayuda. Escriba '\c' para borrar la declaración de entrada actual.
    
    MySQL [(none)]>
✨ Revisar Solución y Practicar

Vincular múltiples contenedores de Docker y usar variables de entorno

Partiendo del paso anterior, ahora exploraremos cómo vincular 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

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

Requisitos

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

Resultado ejemplo

  1. Inicia un contenedor de Apache y 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. Utiliza curl para acceder a la aplicación personalizada a través del contenedor de Apache.

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

Resumen

En este desafío, aprendiste cómo enlazar contenedores de Docker para crear aplicaciones multi-contenedor. Avanzamos desde un solo contenedor hasta pares enlazados 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 permite construir aplicaciones más complejas. Sigue experimentando y diviértete!