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-appexistente que desees contenerizar.
Resultado de ejemplo
Crea los archivos necesarios para el desafío:
Crea un nuevo archivo llamado
Dockerfileen la ruta/home/labex/project/con el siguiente contenido:- Usa
python:3.7-slimcomo 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
80al mundo exterior. - Define una variable de entorno (aunque no la usemos en este ejemplo, mantén la instrucción).
- Ejecuta
app.pycuando el contenedor se inicie.
Crea un archivo llamado
app.pyen 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.txten tu directorio de proyecto/home/labex/project/con el siguiente contenido:webssh==1.6.2labex: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- Usa
Usa el comando
docker buildpara construir la imagenmy-app.labex:project/ $ docker images | grep my-app my-app latest 266edf714faf 30 seconds ago 170MBInicia un nuevo contenedor usando la imagen
my-appy 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/tcpAbre un navegador web y navega a
http://localhost:8080para verificar que tu aplicación se está ejecutando correctamente.
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_appque se vincule a los contenedores de Apache y MySQL. - Instala el cliente de MySQL dentro de
my_appantes 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:
Inicia un contenedor Apache llamado
my_apachebasado en la imagenhttpd, 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/tcpInicia un contenedor MySQL llamado
my_mysql, estableciendo la variable de entornoMYSQL_ROOT_PASSWORDenpassword, usando la imagenmysql.labex:project/ $ docker ps | grep mysql 0cb864cf97c6 mysql "docker-entrypoint.s…" 42 seconds ago Up 35 seconds 3306/tcp, 33060/tcp my_mysqlInicia un contenedor
my_appque se vincule tanto al contenedor MySQL como al de Apache. Nota: El enlace es visible en la configuración del contenedor. Puedes inspeccionarlo condocker 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_appUsa el comando
docker execpara acceder a la interfaz de línea de comandos de MySQL desde el contenedormy_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_app2con ambos enlaces y estas variables de entorno:DB_HOST=mysql,DB_USER=root,DB_PASSWORD=passwordyAPACHE_HOST=apache. - Instala
curldentro demy_app2antes de probar la conexión a Apache, ya que la imagenmy-appno lo incluye por defecto. - Docker debe estar instalado en tu máquina.
Resultado de ejemplo
Inicia un contenedor Apache y uno MySQL como se describe en el Paso 2.
Inicia un contenedor de aplicación personalizada llamado
my_app2que 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_app2Entra en
my_app2, instalacurly ejecutacurl 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!



