En el presente trabajo integrador se evaluará:
- Conteinerizar una aplicación simple.
- Buildear y correr una imágen como un contenedor.
- Compartir imágenes en Docker Hub.
- Deployar aplicaciones Docker usando multiples contenedores usando una base de datos que corre en un contenedor aparte.
- Correr la aplicación usando docker compose.
Important
Fecha límite de entrega 10/11/2025.
- Tener instalado Docker Desktop o Docker CLI
- Tener instalado un editor de texto, como Notepad++, VSCode o VSCodium.
- Tener instalado un cliente Git (opcional).
Se proponen dos formas de entrega:
-
Forkear el presente repositorio y completar este archivo
README.mddonde lo pida, incluyendo capturas de pantalla. Luego enviar la URL del repo por mail. (Recomendado si está familiarizado con Git, Github y Markdown). -
Completar cada uno de los puntos solicitados en el presente documento en este archivo
.txty enviarlo por e-mail a cgiambruni@gmail.com en un archivozipcon las capturas de pantalla solicitadas y el archivocompose.ymlpor e-mail. El archivo zip debe llamarseAPELLIDO.NOMBRE.zip.
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
Tip
Consulte apuntes de docker build.
-
Para buildear la imágen usaremos el archivo
Dockerfileque está en el repo. Observe y analice el archivoDockerfile.# Usamos la imagen base de Alpine Linux FROM alpine:latest # Actualizamos los paquetes e instalamos Node.js y Yarn directamente desde los repositorios oficiales RUN apk add --no-cache nodejs yarn # Establecemos el directorio de trabajo WORKDIR /app # Copiamos los archivos del proyecto al contenedor COPY . . # Instalamos las dependencias del proyecto RUN yarn install --production # Exponemos el puerto de la aplicación (ejemplo: 3000) EXPOSE 3000 # Comando por defecto para ejecutar la aplicación CMD ["node", "src/index.js"]
ENTREGABLE:
- 1.1) Ejecute el comando correspondiente para buildear la imagen. Elija un nombre de imagen y un tag acorde.
# Escriba acá el comando utilizado - 1.2) ¿Qué espacio ocupa la imagen una vez creada?
# Espacio utilizado - 1.3) ¿Puede hacer algo para optimizar o mejorar la imagen?. Describa qué modificaciones puede hacer para optimizar la imagen.
# Describa que podría hacer para mejorar u optimizar la creación de la imágen.
Tip
Consulte apuntes sobre tags.
Una vez creada la imágen, debería ser capaz de correr la aplicación.
ENTREGABLE:
- 1.4) Ejecute un comando para poder correr la aplicación.
# Escriba acá el comando - 1.5) Explique el comando de la respuesta anterior y cada parámetro enviado.
# Escriba la explicación - 1.6) ¿Cómo puede saber si el contenedor está corriendo?
# Escriba acá el comando - 1.7) Adjunte una captura de pantalla con la aplicación funcionando con la URL utilizada para acceder. Reemplace la imágen siguiente por su captura de pantalla.

En esta parte 2, 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>
ENTREGABLE
- 2.1) Modifique el código fuente como se indicó anteriormente.
- 2.2) Ejecute los comando necesarios para que la aplicación tome los cambios. Realice un etiquetado (tag) coherente respecto a los cambios en la imágen.
La actualización del código recientemente realizada deja obsoleta la antigua versión.
ENTREGABLE
- 2.2) Elimine la imágen y el contenedor hecho en el punto anterior: Mostrar comandos utilizados.
# Escriba acá el comando utilizado - 2.3) ¿Como puede listar las imágenes para comprobar que se ha eliminado la imagen del punto anterior?
# Escriba acá el comando utilizado
Para compartir la imágen de la aplicación usaremos la registry de DockerHub.
Tip
De ser necesario, repase lo realizado en el Laboratorio 2.4.
ENTREGABLE
-
3.1) Comparta la URL de DockerHub para que pueda ser posible probar y descargar su imágen.
Important
Agregue un overview para el repositorio de Dockerhub con instrucciones para correr la imágen y todo lo que considere necesario para que un tercero pueda ejecutar la imágen.
Tip
Utilice el formato markdown para darle formato al overview.
La aplicación, hasta el momento carece de persistencia de datos, y si el contenedor se elimina los datos to-dos se pierden.
Los datos en esta APP se guardan en un archivo /etc/todos/todo.db.
ENTREGABLE
- 4.1) Escriba los comandos necesarios para persistir la base de datos. Decida que tipo de persistencia es la adecuada para su app (Bind mounts o volumes)
# Escriba el comando necesario
Tip
Repase volúmenes y persistencia de datos.
Hasta este punto, hemos deployado nuestra aplicación que corre en un único contenedor. A continuación agregaremos un segundo contenedor para que sea de base de datos basada en MySQL.
Recordemos que de manera predeterminada, los contenedores se ejecutan de forma aislada y "no ven" otros procesos o contenedores en la misma máquina. Por lo tanto debemos crear una red para que se comuniquen entre ellos.
Usaremos una imágen basada en MySQL. La imágen en cuestión será mysql:8.0. Para poder iniciar y tener cierta 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, usaremos las siguientes 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.
En la aplicación también es posible setear variables de entorno para parametrizar su funcionamiento. Utilizaremos las siguientes para especificar lo necesario para la conexión con la base de datos:
MYSQL_HOST: Hostname donde corre el servidor MySQL.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.
ENTREGABLE:
- 5.1) Crear una red para conexión entre los contenedores que servirá también para conectar a la aplicación.
# Escriba acá el comando utilizado - 5.2) Crear un nuevo volumen para persistir los datos de la base MySQL. El path donde se almacenan los datos en el contenedor MySQL es
/var/lib/mysql.# Escriba acá el comando utilizado - 5.3) Iniciar el contenedor de base de datos utilizando el comando
docker runy enviando las variables de entorno necesarias.# Escriba acá el comando utilizado - 5.4) Iniciar el contenedor de la aplicación utilizando el comando
docker runenviando las variables de entornos necesarias para la conexión con la base de datos.# Escriba acá el comando utilizado
Tip
Set environments variables (-e, --env) Docker Docs.
Si 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 3000
Important
Conectar ambos contenedores a la misma red. Utilice el parámetro --name o --network-alias para poder identificar el servidor de base de datos, de manera que el servidor de la app pueda establecer la conexión. La base de datos debe estar previamente iniciada.
Important
¿Algo no funciona? Pruebe realizar el troubleshooting de este documento
Llegando a este punto y habiendo completado cada punto ya tiene la información necesaria para volcarla en un archivo de Docker Compose para simplificar la ejecución de los contenedores.
Tip
Puede ser de utilidad el sitio composerize o con una herramienta de IA de su preferencia.
Note
Teniendo en cuenta que la aplicación necesitará que la base de datos esté previamente iniciada, utilice los elementos de compose para explicitar dicha dependencia.
Con el siguiente comando debería ser capaz de correr la aplicación junto con la base de datos
docker compose up -d
Cambie la imágen del docker compose para que tome como origen la imágen que ha subido a Docker Hub con su usuario.
ENTREGABLE
- 6.1) Suba el archivo docker compose en este repositorio en la carpeta raíz o adjunte en el
.zip. El compose debe realizar todo lo necesario para que la aplicación levante con solo ejecutardocker compose up. Para probar si realmente funciona correctamente, puede probar su compose en Play With Docker


