Otimizar imagens do Docker geradas pelo AWS App2Container - Recomendações da AWS

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Otimizar imagens do Docker geradas pelo AWS App2Container

Criado por Varun Sharma (AWS)

Ambiente: PoC ou piloto

Tecnologias: contêineres e microsserviços; Modernização; DevOps

Serviços da AWS: Amazon ECS

Resumo

O AWS App2Container é uma ferramenta de linha de comando que ajuda a transformar aplicativos existentes executados on-premises ou em máquinas virtuais em contêineres, sem a necessidade de alterações no código.

Com base no tipo de aplicativo, o App2Container adota uma abordagem conservadora para identificar dependências. No modo de processo, todos os arquivos que não são do sistema no servidor de aplicativos são incluídos na imagem do contêiner. Nesses casos, uma imagem bastante grande pode ser gerada.

Esse padrão fornece uma abordagem para otimizar as imagens de contêiner geradas pelo App2Container. É aplicável a todos os aplicativos Java descobertos pelo App2Container no modo de processo. O fluxo de trabalho definido no padrão foi projetado para ser executado no servidor do aplicativo.

Pré-requisitos e limitações

Pré-requisitos

  • Uma conta AWS ativa

  • Um aplicativo Java em execução em um servidor de aplicativos em um servidor Linux

  • App2Container instalado e configurado, com todos os pré-requisitos atendidos, no servidor Linux

Arquitetura

Pilha de tecnologia de origem

  • Um aplicativo Java em execução em um servidor Linux

Pilha de tecnologias de destino

  • Uma imagem do Docker gerada pelo App2Container

Fluxo da arquitetura de destino

Diagram showing AWS App2Container process for containerizing Java app on Linux system.
  1. Descubra os aplicativos em execução no servidor de aplicativos e analisar os aplicativos.

  2. Colocar os aplicativos no contêiner.

  3. Avalie o tamanho da imagem do Docker. Se a imagem estiver muito grande, prossiga para a etapa 4.

  4. Use o script de shell (anexado) para identificar arquivos grandes.

  5. Atualize as listas appExcludedFiles e appSpecificFiles no arquivo analysis.jsone.

Ferramentas

Ferramentas

  • AWS App2Container: o AWS App2Container (A2C)é uma ferramenta da linha de comando que ajuda você a mover sem alterações (lift-and-shift) os aplicativos executados em seus datacenters on-premises ou em máquinas virtuais, para que eles sejam executados em contêineres gerenciados pelo Amazon Elastic Container Service (Amazon ECS) ou Amazon Elastic Kubernetes Service (Amazon EKS). .

Código

O script de shell optimizeImage.sh e um arquivo analysis.json de exemplo estão anexados.

O arquivo optimizeImage.sh é um script utilitário para revisar o conteúdo do arquivo gerado pelo App2Container,. ContainerFiles.tar. A análise identifica arquivos ou subdiretórios que são grandes e podem ser excluídos. O script é um invólucro para o seguinte 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

No comando tar, o script usa os seguintes valores:

path

O caminho para ContainerFiles.tar

filetype

Tipo de arquivo a ser usado

toplevel

O diretório de nível superior a ser correspondente

depth

A profundidade do caminho absoluto

size

O tamanho de cada arquivo

O script faz o seguinte:

  1. Ele usa tar -Ptvf para listar os arquivos sem extraí-los.

  2. Ele filtra os arquivos por tipo de arquivo, começando pelo diretório de nível superior.

  3. Com base na profundidade, ele gera o caminho absoluto como um índice.

  4. Com base no índice e nos armazenamentos, ele fornece o tamanho total do subdiretório.

  5. Ele imprime o tamanho do subdiretório.

Você também pode substituir os valores manualmente no comando tar.

Épicos

TarefaDescriçãoHabilidades necessárias
Descubra os aplicativos Java locais on-premises.

Para descobrir todos os aplicativos em execução no servidor de aplicativos, execute o comando a seguir.

