优化 AWS App2Container 生成的 Docker 映像 - AWS Prescriptive Guidance

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

优化 AWS App2Container 生成的 Docker 映像

由 Varun Sharma (AWS) 创建

环境:PoC 或试点

技术:容器和微服务;现代化; DevOps

Amazon Web Services:Amazon ECS

Summary

AWS App2Container 是一款命令行工具,无需更改代码即可帮助将本地或虚拟机上运行的现有应用程序转换至容器。

根据应用程序类型,App2Container 采用一种保守的方法来识别依赖项。在进程模式下,应用程序服务器上的所有非系统文件都包含在容器映像中。在这种情况下,可能会生成相当大的映像。

此模式提供了一种优化由 App2Container 生成容器映像的方法。它适用于 App2Container 处理模式下发现的所有 Java 应用程序。模式中定义的工作流旨在在应用程序服务器运行。

先决条件和限制

先决条件

  • 一个有效的 Amazon Web Services account

  • 在 Linux 服务器上的应用服务器上运行的 Java 应用程序

  • 已安装和设置 App2Container,满足所有先决条件,位于 Linux 服务器上

架构

源技术堆栈

  • 在 Linux 服务器上运行的 Java 应用程序

目标技术堆栈

  • 由 App2Container 生成的 Docker 映像

目标架构流程

Diagram showing AWS App2Container process for containerizing Java app on Linux system.
  1. 发现在应用程序服务器上运行的应用程序,然后分析这些应用程序。

  2. 容器化应用程序。

  3. 评估 Docker 映像大小。如果映像太大,请继续执行步骤 4。

  4. 使用 shell 脚本(附件)来识别大文件。

  5. 更新 analysis.json 文件中的 appExcludedFilesappSpecificFiles 列表。

工具

工具

  • AWS App2Container – AWS App2Container(A2C)是一款命令行工具,可帮助您直接迁移在本地部署的数据中心或在虚拟机上运行的应用程序,以便它们在由 Amazon Elastic Container Service (Amazon ECS) 或 Amazon Elastic Kubernetes Service (Amazon EKS) 托管的容器中运行。

代码

附上了 optimizeImage.sh shell 脚本和示例 analysis.json 文件。

optimizeImage.sh 文件是实用程序脚本,用于查看 App2Container 生成文件 ContainerFiles.tar 的内容。审查可以识别出较大、且可以排除的文件或子目录。该脚本是以下 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

在 tar 命令中,脚本使用以下值:

path

ContainerFiles.tar 的路径

filetype

要匹配的文件类型

toplevel

顶层顶层目录匹配

depth

绝对路径深度

size

每个文件的大小

脚本执行以下操作:

  1. 它使用 tar -Ptvf 列出文件而不提取它们。

  2. 它按文件类型筛选文件,顺序从顶级目录开始。

  3. 它根据深度生成绝对路径,以作为索引。

  4. 根据索引和存储,提供了子目录的总大小。

  5. 它打印子目录的大小。

您也可在 tar 命令中手动替换值。

操作说明

任务描述所需技能
探索本地 Java 应用程序。

若要发现应用程序服务器上运行的所有应用程序,请运行以下命令。

sudo app2container inventory 
AWS DevOps
分析所发现的应用程序。

要使用在清单阶段获得的 application-id 分析每个应用程序,请运行以下命令。

sudo app2container analyze --application-id <java-app-id>
AWS DevOps
对分析的应用程序执行容器化。

如要容器化应用程序,请运行以下命令。

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

该命令在工作区位置生成 Docker 映像和 tar 包。

如果 Docker 映像太大,则请继续执行下一步。

AWS DevOps
任务描述所需技能
确定构件 tar 文件的大小。

确定 {workspace}/{java-app-id}/Artifacts 中的 ContainerFiles.tar 文件,其中 workspace 是 App2Container 工作空间,java-app-id 是应用程序 ID。 

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

这是优化后 tar 文件的总大小。

AWS DevOps
列出/目录下的子目录及大小。

要确定 / 顶级目录下主要子目录的大小,请运行以下命令。

./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
标识/目录下的大型子目录。

对于上一个命令中列出的每个主要子目录,请确定其子目录大小。使用 -d 增加深度,使用 -t 指示顶级目录。

例如,将 /var 用作顶级目录。在 /var 下,标识所有大型子目录及其大小。

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

对上一步中列出的每个子目录(例如 /usr/tmp/opt/home)重复此过程。

AWS DevOps
分析/目录下的每个子目录中的大文件夹。

对于上一步中列出的每个子目录,请确定运行此应用程序所需所有文件夹。

例如,使用上一步中的子目录,列出 /var 目录中的所有子目录及其大小。确定应用程序所需所有子目录。

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

若要排除应用程序不需要的子目录,请在 analysis.json 文件中将这些子目录添加至 containerParametersappExcludedFiles 部分中

随附示例 analysis.json 文件。

AWS DevOps
从 AppExcludes 列表中识别所需文件。

对于添加至 AppExcludes 列表中的每个子目录,请标识该子目录中应用程序所需所有文件。在 analysis.json 文件,在 containerParametersappSpecificFiles 部分添加指定文件或子目录。 

例如,如果 /usr/lib 目录已添加到排除列表中,但应用程序需要 /usr/lib/jvm 目录,则将其 /usr/lib/jvm 添加至该 appSpecificFiles 部分。

AWS DevOps
任务描述所需技能
对分析的应用程序执行容器化。

运行以下命令以应用配置文件。

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

该命令在工作区位置生成 Docker 映像和 tar 包。

AWS DevOps
确定构件 tar 文件的大小。

确定 {workspace}/{java-app-id}/Artifacts 中的 ContainerFiles.tar 文件,其中  workspace 是 App2Container 工作空间, java-app-id 是应用程序 ID。 

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

这是优化后 tar 文件的总大小。 

AWS DevOps
运行 Docker 映像。

要验证映像启动时是否有错误,请使用以下命令在本地运行 Docker 映像。

要识别容器的  imageId,请使用 docker images |grep java-app-id

若要运行容器,请使用 docker run -d <image id>

AWS DevOps

相关资源

附件

要访问与此文档相关联的其他内容,请解压以下文件:attachment.zip