Optimizar imágenes de Docker generadas por AWS App2Container - Recomendaciones de AWS

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Optimizar imágenes de Docker generadas por AWS App2Container

Creado por Varun Sharma (AWS)

Entorno: PoC o piloto

Tecnologías: contenedores y microservicios; Modernización; DevOps

Servicios de AWS: Amazon ECS

Resumen

AWS App2Container es una herramienta de línea de comandos que le ayuda a transformar en contenedores las aplicaciones existentes en las instalaciones que se ejecutan en máquinas virtuales sin necesidad de cambiar el código.

En función del tipo de aplicación, App2Container adopta un enfoque conservador para identificar las dependencias. En el modo de proceso, todos los archivos que no son del sistema en el servidor de aplicaciones se incluyen en la imagen del contenedor. En esos casos, se puede generar una imagen de gran tamaño.

Este patrón proporciona un enfoque para optimizar las imágenes del contenedor generadas por App2Container. Es aplicable a todas las aplicaciones Java detectadas por App2Container en modo de proceso. El flujo de trabajo definido en el patrón ha sido diseñado para ejecutarse en el servidor de aplicaciones.

Requisitos previos y limitaciones

Requisitos previos 

  • Una cuenta de AWS activa

  • Un servidor de aplicaciones con una aplicación Java que se ejecuta en un servidor Linux

  • App2Container instalado y configurado, con todos los requisitos previos satisfechos, en el servidor Linux

Arquitectura

Pila de tecnología de origen

  • Aplicaciones Java que se ejecutan en un servidor Linux

Pila de tecnología de destino

  • Una imagen de Docker generada por App2Container

Arquitectura de destino flow 

Diagram showing AWS App2Container process for containerizing Java app on Linux system.
  1. Descubra las aplicaciones que se ejecutan en el servidor de aplicaciones y analice las aplicaciones.

  2. Contenerización de aplicaciones.

  3. Evalúe el tamaño de la imagen de Docker. Si la imagen es demasiado grande, continúe con el paso 4.

  4. Utilice el script de intérprete de comandos (adjunto) para identificar los archivos de gran tamaño.

  5. Actualice las listas appExcludedFiles y appSpecificFiles del archivo analysis.json.

Herramientas

Herramientas

  • AWS App2Container (A2C): AWS App2Container (A2C) es una herramienta de la línea de comandos que le ayuda a migrar mediante lift-and-shift las aplicaciones que se ejecutan en centros de datos en las instalaciones o en máquinas virtuales, de modo que se ejecuten en contenedores administrados por Amazon Elastic Container Service (Amazon ECS) o Amazon Elastic Kubernetes Service (Amazon EKS).

Código

Se adjuntan el script de intérprete de comandos optimizeImage.sh y un archivo analysis.json de ejemplo.

El archivo optimizeImage.sh es un script de utilidad para revisar el contenido del archivo generado por App2Container, ContainerFiles.tar. La revisión identifica los archivos o subdirectorios grandes que se pueden excluir. El script es un contenedor para el siguiente comando tar.

tar -Ptvf <path>|tr -s ' '|cut -d ' ' -f3,6| awk '$2 ~/<filetype>$/'| awk '$2 ~/^<toplevel>/'| cut -f1-<depth> -d'/'|awk '{ if ($1>= <size>) arr[$2]+=$1 } END { for (key in arr) { if(<verbose>) printf("%-50s\t%-50s\n", key, arr[key]) else printf("%s,\n", key) } } '|sort -k2 -nr

En el comando tar, el script usa los siguientes valores:

path

La ruta a ContainerFiles.tar

filetype

Tipo de archivo a comparar

toplevel

Directorio de nivel superior a comparar

depth

Profundidad de la ruta absoluta

size

Tamaño de cada archivo

El script hace lo siguiente:

  1. Emplea tar -Ptvf para enumerar los archivos sin extraerlos.

  2. Filtra los archivos por tipo de archivo, empezando por el directorio de nivel superior.

  3. En función de la profundidad, genera la ruta absoluta como un índice.

  4. Según el índice y el almacenamiento, indica el tamaño total del subdirectorio.

  5. Imprime el tamaño del subdirectorio.

También puede sustituir los valores manualmente en el comando tar.

Epics

TareaDescripciónHabilidades requeridas
Descubra las aplicaciones Java en las instalaciones.

Para descubrir todas las aplicaciones en ejecución en el servidor de aplicaciones, ejecute el siguiente comando.

sudo app2container inventory 
AWS DevOps
Analice las aplicaciones descubiertas.

Para analizar cada aplicación mediante el application-id obtenido en la fase de inventario, ejecute el siguiente comando.

