Trabajo Práctico · Contenedores con Docker

Virtualización con contenedores Materia: Sistemas Operativos — Tecnicatura Universitaria en Desarrollo de Software

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.

¿Qué vas a lograr?

Al finalizar este trabajo práctico, el/la estudiante deberá ser capaz de:

Co

Conceptos y virtualización

Comprender los fundamentos de la virtualización a nivel de sistema operativo y su diferencia con la virtualización tradicional.

In

Instalar y configurar Docker

Instalar y configurar Docker en un entorno Linux y validar su correcto funcionamiento.

Im

Construir imágenes propias

Crear imágenes a partir de un Dockerfile y desplegar un sitio web estático dentro de un contenedor.

Ci

Gestionar contenedores

Manejar el ciclo de vida completo de los contenedores: crear, ejecutar, detener y eliminar.

Vo

Volúmenes y puertos

Utilizar volúmenes para la persistencia de datos y mapeo de puertos para exponer servicios.

Or

Orquestar con Compose

Orquestar múltiples contenedores mediante docker-compose y publicar imágenes en Docker Hub.

Repaso de conceptos clave

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.

Im

Imagen

Plantilla inmutable que contiene el sistema de archivos y la configuración necesaria para ejecutar una aplicación.

Co

Contenedor

Instancia en ejecución de una imagen. Comparte el kernel del host pero aísla procesos, redes y archivos.

DF

Dockerfile

Archivo de texto con instrucciones (FROM, COPY, EXPOSE, etc.) que definen cómo construir una imagen.

DH

Docker Hub

Repositorio público de imágenes, donde se pueden subir (push) y descargar (pull) imágenes.

Vo

Volumen

Mecanismo de persistencia de datos fuera del ciclo de vida del contenedor.

Ne

Red (network)

Mecanismo de comunicación entre contenedores, permitiendo que los servicios se conecten entre sí.

Requisitos previos

  • Máquina con Linux (puede ser una VM) o WSL2 en Windows.
  • Docker Engine instalado (docker --version debe funcionar).
  • Docker Compose instalado (docker compose version).
  • Editor de texto (VS Code, nano, vim, etc.).
  • Cuenta gratuita en Docker Hub (opcional, para la parte final).

Las cinco partes del trabajo

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.

A

Primer contacto con Docker

Individual · Base

Verificar la instalación y los primeros comandos:

1

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:

docker run -d -p 8080:80 --name nginx-demo nginx
2

Verificar desde el navegador (o con curl) que el servidor responde en http://localhost:8080.

3

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?

B

Construcción de una imagen propia

Núcleo del TP · Desplegar un sitio web estático

Crear una carpeta de proyecto con esta estructura mínima:

# proyecto-docker/
├── Dockerfile
└── site/
    ├── index.html
    └── style.css
    (opcional: imágenes, JS)
1

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.

2

Escribir un Dockerfile con una imagen base liviana de Nginx y copiar el contenido del sitio:

# Dockerfile
FROM nginx:alpine
COPY site/ /usr/share/nginx/html/
EXPOSE 80
3

Construir la imagen con un nombre y tag propios, ejecutar un contenedor mapeando un puerto distinto (por ejemplo 8081) y verificar desde el navegador.

docker build -t <apellido>-web:v1 .
docker run -d -p 8081:80 --name mi-sitio <apellido>-web:v1
4

Modificar el index.html sin reconstruir la imagen usando un volumen bind mount, y demostrar que el cambio se refleja en caliente:

docker run -d -p 8082:80 -v $(pwd)/site:/usr/share/nginx/html --name mi-sitio-vol <apellido>-web:v1
5

Explicar en el informe la diferencia entre el enfoque bind mount y el de contenido copiado dentro de la imagen (baked).

C

Orquestación básica con Docker Compose

Múltiples contenedores
1

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).

2

Levantar el stack con docker compose up -d y verificar que ambos servicios respondan.

3

Explicar con docker network ls y docker network inspect cómo se comunican los servicios entre sí.

D

Cierre y buenas prácticas

Optimización y limpieza
1

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.

2

Agregar un archivo .dockerignore justificando su utilidad.

3

Limpiar el entorno al finalizar: docker stop, docker rm, docker rmi, docker volume prune — documentando los comandos usados.

E

Publicación de la imagen en Docker Hub

Obligatorio · Para que el profesor pueda descargarla y ejecutarla
1

Crear una cuenta en Docker Hub.

2

Iniciar sesión desde la terminal con docker login.

3

Etiquetar la imagen con el formato usuario/nombre:tag y subirla con docker push.

docker tag <apellido>-web:v1 <usuario-dockerhub>/<apellido>-web:v1
docker push <usuario-dockerhub>/<apellido>-web:v1
4

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:

docker pull <usuario-dockerhub>/<apellido>-web:v1
docker run -d -p 8080:80 --name <apellido>-web-check <usuario-dockerhub>/<apellido>-web:v1
5

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.

Qué tenés que entregar

Informe en PDF que incluya:

Contenido del informe

  • Carátula con nombre y datos del alumno.
  • Respuestas a las preguntas conceptuales de la Parte A.
  • Código completo de Dockerfile, docker-compose.yml, index.html y style.css.
  • Capturas de cada paso relevante (build, run, navegador, docker ps, docker images).
  • Explicación (mínimo 5 líneas) de la diferencia entre volumen bind mount y contenido "horneado" (baked) en la imagen.

Publicación y cierre

  • Enlace público al repositorio en Docker Hub, con los comandos exactos que el profesor debe usar (docker pull + docker run), el puerto y la URL donde se visualizará el sitio.
  • Conclusiones personales: dificultades encontradas y qué se aprendió.

Además del informe

Se debe entregar el código fuente completo (carpeta del proyecto comprimida en .zip o enlace a un repositorio Git).

📧 Entrega por mail

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.

Rúbrica orientativa

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

Material de apoyo

Do

Documentación oficial

Guías, referencia de comandos y ejemplos para todo el ciclo de Docker.

  • docs.docker.com
Ng

Imagen oficial de Nginx

Documentación de la imagen base de Nginx en Docker Hub.

  • hub.docker.com/_/nginx
BP

Best practices de Dockerfile

Recomendaciones oficiales para escribir Dockerfiles eficientes y seguros.

  • docs.docker.com/build/building/best-practices

Recomendaciones para la cátedra (opcional, no entregable)

  • Para aumentar la dificultad: docker-compose.override.yml para entornos dev/prod, HEALTHCHECK, límites de recursos (--memory, --cpus) verificados con docker stats, automatización del build y push con CI.
  • Para bajar la dificultad: omitir la Parte C (Compose) y dejarla como punto extra, manteniendo la Parte E como obligatoria.
  • Se recomienda que la cátedra descargue y ejecute al menos una imagen por alumno (docker pull + docker run) para validar la Parte E. Cada alumno debe usar un nombre de repositorio que permita identificarlo (apellido o legajo).

Manos a la obra

Empezá por la Parte A, verificá la instalación con docker run hello-world y avanzá hasta publicar tu propia imagen en Docker Hub.

Ir a la consigna