En el presente trabajo integrador se evaluará:
- Conteinerizar una aplicación simple.
- Buildear la imagen y subirla a Docker Hub.
- Correr la aplicación multicontenedor usando docker compose.
Important
Fecha límite de entrega 15/12/2025.
- Docker Desktop o Docker CLI
- Git (opcional).
- Un editor de texto (recomendado), como Notepad++, VSCode o VSCodium.
Enviar el archivo docker-compose.yml por correo electrónico a cgiambruni@gmail.com.
Para este trabajo integrador, usaremos una app simple todo list manager que corre en Node.js y podemos levantarla en nuestro navegador web. Si no estás familiarizado con Node.js, no te preocupes, este trabajo integrador no requiere conocimientos de programación. Solo usaremos una app de ejemplo para poder armar las imágenes y correr los contenedores.
Antes de poder correr la aplicación, necesitamos obtener el código fuente y descargarlo.
-
Clonar el repositorio usando el siguiente comando:
git clone https://github.com/kity-linuxero/docker-integradora.git
-
Si no tiene un cliente git instalado, puede descargar el repositorio del siguiente link. Luego debe descomprimir el archivo zip.
-
Una vez descargada la aplicación, deberías ver el código fuente de la misma con la siguiente estructura de directorios dentro de la carpeta
app:app/ ├─ spec/ ├─ src/ ├─ yarn.lock ├─ package.json ├─ Dockerfile ├─ .dockerignore
Haremos algunos cambios y actualizaremos la aplicación.
-
En el archivo
app/src/static/js/app.jsactualizaremos la línea 56, con los siguientes cambios:- <p className="text-center">Aún no hay items. ¡Agrega tu primer item arriba!</p> + <p className="text-center">No hay nada en la lista! | by: [SU APELLIDO.NOMBRE]</p>
Es importante que ponga su nombre y apellido en el archivo
app/src/static/js/app.jspara después saber quien hizo el trabajo integrador.
Tip
Consulte apuntes de docker build.
-
El archivo
Dockerfilese encuentra en la carpetaappcon el siguiente contenido:# Usamos la imagen base de Alpine Linux FROM node:18-alpine # Establecemos el directorio de trabajo WORKDIR /app # Copiamos los archivos del proyecto al contenedor COPY . . # Instalamos las dependencias del proyecto RUN yarn install # Exponemos el puerto de la aplicación EXPOSE 3000 # Comando por defecto para ejecutar la aplicación CMD ["node", "src/index.js"]
Proceda a buildear la imagen con el siguiente comando:
docker build -t <NOMBRE_IMAGEN> .Tip
El Dockerfile puede ser mejorado. Es opcional. Pero si lo desea puede investigar como mejorar el Dockerfile con multi-stage build para reducir el tamaño de la imagen final.
Una vez creada la imagen, debería ser capaz de correr la aplicación. Con el siguiente comando:
docker run -d -p 3000:3000 --name todo-app <NOMBRE_IMAGEN>Por ejemplo:
docker run -p 3000:3000 --name todo-app todo-app:v1Y debería mostrar algo como:
Using sqlite database at /etc/todos/todo.db
Listening on port 3000Si todo está ok, podría acceder a la aplicación en http://localhost:3000.
-
Detenga y elimine el contenedor de la aplicación con el siguiente comando:
docker rm -f todo-app
Para compartir la imagen de la aplicación usaremos la registry de DockerHub.
Tip
De ser necesario, repase lo realizado en el Laboratorio 2.4.
Important
Debe volver a buildear la imagen y subirla a DockerHub para aprobar el trabajo integrador.
A continuación agregaremos un segundo contenedor para que sea de base de datos basada en MySQL.
Usaremos una imagen basada en MySQL. La imagen será mysql:8.0. Para poder iniciar y tener la configuración sobre la base de datos, usaremos variables de entorno.
Para mas info consulte la sección variables de entorno de Docker Hub MySQL.
A modo de resumen, tendremos que configurar las siguientes variables de entorno para el contenedor de base de datos:
Variables de entorno para el contenedor de base de datos:
MYSQL_ROOT_PASSWORD: La password del usuario root de la base de datos. Utilice la password de su preferencia.MYSQL_DATABASE: La base de datos que utilizaremos. Elija un nombre de su preferencia, por ejemplotodos.
Variables de entorno para la aplicación:
MYSQL_HOST: Hostname donde corre el servidor MySQL. Coincidir con el nombre del servicio o con elcontainer_namede la base de datos.MYSQL_USER: El usuario para la conexión.MYSQL_PASSWORD: La password utilizada para la conexión.MYSQL_DB: La base de datos que se utilizará una vez conectada la aplicación.
Consulte src/persistence/mysql.js para mas información.
Genere un volumen para persistir los datos de la base de datos. El punto de montaje es /var/lib/mysql.
Crear el archivo docker-compose.yml con toda la configuración necesaria para que levante la aplicación y la base de datos. Con las variables de entorno configuradas, la imagen subida a Docker Hub y el volúmen para persistir los datos de la base de datos.
Tip
Puede ser de utilidad el sitio composerize o con una herramienta de IA de su preferencia.
Important
La image del docker compose debe tomar como origen la imagen que ha subido a Docker Hub con su usuario.
Important
Tener en cuenta que los datos deben persistir en el contenedor de base de datos. Por lo tanto, utilice un volúmen para persistir los datos de la base de datos. La base de datos se encuentra en /var/lib/mysql.
Con el siguiente comando debería ser capaz de correr la aplicación junto con la base de datos
docker compose up -dSi todo sale bien, el log de la app debería mostrar lo siguiente:
Waiting for db:3306.
Connected!
Connected to mysql db at host db
Listening on port 3000Para corroborar que la app funcione en otro entorno, pruebe eliminar todo y volver a levantar la app entera:
docker compose down -v # Se borran los volumes
docker compose up -d

