Construí imágenes, desplegá sitios web en contenedores, orquestá servicios con Docker Compose y publicá tu imagen en Docker Hub. Un recorrido práctico completo, paso a paso.
Al finalizar este trabajo práctico, el/la estudiante deberá ser capaz de:
Comprender los fundamentos de la virtualización a nivel de sistema operativo y su diferencia con la virtualización tradicional.
Instalar y configurar Docker en un entorno Linux y validar su correcto funcionamiento.
Crear imágenes a partir de un Dockerfile y desplegar un sitio web estático dentro de un contenedor.
Manejar el ciclo de vida completo de los contenedores: crear, ejecutar, detener y eliminar.
Utilizar volúmenes para la persistencia de datos y mapeo de puertos para exponer servicios.
Orquestar múltiples contenedores mediante docker-compose y publicar imágenes en Docker Hub.
Docker es una plataforma de virtualización basada en contenedores, que permite empaquetar una aplicación junto con todas sus dependencias en una unidad estandarizada. A diferencia de las máquinas virtuales, los contenedores comparten el kernel del sistema operativo anfitrión, lo que los hace mucho más livianos y rápidos de iniciar.
Plantilla inmutable que contiene el sistema de archivos y la configuración necesaria para ejecutar una aplicación.
Instancia en ejecución de una imagen. Comparte el kernel del host pero aísla procesos, redes y archivos.
Archivo de texto con instrucciones (FROM, COPY, EXPOSE, etc.) que definen cómo construir una imagen.
Repositorio público de imágenes, donde se pueden subir (push) y descargar (pull) imágenes.
Mecanismo de persistencia de datos fuera del ciclo de vida del contenedor.
Mecanismo de comunicación entre contenedores, permitiendo que los servicios se conecten entre sí.
docker --version debe funcionar).docker compose version).El trabajo práctico se divide en cinco partes (A a E), que avanzan desde el primer contacto con Docker hasta la publicación de la imagen en Docker Hub.
Verificar la instalación y los primeros comandos:
Verificar la instalación ejecutando docker --version y docker run hello-world. Capturar la salida y explicar qué ocurrió internamente (descarga de imagen, creación de contenedor, ejecución, finalización).
Descargar y ejecutar Nginx mapeando el puerto 8080 del host al 80 del contenedor:
Verificar desde el navegador (o con curl) que el servidor responde en http://localhost:8080.
Listar contenedores con docker ps y docker ps -a, inspeccionar con docker inspect nginx-demo y responder: ¿qué dirección IP interna tiene? ¿qué imagen base utiliza? ¿qué proceso corre como PID 1?
Crear una carpeta de proyecto con esta estructura mínima:
Diseñar una página index.html simple que incluya: nombre del alumno, una breve descripción de qué es Docker y un estilo mínimo aplicado desde style.css.
Escribir un Dockerfile con una imagen base liviana de Nginx y copiar el contenido del sitio:
Construir la imagen con un nombre y tag propios, ejecutar un contenedor mapeando un puerto distinto (por ejemplo 8081) y verificar desde el navegador.
Modificar el index.html sin reconstruir la imagen usando un volumen bind mount, y demostrar que el cambio se refleja en caliente:
Explicar en el informe la diferencia entre el enfoque bind mount y el de contenido copiado dentro de la imagen (baked).
Convertir el despliegue a un docker-compose.yml que: levante el servicio web, mapee el puerto 8090 al 80, monte el volumen persistente e incluya un segundo servicio simple (otro Nginx de "mantenimiento", o adminer/whoami para practicar la red).
Levantar el stack con docker compose up -d y verificar que ambos servicios respondan.
Explicar con docker network ls y docker network inspect cómo se comunican los servicios entre sí.
Reducir el tamaño de la imagen usando una base alpine (si no se usó desde el principio) y comparar tamaños con docker images.
Agregar un archivo .dockerignore justificando su utilidad.
Limpiar el entorno al finalizar: docker stop, docker rm, docker rmi, docker volume prune — documentando los comandos usados.
Crear una cuenta en Docker Hub.
Iniciar sesión desde la terminal con docker login.
Etiquetar la imagen con el formato usuario/nombre:tag y subirla con docker push.
Verificar la publicación en https://hub.docker.com/r/<usuario-dockerhub>/<apellido>-web y compartir con el profesor el enlace y el comando exacto que debe ejecutar:
Como prueba de punta a punta, eliminar la imagen local con docker rmi y volver a descargarla solo con docker pull, confirmando que el sitio funciona igual. Documentar con capturas.
Informe en PDF que incluya:
Se debe entregar el código fuente completo (carpeta del proyecto comprimida en .zip o enlace a un repositorio Git).
Enviar el informe en PDF y el código fuente (comprimido en .zip o enlace al repositorio Git) por correo electrónico a:
coordi.tecnicatura@uccuyo.edu.ar
Colocar en el asunto del correo: [SO] TP Contenedores — Apellido, Nombre.
| Criterio | Puntos |
|---|---|
| Parte A completa y respondida correctamente | 10 |
| Dockerfile funcional y bien construido (Parte B) | 20 |
| Sitio web desplegado correctamente con volumen (Parte B.7) | 15 |
| Docker Compose funcional con dos servicios (Parte C) | 15 |
| Buenas prácticas: .dockerignore, imagen liviana, limpieza final (Parte D) | 10 |
| Publicación en Docker Hub y verificación de pull + run por parte del profesor (Parte E) | 20 |
| Informe: claridad, capturas, conclusiones | 10 |
| Total | 100 |
Guías, referencia de comandos y ejemplos para todo el ciclo de Docker.
Documentación de la imagen base de Nginx en Docker Hub.
Recomendaciones oficiales para escribir Dockerfiles eficientes y seguros.
Empezá por la Parte A, verificá la instalación con docker run hello-world
y avanzá hasta publicar tu propia imagen en Docker Hub.