Buenas Prácticas al Escribir Dockerfiles
PROMO DigitalOcean
Antes de comenzar, quería contarles que hay una promoción en DigitalOcean donde te dan un crédito de USD 100.00 durante 60 días para que puedas probar los servicios que este Proveedor Cloud ofrece. Lo único que tienes que hacer es suscribirte a DigitalOcean con el siguiente botón:
O a través del siguiente enlace: https://bit.ly/digitalocean-itsm
En este artículo les voy a hablar de algunos consejos y/o buenas prácticas al momento de escribir Dockerfiles y, de esta manera, evitar problemas de seguridad y optimizar la construcción en nuestras imágenes.
Imágenes root-less
Comenzamos en materia de seguridad y es que recordemos, que a menos que indiquemos lo contrario, los contenedores Docker se ejecutan bajo usuario root, cosa que es muy peligrosa, ya que si un atacante logra comprometer un contenedor, puede tomar control del host. Es por ello que debes agregar usuarios cuando construyas imágenes Docker y así evitar que los contenedores se ejecuten como usuario root:
|
|
COPY vs. ADD
De preferencia usa COPY en lugar de ADD cuando copies archivos desde el host hacia la imagen. Utiliza ADD solamente cuando:
- Descargues archivos desde una ubicación remota.
- Extraes un archivo comprimido hacia el destino.
|
|
Combina Comandos
Combina comandos para reducir al mínimo el número de capas que contendrá la imagen:
|
|
Siempre que sea posible, apoyate del backslash ( \ ) para mejorar la lectura cuando se están instalando muchos paquetes:
|
|
Cachea Dependencias
Cachea paquetes de Python en el host y móntalos a un volumen (o en su defecto, usa BuildKit):
|
|
Limits y Reservations
Limita el uso de CPU y Memoria de tus contenedores para que no sobreconsuman los recursos del host (muy apreciado en aplicaciones Java) y que los demás contenedores en ejecución puedan funcionar de manera normal.
En la CLI:
|
|
En Docker Compose:
|
|
Escaneo de Imágenes
Escanea regularmente o cada vez que construyas una imagen, tales como: Synk, Trivy o Anchore, lo que te permitirá hacer chequeo de vulnerabilidades e informarte de malas prácticas al escribir Dockerfiles. Además te recomiendo hadolint para validar la sintaxis en tus Dockerfiles.
Firma de Imágenes
Es buena práctica firmar y verificar tus imágenes Docker para prevenir ejecutar imágenes de dudosa procedencia o que hayan sido corrompidos. Para esto agregamos la siguiente variable de entorno:
|
|
Multi-stage Builds
Utiliza multi-stage builds, te va a permitir reducir drasticamente el tamaño de la imagen final de tu aplicación, sin tener que reducir el número de capas intermediarias y archivos.
Utilizaríamos entonces una imagen con todas las dependencias que necesitaramos para poder compilar el proyecto y otra imagen mínima para copiar el ejecutable/componentes de aplicación.
El siguiente Dockerfile ilustra la construcción y posterior copiado de una aplicación en Go:
|
|
Credenciales y Confidencialidad
Nunca, nunca coloques secretos o credenciales en Dockerfiles (variables de entorno, argumentos, o credenciales en texto plano en cualquier comando)
Ten cuidado con aquellos archivos que se copian dentro de la imagen. Aún si el archivo es eliminado en alguna instrucción posterior en el Dockerfile, puede ser accesado por las capas anteriores, ya que no está realmente eliminado, sino “escondido” en el sistema de archivos final. Así, que cuando estés construyendo imágenes, toma en cuenta lo siguiente:
-
Si la aplicación soporta configuración vía variables de entorno, usalas para configurar los secretos en tiempo de ejecución (opción “-e” en docker run), o usa Docker secrets, Kubernetes secrets para proveer los valores como variales de entorno.
-
Usa archivos de configuración y móntalas como volúmenes en docker, o móntalas como secretos de Kubernetes.
Además, tus imágenes no deberían tener ninguna información sensible o confidencial o valores de configuración que muestren algún ambiente de desarrollo (por ejemplo, production, staging, etc.).
Espero les haya gustado y nos vemos en la próxima! Happy Dockering 😄
Artículos sobre Docker
- Como Instalar Docker en Linux
- Como Instalar Portainer: El Mejor Gestor Gráfico de Docker en Linux
- Conceptos y Comandos Básicos en Docker
- Construyendo Imágenes Personalizadas en Docker con Dockerfile
- Desplegando Aplicaciones con Docker Compose
- Como Configurar un Registro Privado de Docker en Linux
- SupervisorD: Gestionando Procesos en Docker
- Buenas Prácticas al Escribir Dockerfiles
- Crear Imágenes Multi-Arquitectura en Docker con buildx
Apoya este Proyecto
Si te pareció útil este artículo y el proyecto en general, considera brindarme un café :)
Buy me a coffee