sudo app2container analyze --application-id <java-app-id>
AWS DevOps
Coloque las aplicaciones analizadas en contenedores.

Ejecute el siguiente comando para la contenerización de una aplicación.

sudo app2container containerize --application-id <application-id>

El comando genera la imagen de Docker junto con un paquete tar en la ubicación del espacio de trabajo.

Si la imagen de Docker es demasiado grande, continúe al siguiente paso.

AWS DevOps
TareaDescripciónHabilidades requeridas
Identifique el tamaño del archivo tar de artefactos.

Identifique el archivo ContainerFiles.tar en {workspace}/{java-app-id}/Artifacts, donde workspace es el espacio de trabajo de App2Container y java-app-id es la ID de la aplicación. 

./optimizeImage.sh -p /{workspace}/{java-app-id}/Artifacts/ContainerFiles.tar -d 0 -t / -v

Este es el tamaño total del archivo tar tras la optimización.

AWS DevOps
Enumere los subdirectorios del directorio / y sus tamaños.

Para identificar los tamaños de los subdirectorios principales en el directorio de nivel superior /, ejecute el siguiente comando.

./optimizeImage.sh -p /{workspace}/{java-app-id}/Artifacts/ContainerFiles.tar -d 1 -t / -s 1000000 -v /var                         554144711 /usr 2097300819 /tmp 18579660 /root 43645397 /opt 222320534 /home 65212518 /etc 11357677                                    
AWS DevOps
Identifique los subdirectorios grandes en el directorio /.

En cada subdirectorio principal enumerado en el comando anterior, identifique los tamaños de sus subdirectorios. Use -d para aumentar la profundidad y -t para indicar el directorio de nivel superior.

Por ejemplo, use /var como directorio de nivel superior. En /var, identifique todos los subdirectorios grandes y sus tamaños.

./optimizeImage.sh -p /{workspace}/{java-app-id}/Artifacts/ContainerFiles.tar -d 2 -t /var -s 1000000 -v

Repita este proceso en cada subdirectorio de la lista del paso anterior (por ejemplo, /usr, /tmp, /opt y /home).

AWS DevOps
Analice la carpeta grande de cada subdirectorio en el directorio /.

En cada subdirectorio enumerado en el paso anterior, identifique las carpetas necesarias para ejecutar la aplicación.

Por ejemplo, en los subdirectorios del paso anterior, enumere todos los subdirectorios del directorio /var y sus tamaños. Identifique los subdirectorios necesarios para la aplicación.

/var/tmp                        237285851 /var/lib 24489984 /var/cache                      237285851

Para excluir los subdirectorios que la aplicación no necesita, en el archivo analysis.json, añada dichos subdirectorios a la sección appExcludedFiles, en containerParameters.

Se adjunta un archivo analysis.json de ejemplo.

AWS DevOps
Identifique los archivos necesarios en la lista appExcludes.

En cada subdirectorio agregado a la lista appExcludes, identifique los archivos de dicho subdirectorio necesarios para la aplicación. En el archivo analysis.json, añada los archivos o subdirectorios específicos en la sección appSpecificFiles, en containerParameters

Por ejemplo, si el directorio /usr/lib se añade a la lista de exclusiones, pero /usr/lib/jvm es necesario para la aplicación, añada /usr/lib/jvm a la sección appSpecificFiles.

AWS DevOps
TareaDescripciónHabilidades requeridas
Coloque la aplicación analizada en un contenedor.

Ejecute el siguiente comando para la contenerización de la aplicación.

sudo app2container containerize --application-id <application-id>

El comando genera la imagen de Docker junto con un paquete tar en la ubicación del espacio de trabajo.

AWS DevOps
Identifique el tamaño del archivo tar de artefactos.

Identifique el archivo ContainerFiles.tar en {workspace}/{java-app-id}/Artifacts, donde  workspace es el espacio de trabajo de App2Container y  java-app-id es la ID de la aplicación. 

./optimizeImage.sh -p /{workspace}/{java-app-id}/Artifacts/ContainerFiles.tar -d 0 -t / -v

Este es el tamaño total del archivo tar tras la optimización. 

AWS DevOps
Ejecutar la imagen de Docker.

Para comprobar que la imagen se inicia sin errores, ejecute la imagen de Docker de forma local mediante los siguientes comandos.

Para identificar el  imageId del contenedor, use docker images |grep java-app-id.

Para ejecutar el contenedor, use docker run -d <image id>.

AWS DevOps

Recursos relacionados

Conexiones

Para acceder al contenido adicional asociado a este documento, descomprima el archivo: attachment.zip