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-appexistente que desee introducir en un contenedor.
Sugerencias
- Defina las entradas de la imagen antes de crear y ejecutar el contenedor.
Resultado de ejemplo
Cree los archivos necesarios para el desafío:
Cree un archivo nuevo llamado
Dockerfileen la ruta/home/labex/project/con el siguiente contenido:- Use
python:3.7-slimcomo imagen base. - Establezca
/appcomo directorio de trabajo. - Copie el contenido del directorio actual al contenedor, en
/app. - Instale los paquetes necesarios.
- Exponga el puerto
80al exterior. - Defina una variable de entorno (aunque no se utiliza en este ejemplo, conserve la instrucción).
- Ejecute
app.pycuando se inicie el contenedor.
Cree un archivo llamado
app.pyen 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.txten el directorio del 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- Use
Use el comando
docker buildpara crear la imagenmy-app.labex:project/ $ docker images | grep my-app my-app latest 266edf714faf 30 seconds ago 170MBInicie un contenedor nuevo usando la imagen
my-appy 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/tcpAbra un navegador web y vaya a
http://localhost:8080para verificar que la aplicación se está ejecutando correctamente.
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_appadicional vinculado a los contenedores de Apache y MySQL. - Instale el cliente de MySQL dentro de
my_appantes 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:
Inicie un contenedor de Apache llamado
my_apachebasado en la imagenhttpd, 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/tcpInicie un contenedor de MySQL llamado
my_mysql, establezca la variable de entornoMYSQL_ROOT_PASSWORDenpasswordy use la imagenmysql.labex:project/ $ docker ps | grep mysql 0cb864cf97c6 mysql "docker-entrypoint.s…" 42 seconds ago Up 35 seconds 3306/tcp, 33060/tcp my_mysqlInicie un contenedor
my_appvinculado a los contenedores de MySQL y Apache. Nota: el vínculo aparece en la configuración del contenedor. Puede 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_appUse el comando
docker execpara acceder a la interfaz de línea de comandos de MySQL desde el contenedormy_app(deberá adaptar el comando si realizó los vínculos de otra manera).Instale el cliente de MySQL dentro de
my_appy, 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_app2con ambos vínculos y estas variables de entorno:DB_HOST=mysql,DB_USER=root,DB_PASSWORD=passwordyAPACHE_HOST=apache. - Instale
curldentro demy_app2antes de probar la conexión con Apache, porque la imagenmy-appno 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
Inicie un contenedor de Apache y otro de MySQL como se describe en el paso 2.
Inicie 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_app2Entre en
my_app2, instalecurly ejecutecurl 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.



