Laboratorio: tu primer contenedor
| Duración | 45 minutos |
| Nivel | Básico |
| Requisitos | Docker Desktop o Docker Engine instalado; una terminal |
| Costo | Ninguno: todo se ejecuta en tu equipo |
Objetivos
Sección titulada «Objetivos»- Escribir un
Dockerfiley construir una imagen a partir de él. - Ejecutar un contenedor y publicar uno de sus puertos.
- Distinguir imagen (plantilla inmutable) de contenedor (instancia en ejecución).
Conceptos en un minuto
Sección titulada «Conceptos en un minuto»Una imagen es un paquete de solo lectura con todo lo necesario para ejecutar una aplicación: sistema de archivos base, dependencias y configuración. Un contenedor es un proceso aislado que se ejecuta a partir de una imagen. De una misma imagen pueden nacer muchos contenedores, igual que de una clase nacen muchos objetos.
flowchart LR
A[Dockerfile] -- docker build --> B[(Imagen<br/>mi-sitio:1.0)]
B -- docker run --> C[Contenedor 1]
B -- docker run --> D[Contenedor 2]
R[(Registro<br/>Docker Hub)] -- docker pull --> B
B -- docker push --> RMaterial
Sección titulada «Material»Directoriolaboratorio-contenedor/
- Dockerfile
- README.md
Directoriositio/
- index.html
Procedimiento
Sección titulada «Procedimiento»-
Verifica la instalación. Descomprime el archivo, abre una terminal en la carpeta
laboratorio-contenedory comprueba que Docker responde:Ventana de terminal docker versionSi ves un error de conexión con el daemon, abre Docker Desktop y espera a que termine de iniciar.
-
Lee el Dockerfile. Cada instrucción crea una capa de la imagen:
Dockerfile FROM nginx:1.27-alpineCOPY sitio/ /usr/share/nginx/html/EXPOSE 80FROMelige la imagen base,COPYañade tus archivos yEXPOSEdocumenta el puerto en el que escucha el servidor. -
Construye la imagen y dale un nombre con etiqueta de versión:
Ventana de terminal docker build -t mi-sitio:1.0 .docker image ls mi-sitio -
Ejecuta un contenedor publicando el puerto 80 del contenedor en el 8080 de tu equipo:
Ventana de terminal docker run --rm -d -p 8080:80 --name mi-sitio mi-sitio:1.0Ventana de terminal docker run --rm -d -p 8080:80 --name mi-sitio mi-sitio:1.0Abre http://localhost:8080: deberías ver el mensaje de bienvenida.
-
Inspecciona el contenedor en ejecución:
Ventana de terminal docker ps # contenedores activosdocker logs mi-sitio # registros de nginx: verás tus peticionesdocker exec -it mi-sitio sh # abre una terminal dentro (sal con exit) -
Limpia. Detén el contenedor; como lo iniciaste con
--rm, se elimina automáticamente:Ventana de terminal docker stop mi-sitio
Modifica sitio/index.html (por ejemplo, añade tu nombre), construye la imagen con la etiqueta mi-sitio:1.1 y ejecútala en el puerto 8081 sin detener la versión 1.0 en el 8080. ¿Puedes ver ambas versiones a la vez?
Ver solución
docker build -t mi-sitio:1.1 .docker run --rm -d -p 8080:80 --name sitio-v1 mi-sitio:1.0docker run --rm -d -p 8081:80 --name sitio-v2 mi-sitio:1.1Sí: son dos contenedores independientes creados a partir de dos imágenes distintas. Las imágenes son inmutables, así que la 1.0 sigue intacta. Esta es la base de despliegues como blue-green, donde la versión nueva se levanta junto a la anterior antes de redirigir el tráfico.
Ejecuta docker image ls y compara el tamaño de mi-sitio:1.0 con el de nginx:1.27 (sin -alpine). ¿A qué se debe la diferencia y por qué importa en la nube?
Ver solución
La variante alpine parte de una distribución Linux mínima (unos pocos MB), mientras que la imagen estándar se basa en Debian. Imágenes más pequeñas se descargan más rápido (arranques y escalado más ágiles), ocupan menos almacenamiento en el registro (menor costo) y contienen menos paquetes, lo que reduce la superficie de vulnerabilidades.