最佳化 AWS App2Container 產生的 Docker 映像 - AWS 方案指引

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

最佳化 AWS App2Container 產生的 Docker 映像

由 Varun Sharma 建立 (AWS)

環境:PoC 或試行

技術:容器與微服務;現代化; DevOps

AWS 服務:Amazon ECS

Summary

AWS App2Container 是一種命令列工具,可協助將內部部署或虛擬機器上執行的現有應用程式轉換為容器,而不需要變更程式碼。

根據應用程式類型,App2Container 採取保守方法來識別相依性。對於程序模式,應用程式伺服器上的所有非系統檔案都包含在容器映像中。在這種情況下,可能會產生相當大的映像。

此模式提供最佳化 App2Container 產生的容器映像的方法。它適用於 App2Container 在處理模式下發現的所有 Java 應用程式。模式中定義的工作流程旨在應用程式伺服器上執行。

先決條件和限制

先決條件

架構

來源技術堆疊

  • 在 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。

Code

已連接 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
任務描述所需的技能
識別 Artifacts tar 檔案大小。

識別 中的ContainerFiles.tar檔案{workspace}/{java-app-id}/Artifacts,其中 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 檔案中將這些子目錄新增至 下的 appExcludedFiles區段containerParameters

已連接範例analysis.json檔案。

AWS DevOps
從 appExcludes 清單中識別所需的檔案。

針對新增至 appExcludes 清單的每個子目錄,識別該子目錄中應用程式所需的任何檔案。在 analysis.json 檔案中,在 appSpecificFiles 區段的 下新增特定檔案或子目錄containerParameters。 

例如,如果/usr/lib目錄新增至排除清單,但應用程式/usr/lib/jvm需要,則/usr/lib/jvm新增至 appSpecificFiles區段。

AWS DevOps
任務描述所需的技能
容器化分析的應用程式。

若要容器化應用程式,請執行下列命令。

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

命令會在工作區位置中產生 Docker 映像和 tar 套件。

AWS DevOps
識別 Artifacts tar 檔案大小。

識別 中的ContainerFiles.tar檔案{workspace}/{java-app-id}/Artifacts,其中 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