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.
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
Dockerfileutilizando 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:
Crea un nuevo directorio llamado
myappy accede a él.mkdir myapp cd myappDescarga el código fuente de NodeJS desde
https://github.com/labex-labs/nodejs-example.git.git clone https://github.com/labex-labs/nodejs-example.gitMueve el código descargado a la raíz del directorio
myapp.mv nodejs-example/* . rm -rf nodejs-exampleCrea un archivo llamado
Dockerfileen el directoriomyappcon 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
myappdebe estar ubicado en/home/labex/project. - El código fuente de NodeJS debe estar dentro de
myapp. - El
Dockerfileenmyappdebe contener la estructura técnica especificada.
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:
Utiliza el comando
docker buildpara generar la imagen etiquetada comomyapp.docker build -t myapp .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.
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 interno3000al puerto3030del host para que puedas acceder a la aplicación desde el navegador.
Ejemplo
A continuación, un ejemplo de la ejecución:
Lanza un nuevo contenedor llamado
my-app.docker run --name my-app -p 3030:3000 myappAbre tu navegador y dirígete a
http://localhost:3030para 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) a3000(contenedor).
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.



