Consideraciones adicionales - Recomendaciones de AWS

Consideraciones adicionales

En esta sección, se tratan las consideraciones generales sobre la organización en contenedores de Java que no son específicas de las aplicaciones Java EE.

Utilizar una imagen base pequeña

Recomendamos crear una imagen base pequeña (menos de 500 MB), correctamente conservada. Al reducir el tamaño de la imagen base, se reducen los costos operativos y de red. Una imagen base más pequeña también puede mejorar la seguridad al reducir la cantidad de componentes que se pueden utilizar. Puede utilizar una de las imágenes distroless basadas en Debian. Las imágenes tienen el número mínimo de herramientas instaladas y no contienen administradores de paquetes ni intérpretes de comandos. Estas imágenes distrolless también reducen la superficie general de ataque. Las imágenes distrolless pueden ocupar menos de 150 MB. Para obtener más información, consulte el repositorio GitHub Imágenes de contenedor “Distroless”.

Recomendamos seguir el principio de disponibilidad y desarrollar un tiempo de inicio rápido para las imágenes de contenedores. Existen técnicas como compilación anticipada (documentación de OpenJDK) o intercambio de datos de clase de aplicación (documentación de OpenJDK). Mediante estas técnicas, puede mejorar el tiempo de inicio general al compilar clases de Java en código nativo antes de lanzar la máquina virtual y al permitir que un conjunto de clases se procese previamente en un archivo de almacenamiento compartido. También puede utilizar GraalVM para crear imágenes de Docker mínimas para aplicaciones Java. Para obtener más información, consulte la publicación del blog Uso de GraalVM para crear imágenes de Docker mínimas para aplicaciones Java de AWS.

Actualizar a una versión de JDK compatible con contenedores

Antes de JDK 8u131, la JVM no reconocía los límites de memoria o CPU establecidos por el motor Docker mediante marcas. Esto significa que cada vez que se ejecuta la aplicación en un contenedor, la JVM “ve” el número total de procesadores disponibles en el sistema o, en el caso de las máquinas virtuales, el sistema virtual. Lo mismo ocurre con los límites de memoria predeterminados: la JVM analizará la memoria total del host y la utilizará para establecer sus valores predeterminados. En consecuencia, la JVM puede ocupar más memoria de la que permite la plataforma del contenedor, lo cual hace que la plataforma del contenedor (Docker) finalice el proceso de Java. Una solución para este problema consiste en migrar la aplicación Java a Java 9 u 8u131+ antes de colocarla en un contenedor. Java 10 y las versiones posteriores tienen compatibilidad completa con los contenedores.