sudo app2container inventory 
AWS DevOps
Analise os aplicativos descobertos.

Para analisar cada aplicativo usando o application-id que foi obtido no estágio de inventário, execute o comando a seguir.

sudo app2container analyze --application-id <java-app-id>
AWS DevOps
Coloque os aplicativos analisados em contêineres.

Para armazenar um aplicativo em contêineres, execute o comando a seguir.

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

O comando gera a imagem do Docker junto com um pacote tar no local do espaço de trabalho.

Se a imagem do Docker for muito grande, vá para a próxima etapa.

AWS DevOps
TarefaDescriçãoHabilidades necessárias
Identifique o tamanho do arquivo tar dos artefatos.

Identifique o arquivo ContainerFiles.tar em {workspace}/{java-app-id}/Artifacts, onde workspace é o espaço de trabalho do App2Container e java-app-id é o ID do aplicativo. 

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

Esse é o tamanho total do arquivo tar após a otimização.

AWS DevOps
Liste os subdiretórios no diretório/e seus tamanhos.

Para identificar os tamanhos dos subdiretórios principais sob o diretório de nível superior /, execute o comando a seguir.

./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 subdiretórios grandes no diretório /.

Para cada subdiretório principal listado no comando anterior, identifique os tamanhos de seus subdiretórios. Use -d para aumentar a profundidade e -t para indicar o diretório de nível superior.

Por exemplo, use /var como diretório de nível superior. Sob /var, identifique todos os subdiretórios grandes e seus tamanhos.

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

Repita esse processo para cada subdiretório listado na etapa anterior (por exemplo, /usr, /tmp, /opt, e/home).

AWS DevOps
Analise a pasta grande em cada subdiretório sob o diretório /.

Para cada subdiretório listado na etapa anterior, identifique as pastas necessárias para executar o aplicativo.

Por exemplo, usando os subdiretórios da etapa anterior, liste todos os subdiretórios no diretório /var e seus tamanhos. Identifique todos os subdiretórios necessários ao aplicativo.

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

Para excluir subdiretórios que não são necessários para o aplicativo, no arquivo analysis.json, adicione esses subdiretórios à seção appExcludedFiles sob containerParameters.

Um arquivo analysis.json de exemplo está anexado.

AWS DevOps
Identifique os arquivos necessários na lista AppExcludes.

Para cada subdiretório adicionado à lista AppExcludes, identifique todos os arquivos desse subdiretório que sejam exigidos pelo aplicativo. No arquivo analysis.json, adicione os arquivos ou subdiretórios específicos na seção appSpecificFiles sob containerParameters

Por exemplo, se o diretório /usr/lib for adicionado à lista de exclusão, mas /usr/lib/jvm for necessário para o aplicativo, adicione /usr/lib/jvm à seção appSpecificFiles.

AWS DevOps
TarefaDescriçãoHabilidades necessárias
Coloque em contêineres o aplicativo analisado.

Para conteinerizar o aplicativo, execute o seguinte comando.

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

O comando gera a imagem do Docker junto com um pacote tar no local do espaço de trabalho.

AWS DevOps
Identifique o tamanho do arquivo tar dos artefatos.

Identifique o arquivo ContainerFiles.tar em {workspace}/{java-app-id}/Artifacts, onde  workspace é o espaço de trabalho do App2Container e  java-app-id é o ID do aplicativo. 

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

Esse é o tamanho total do arquivo tar após a otimização. 

AWS DevOps
Executar a imagem do Docker.

Para verificar se a imagem começa sem erros, execute a imagem do Docker localmente usando os comandos a seguir.

Para identificar o  imageId do contêiner, use docker images |grep java-app-id.

Para executar o contêiner, use docker run -d <image id>.

AWS DevOps

Recursos relacionados

Anexos

Para acessar o conteúdo adicional associado a este documento, descompacte o seguinte arquivo: attachment.zip