Un Dockerfile es un archivo de texto plano, llamado (por lo general) simplemente Dockerfile que contiene una serie de instrucciones que se ejecutan de manera secuencial para construir una imagen de Docker. Cada línea del Dockerfile corresponde a una instrucción específica que define cómo se debe configurar el entorno del contenedor que se creará a partir de la imagen.
Dockerfile es una parte fundamental del ecosistema Docker. Junto con Docker Hub y las imágenes preexistentes, proporciona las herramientas necesarias para la construcción y despliegue de aplicaciones en contenedores.
Con este archivo Dockerfile podríamos correr una app simple escrita en Nodejs.
# Usa la imagen oficial de Node.js como base
FROM node:14
# Establece el directorio de trabajo en el contenedor
WORKDIR /app
# Copia el archivo package.json y package-lock.json (si existe)
COPY package*.json ./
# Instala las dependencias del proyecto
RUN npm install
# Copia el resto del código de la aplicación al contenedor
COPY . .
# Expone el puerto en el que la aplicación estará escuchando
EXPOSE 3000
# Comando para ejecutar la aplicación
CMD ["npm", "start"]
Un Dockerfile se compone por instrucciones (FROM, COPY, etc). Cada línea formará una capa de la imágen docker. Descargar ejemplo
Un Dockerfile se compone de varias instrucciones que se ejecutan en secuencia para construir una imagen de Docker. A continuación, las mas comunes:
# Ejemplo de FROM
FROM ubuntu:24.04
# Ejemplo de WORKDIR
WORKDIR /usr/src/app
Continúa...
# Ejemplo de RUN
RUN apt-get update
RUN apt-get install -y curl
# Ejemplo de ENV
ENV NODE_ENV=production
Continúa...
COPY . /usr/src/app
ADD https://ejemplo.com/archivo.tar.gz /usr/src/app/
docker run, estos sobrescriben el CMD.
CMD ["node", "app.js"]
docker run, sino que los parámetros se anexan como argumentos.Listado completo de instrucciones en Dockerfile reference.
Las capas de imágenes de Docker desempeñan un papel fundamental en la optimización de los procesos de buildeo de imágenes, donde cada instrucción en un Dockerfile representa una capa distinta dentro de la imagen. Comprender cómo funcionan estas capas y su impacto en el almacenamiento en caché de Docker puede mejorar significativamente la eficiencia de la construcción de imágenes de Docker.
Docker utiliza un sistema de caché para acelerar la construcción de imágenes. Si una capa no ha cambiado, Docker reutiliza la capa en lugar de reconstruirla. Esto hace que el orden de las instrucciones sea muy importante; cambios en las primeras instrucciones pueden invalidar la caché de todas las capas siguientes.
Docker Docs: Build Cache | Docker Docs: Build Cache Invalidation
RUN apt-get update
RUN apt install -y curl
RUN apt install -y vim
RUN apt-get update && apt-get install -y curl vim
Tener en cuenta que NO siempre es mejor u optimizar reducir la cantidad de capas. Hay diversas formas de optimizar la caché de construcción de Docker, puede ver un listado mas completo en la doc al pie de la presentación:
La construcción de imágenes es un proceso clave en el uso de Docker, ya que las imágenes son el punto de partida para crear y ejecutar contenedores.
El comando principal utilizado para construir imágenes en Docker esdocker build. Este comando lee las instrucciones de un Dockerfile y produce una imagen a partir de ellas.
docker build [OPTIONS] PATH
OPTIONS: Opciones adicionales que pueden personalizar el proceso de construcción.PATH: La ubicación del contexto de construcción, es decir, el directorio donde se encuentra el Dockerfile y los archivos necesarios para la construcción.
Supongamos que tenemos un Dockerfile en el directorio actual y queremos construir una imagen llamada mi-app.
docker build -t mi-app .
-t mi-app: asigna un nombre y una etiqueta (tag) a la imagen creada..: indica que el contexto de construcción (context build) es el directorio actual.Al construir imágenes, es buena práctica usar etiquetas para versionarlas. Esto facilita la gestión y despliegue de diferentes versiones de tu aplicación. Una mejor opción sería:
docker build -t mi-app:v0.1 .
docker build -t mi-app:latest .
-f ARCHIVO: Especifica un Dockerfile diferente al dockerfile estándar.
docker build -f Dockerfile.dev -t mi-app-dev .
--no-cache: Evita el uso de la caché en la construcción de la imagen. Útil cuando necesitas asegurarte de que todas las capas se reconstruyan desde cero.
docker build --no-cache -t mi-aplicacion:v0.1 .
.dockerignore . Similar al .gitignore que evita que se copien dichos archivos o directorios al contenedor. [2]
# Etapa 1: Construcción
FROM node:14 AS build
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
# Etapa 2: Producción
FROM node:14-alpine AS production
WORKDIR /app
COPY --from=build /app /app
# Exponer el puerto y definir el comando de inicio
EXPOSE 3000
CMD ["npm", "start"]
Descargar ejemplo |
Docker Docs: Multi-stage