Desafío de Construcción Multi-etapa en Docker

DockerBeginner
Practicar Ahora

Introducción

La construcción multi-etapa (Multi-stage Build) es una característica de Docker que permite organizar un Dockerfile en varias fases para generar una imagen final optimizada. En este desafío, pondrás en práctica esta técnica para reducir el tamaño de tus imágenes y mejorar la eficiencia de tus contenedores.

Este es un Desafío (Challenge), a diferencia de un Laboratorio Guiado, aquí deberás completar las tareas de forma independiente en lugar de seguir instrucciones paso a paso. Los desafíos suelen tener un nivel de dificultad mayor. Si te quedas atascado, puedes consultar con Labby o revisar la solución propuesta. Los datos históricos muestran que este es un desafío de nivel principiante con una tasa de aprobación del 100% y una valoración positiva del 100% por parte de los usuarios.

Crear un Dockerfile con construcción multi-etapa

En esta sección, diseñarás un Dockerfile que implemente el flujo de trabajo multi-etapa.

Tareas

  • Crear un nuevo Dockerfile utilizando dos etapas. La primera etapa debe encargarse de compilar la aplicación instalando las dependencias necesarias y ejecutando el script de construcción. La segunda etapa generará la imagen final copiando únicamente el código compilado de la fase anterior, instalando solo las dependencias de producción y exponiendo el puerto correspondiente.

Ejemplo

A continuación, se muestra una referencia de los pasos a seguir:

  1. Crea un nuevo directorio llamado myapp y accede a él.

    mkdir myapp
    cd myapp
  2. Descarga el código fuente de NodeJS desde https://github.com/labex-labs/nodejs-example.git.

    git clone https://github.com/labex-labs/nodejs-example.git

    Mueve el código descargado a la raíz del directorio myapp.

    mv nodejs-example/* .
    rm -rf nodejs-example
  3. Crea un archivo llamado Dockerfile en el directorio myapp con el siguiente contenido:

    ## Stage 1: Build the application
    FROM node:14-alpine AS base
    WORKDIR /app
    COPY . ./
    RUN npm install
    
    ## Stage 2: Create the final image
    FROM node:14-alpine
    WORKDIR /app
    COPY --from=base /app/ .
    EXPOSE 3000
    CMD [ "npm", "start" ]

Requisitos

Para completar este desafío, asegúrate de cumplir lo siguiente:

  • El directorio myapp debe estar ubicado en /home/labex/project.
  • El código fuente de NodeJS debe estar dentro de myapp.
  • El Dockerfile en myapp debe contener la estructura técnica especificada.
✨ Revisar Solución y Practicar

Construir la imagen de Docker

En este paso, procederás a generar la imagen a partir del Dockerfile que acabas de crear.

Tareas

  • Construir una nueva imagen con el nombre myapp.

Ejemplo

Este es el resultado esperado de tus acciones:

  1. Utiliza el comando docker build para generar la imagen etiquetada como myapp.

    docker build -t myapp .
  2. Confirma que la imagen se ha creado correctamente listando las imágenes disponibles.

Requisitos

Para superar esta etapa:

  • Debes ejecutar el comando de construcción dentro de /home/labex/project/myapp.
  • La imagen debe llamarse exactamente myapp.
✨ Revisar Solución y Practicar

Ejecutar el contenedor de Docker

En este paso final, pondrás en funcionamiento un contenedor basado en la imagen que construiste.

Tareas

  • Iniciar un contenedor a partir de la imagen myapp. El contenedor debe mapear el puerto interno 3000 al puerto 3030 del host para que puedas acceder a la aplicación desde el navegador.

Ejemplo

A continuación, un ejemplo de la ejecución:

  1. Lanza un nuevo contenedor llamado my-app.

    docker run --name my-app -p 3030:3000 myapp
  2. Abre tu navegador y dirígete a http://localhost:3030 para comprobar que la aplicación responde correctamente.

Requisitos

Para completar el desafío:

  • El contenedor debe tener el nombre my-app.
  • El mapeo de puertos debe ser estrictamente 3030 (host) a 3000 (contenedor).
✨ Revisar Solución y Practicar

Resumen

¡Enhorabuena! En este desafío has aprendido a implementar la construcción multi-etapa en Docker. Al separar el entorno de compilación del entorno de ejecución dentro de un mismo Dockerfile, has logrado reducir drásticamente el tamaño de la imagen final y mejorar la seguridad al no incluir dependencias de desarrollo innecesarias. Ahora puedes aplicar estos conocimientos para optimizar tus propios proyectos de contenedores.