4. Dockerfiles y construcción de imágenes
Uno de los pilares fundamentales de Docker es la posibilidad de definir entornos reproducibles mediante archivos Dockerfile. Estas instrucciones permiten construir imágenes personalizadas desde una base determinada.
¿Qué es un Dockerfile?
Un Dockerfile es un archivo de texto que contiene las instrucciones necesarias para construir una imagen de Docker. Se utiliza con el comando docker build.
Ejemplo mínimo:
FROM alpine:latest
RUN apk add --no-cache curl
CMD ["curl", "https://example.com"]
Este archivo:
- Parte de la imagen
alpine - Instala
curl - Define el comando por defecto al ejecutar un contenedor
Instrucciones comunes en un Dockerfile
| Instrucción | Descripción |
|---|---|
FROM |
Imagen base |
RUN |
Ejecuta comandos en la construcción |
CMD |
Comando por defecto del contenedor |
COPY |
Copia archivos del host a la imagen |
ADD |
Similar a COPY pero acepta URLs y extrae archivos comprimidos |
ENV |
Define variables de entorno |
EXPOSE |
Documenta puertos expuestos |
WORKDIR |
Define el directorio de trabajo |
ENTRYPOINT |
Comando principal, más estricto que CMD |
Construcción de una imagen personalizada
docker build -t mi-imagen-personalizada .
Esto busca un Dockerfile en el directorio actual y construye la imagen con la etiqueta especificada.
Buenas prácticas
- Usa imágenes base ligeras (
alpine,debian-slim) - Evita capas innecesarias combinando comandos con
&& - Limpia cachés (
apt-get clean,rm -rf /var/lib/apt/lists/*, etc.) - Fija versiones (de paquetes, de imágenes base)
Ejemplo optimizado:
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "main.py"]
Multi-stage builds
Permiten construir una imagen en varias etapas para reducir el tamaño final. Muy útil en compilaciones con herramientas como Node.js, Go, Rust, etc.
FROM node:20 as build
WORKDIR /app
COPY . .
RUN npm install && npm run build
FROM nginx:alpine
COPY --from=build /app/dist /usr/share/nginx/html
Variables y contexto
- Puedes usar
ARGyENVpara parametrizar comportamientos. - El contexto de construcción es el directorio desde el que se ejecuta
docker build. - Ten cuidado con
.dockerignorepara evitar copiar archivos innecesarios (como.git,node_modules, etc.)