Ir al contenido

Laboratorio: tu primer contenedor

Duración45 minutos
NivelBásico
RequisitosDocker Desktop o Docker Engine instalado; una terminal
CostoNinguno: todo se ejecuta en tu equipo
  • Escribir un Dockerfile y 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).

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 --> R
Del Dockerfile al contenedor
Archivos del laboratorioDockerfile, sitio de ejemplo y README con los comandos.ZIP · 1 KB
  • Directoriolaboratorio-contenedor/
    • Dockerfile
    • README.md
    • Directoriositio/
      • index.html
  1. Verifica la instalación. Descomprime el archivo, abre una terminal en la carpeta laboratorio-contenedor y comprueba que Docker responde:

    Ventana de terminal
    docker version

    Si ves un error de conexión con el daemon, abre Docker Desktop y espera a que termine de iniciar.

  2. Lee el Dockerfile. Cada instrucción crea una capa de la imagen:

    Dockerfile
    FROM nginx:1.27-alpine
    COPY sitio/ /usr/share/nginx/html/
    EXPOSE 80

    FROM elige la imagen base, COPY añade tus archivos y EXPOSE documenta el puerto en el que escucha el servidor.

  3. 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
  4. 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.0

    Abre http://localhost:8080: deberías ver el mensaje de bienvenida.

  5. Inspecciona el contenedor en ejecución:

    Ventana de terminal
    docker ps # contenedores activos
    docker logs mi-sitio # registros de nginx: verás tus peticiones
    docker exec -it mi-sitio sh # abre una terminal dentro (sal con exit)
  6. Limpia. Detén el contenedor; como lo iniciaste con --rm, se elimina automáticamente:

    Ventana de terminal
    docker stop mi-sitio
RetoPublica una nueva versiónbásico⏱ 10 min

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
Ventana de terminal
docker build -t mi-sitio:1.1 .
docker run --rm -d -p 8080:80 --name sitio-v1 mi-sitio:1.0
docker run --rm -d -p 8081:80 --name sitio-v2 mi-sitio:1.1

Sí: 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.

Reto¿Cuánto pesa tu imagen?intermedio⏱ 15 min

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.

AutoevaluaciónEjecutas dos veces docker run a partir de la misma imagen. ¿Qué obtienes?

AutoevaluaciónEn -p 8080:80, ¿qué representa el número 80?