Docker ha transformado la entrega de software, pero el uso de contenedores en producción requiere disciplina. Las imágenes grandes aumentan los costos de almacenamiento y los tiempos de implementación, mientras que las vulnerabilidades pueden exponer su entorno a ataques. Esta guía presenta mejores prácticas que garantizan imágenes ligeras, seguras y versionables.
##Buenas prácticas esenciales
- Compilaciones de varias etapas, compila el código en una etapa y copia solo los artefactos finales.
- Imágenes base minimalistas, prefiera
alpineodistrolesspara reducir la superficie de ataque. - Nunca incluyas credenciales,
.envarchivos, claves o tokens nunca deben copiarse en la imagen. - Ejecutar como usuario no root, crear un usuario dedicado y configurar el contenedor para usarlo.
- Versión sin
latest, use etiquetas semánticas (v1.2.3) para trazabilidad y reversión.
Ejemplo sencillo de Dockerfile de varias etapas (Node.js), 9 líneas
FROM node:20-alpine AS builder WORKDIR /app COPY package*.json ./ RUN npm ci --only=production COPY . . RUN npm run build # gera artefatos estáticos FROM gcr.io/distroless/nodejs20 WORKDIR /app COPY /app/dist ./dist COPY /app/node_modules ./node_modules USER nonroot EXPOSE 3000 CMD ["dist/index.js"]
Lista de verificación de seguridad de imágenes
- Escanear vulnerabilidades con Trivy, Clair o Snyk.
- Comprueba las capas innecesarias (
docker history). - [] Definir usuario no root en Dockerfile.
- Eliminar archivos temporales (
npm cache clean --force). - [] Firme la imagen usando Docker Content Trust para garantizar la integridad.
Estrategia de versiones
| Etiqueta | Cuándo utilizar |
|---|---|
v1.2.3 | Lanzamiento estable, compatible con semver. |
v1.2.3-rc.1 | Liberar candidato para pruebas. |
v1.2.3-sha.<commit> | Construcción automatizada para CI, rastreable. |
Integración CI/CD simplificada (Acciones de GitHub), 7 líneas
name: Build & Push Docker Image on: push: branches: [main] jobs: docker: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Build image run: docker build -t myapp:$ . - name: Login to Docker Hub uses: docker/login-action@v2 with: username: $ password: $ - name: Push image run: docker push myapp:$
Conclusión
Al aplicar estas prácticas se obtienen imágenes más pequeñas, más seguras y fácilmente versionables, reduciendo los costos operativos y mitigando el riesgo de vulnerabilidades en producción.
¿Qué estrategias Docker ha adoptado ya? ¡Comparte en los comentarios!
Lea también
- Kubernetes en producción: lo que nadie te dice antes de migrar
- CI/CD moderno: el arte de implementar con confianza
- Trabajadores de Cloudflare en producción: qué cambia después de hello world
- D1 en producción: rendimiento, límites y lo que no escala por sí solo
- Objetos duraderos en producción: cómo será el billete y los límites que sorprenden
- Implementación de indicadores de funciones e implementaciones graduales en producción
