7 prácticas recomendadas para compilar contenedores
martes, 24 de julio de 2018
Kubernetes Engine es un excelente espacio para ejecutar tus cargas de trabajo a escala. Sin embargo, para poder usar Kubernetes debes disponer tus aplicaciones en contenedores. Puedes ejecutar la mayoría de las aplicaciones en un contenedor Docker sin demasiada dificultad. Sin embargo, ejecutar esos contenedores eficazmente en producción y simplificar el proceso de compilación es una cuestión aparte. Hay varios aspectos a los que debes estar atento para que tus equipos de seguridad y operaciones estén más tranquilos. En esta entrada encontrarás sugerencias y prácticas recomendadas que te ayudarán a compilar contenedores de forma efectiva.
1. Empaquetar una sola aplicación por contenedor
Más informaciónUn contenedor funciona mejor cuando en él se ejecuta una sola aplicación. Esa aplicación debe tener un solo proceso superior. Por ejemplo, no debes ejecutar PHP y MySQL en el mismo contenedor: entre otros inconvenientes, la depuración será más difícil, las señales de Linux no se controlarán correctamente y no podrás escalar horizontalmente los contenedores PHP. Esto te permite vincular el ciclo de vida de la aplicación al del contenedor.
![]() |
Para el contenedor de la izquierda, se aplica la práctica recomendada. Para el de la derecha no. |
2. Controlar correctamente PID 1, el manejo de la señal y los procesos zombis.
Más informaciónKubernetes y Docker envían señales Linux a tu aplicación dentro del contenedor para detenerla. Envían esas señales al proceso con el identificador de proceso (PID) 1. Si quieres que tu aplicación se detenga correctamente cuando lo necesites, debes controlar esas señales de forma adecuada.
Sandeep Dinesh, representante de desarrolladores de Google, explica el ciclo de vida completo del cierre de Kubernetes en su artículo Mejores prácticas de Kubernetes: cierre correcto.
3. Optimización para el caché de compilación de Docker
Más informaciónDocker puede almacenar en caché capas de tus imágenes para acelerar compilaciones futuras. Esta es una característica muy útil, pero introduce algunos comportamientos que debes considerar al escribir tus Dockerfiles. Por ejemplo, debes agregar el código fuente de tu aplicación lo más tarde posible en tu Dockerfile para que la imagen de base y las dependencias de tu aplicación se almacenen en el caché y no se vuelvan a compilar con cada compilación.
Toma este Dockerfile como ejemplo:
FROM python:3.5
COPY my_code/ /src
RUN pip install my_requirements
Debes cambiar las dos últimas líneas:
FROM python:3.5
RUN pip install my_requirements
COPY my_code/ /src
En la nueva versión, el resultado del comando pip se almacenará en caché y no se volverá a ejecutar cada vez que cambie el código fuente.4. Quitar herramientas innecesarias
Más informaciónReducir la superficie de ataque de tu sistema host siempre es una buena idea, y es mucho más fácil hacerlo con contenedores que con los sistemas tradicionales. Quita de tu contenedor todo lo que la aplicación no necesite. O mejor aún, incluye solo tu aplicación en una imagen distroless o scratch. Si es posible, también debes hacer que el sistema de archivos del contenedor sea de solo lectura. Con esto, deberías recibir comentarios excelentes de tu equipo de seguridad durante tu revisión de rendimiento.
5. Compilar la imagen más pequeña posible
Más información¿A quién le agrada descargar cientos de megabytes de datos inútiles? Procura tener las imágenes más pequeñas posibles. Esto reduce los tiempos de descarga, los tiempos de arranque en frío y el uso del disco. Puedes usar varias estrategias para lograr esto: comienza con una imagen de base mínima, aprovecha las capas comunes entre las imágenes y usa la característica de compilación en varias etapas de Docker.
![]() |
Proceso de compilación en varias etapas de Docker. |
Sandeep Dinesh, representante de desarrolladores de Google, abarca este tema en profundidad en su artículo Prácticas recomendadas de Kubernetes: Cómo y por qué compilar pequeñas imágenes de contenedores.
6. Etiquetar correctamente tus imágenes
Más informaciónLas etiquetas son los elementos que permiten a los usuarios elegir la versión de tu imagen que quieren usar. Hay dos maneras principales de etiquetar tus imágenes: aplicar control semántico de versiones, o usar el hash de confirmación Git de tu aplicación. Cualquiera sea la opción que elijas, documéntala y establece claramente las expectativas que deberían tener los usuarios de la imagen. Ten cuidado: si bien lo usuarios esperan que algunas etiquetas, como “latest”, pase de una imagen a otra, también esperan que otras etiquetas sean inmutables, aunque técnicamente no lo sean. Por ejemplo, una vez que hayas etiquetado una versión específica de tu imagen, con algo como “1.2.3”, nunca debes mover esa etiqueta.
7. Considerar cuidadosamente si quieres usar una imagen pública
Más informaciónEl uso de imágenes públicas puede ser una excelente alternativa para comenzar a trabajar con un software específico. Sin embargo, usarlas en producción puede suponer varios desafíos, en especial en un entorno con muchas restricciones. Podrías necesitar controlar lo que hay dentro de ellas o no querer depender de un repositorio externo, por ejemplo. Por otro lado, compilar tus propias imágenes para cada software que usas no es algo trivial, en particular porque debes estar al día con las actualizaciones de seguridad del software principal. Evalúa detenidamente las ventajas y desventajas de tu caso de uso específico, y toma decisiones conscientes.