Prácticas recomendadas para las imágenes de contenedores de Amazon ECS - Amazon Elastic Container Service

Prácticas recomendadas para las imágenes de contenedores de Amazon ECS

Una imagen de contenedor es un conjunto de instrucciones sobre cómo construir el contenedor. Una imagen de contenedor contiene el código de la aplicación y todas las dependencias que el código de la aplicación requiere para ejecutarse. Las dependencias de la aplicación incluyen los paquetes de código fuente en los que se basa el código de la aplicación, el tiempo de ejecución del lenguaje para los lenguajes interpretados y los paquetes binarios en los que se basa el código vinculado dinámicamente.

Utilice las siguientes pautas al diseñar y crear las imágenes de los contenedores:

  • Complete las imágenes del contenedor almacenando todas las dependencias de la aplicación como archivos estáticos dentro de la imagen del contenedor.

    Si cambia algo en la imagen del contenedor, cree una nueva con los cambios.

  • Ejecute un único proceso de aplicación dentro de un contenedor.

    La vida útil del contenedor dura mientras se ejecute el proceso de la aplicación. Amazon ECS reemplaza los procesos bloqueados y determina dónde iniciar el proceso de reemplazo. Una imagen completa hace que la implementación general sea más resistente.

  • Haga que la aplicación gestione SIGTERM.

    Cuando Amazon ECS detiene una tarea, primero envía una señal SIGTERM a la tarea para notificarle que la aplicación debe finalizar y cerrarse. A continuación, Amazon ECS envía un mensaje SIGKILL. Cuando las aplicaciones ignoran SIGTERM, el servicio Amazon ECS debe esperar para enviar la señal SIGKILL para terminar el proceso.

    Debe identificar cuánto tarda la aplicación en completar su trabajo y asegurarse de que sus aplicaciones gestionan la señal SIGTERM. La gestión de señales de la aplicación debe impedir que la aplicación retome trabajos nuevos y complete los que están en curso, o debe guardar los trabajos pendientes en un almacenamiento externo a la tarea cuando tarden demasiado en completarse.

  • Configure las aplicaciones en contenedores para escribir registros en stdout y stderr.

    Desacoplar la gestión de registros del código de la aplicación proporciona flexibilidad para ajustar la gestión de registros de la infraestructura. Un ejemplo de ello es cambiar el sistema de registros. En lugar de modificar los servicios y crear e implementar una nueva imagen de contenedor, puede ajustar la configuración.

  • Utilice etiquetas para crear versiones de las imágenes de contenedores.

    Las imágenes de los contenedores se almacenan en un registro de contenedores. Cada imagen de un registro se identifica mediante una etiqueta. Hay una etiqueta llamada latest. Esta etiqueta funciona como un puntero de la última versión de la imagen del contenedor de la aplicación, de forma similar a la HEAD de un repositorio de git. Le recomendamos que solo utilice la etiqueta latest solo para pruebas. Como práctica recomendada, etiquete las imágenes del contenedor con una etiqueta única para cada compilación. Le recomendamos etiquetar las imágenes con el git SHA para la confirmación de git que se utilizó para crear la imagen.

    No es necesario crear una imagen de contenedor para cada confirmación. Sin embargo, le recomendamos que cree una nueva imagen de contenedor cada vez que publique una confirmación de código concreta en el entorno de producción. También le recomendamos etiquetar la imagen con una etiqueta que corresponda a la confirmación de git del código que está dentro de la imagen. Si etiquetó la imagen con la confirmación de git, podrá encontrar más rápidamente qué versión del código está ejecutando la imagen.

    También le recomendamos que active las etiquetas de imagen inmutables en Amazon Elastic Container Registry. Con esta configuración, no puede cambiar la imagen del contenedor a la que apunta una etiqueta. En cambio, Amazon ECR exige que se cargue una imagen nueva en una etiqueta nueva. Para obtener más información, consulte Mutabilidad de las etiquetas de imagen en la Guía del usuario de Amazon ECR.

Al diseñar la arquitectura de la aplicación para que se ejecute en AWS Fargate, debe decidir entre implementar varios contenedores en la misma definición de tareas e implementar contenedores por separado en varias definiciones de tareas. Si se requieren las siguientes condiciones, le recomendamos implementar los contenedores en una sola definición de tareas:

  • Los contenedores comparten un ciclo de vida común (es decir, se lanzan y terminan a la vez).

  • Los contenedores se deben ejecutar en el mismo host subyacente (es decir, un contenedor hace referencia al otro en un puerto localhost).

  • Los contenedores comparten recursos.

  • Sus contenedores comparten volúmenes de datos.

Si no se requieren estas condiciones, le recomendamos implementar los contenedores por separado en varias definiciones de tareas. Esto permite escalar, aprovisionar y desaprovisionar los contenedores por separado.