App2Container が生成した Docker イメージを最適化する - AWS 規範ガイダンス

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

App2Container が生成した Docker イメージを最適化する

作成者: Varun Sharma (AWS)

環境:PoC またはパイロット

テクノロジー: コンテナとマイクロサービス、モダナイゼーション、 DevOps

AWS サービス: Amazon ECS

[概要]

AWS App2Container は、コードを変更することなく、オンプレミスまたは仮想マシンで実行中の既存のアプリケーションをコンテナに変換する上で役立つコマンドラインツールです。

アプリケーションタイプに基づき、App2Container は保守的なアプローチで依存関係を特定します。プロセスモードの場合は、アプリケーションサーバー上のすべての非システムファイルがコンテナイメージに含まれます。このような場合、かなり大きなイメージが生成される可能性があります。

このパターンは、App2Container によって生成されるコンテナイメージを最適化するアプローチを提供します。App2Container がプロセスモードで検出したすべての Java アプリケーションに適用できます。このパターンで定義されているワークフローは、アプリケーションサーバー上で実行されるように設計されています。

前提条件と制限

前提条件

  • アクティブなAWS アカウント

  • Linux サーバー上のアプリケーションサーバー上で実行中の Java アプリケーション

  • Linuxサーバー上で、すべての前提条件を満たした状態で App2Container をインストールして設定

アーキテクチャ

ソーステクノロジースタック

  • Linux サーバー上で実行中の Java アプリケーション

ターゲットテクノロジースタック

  • App2Container が生成した Docker イメージ

ターゲットアーキテクチャのフロー

Diagram showing AWS App2Container process for containerizing Java app on Linux system.
  1. アプリケーションサーバー上で実行中の Java アプリケーションを検出し、アプリケーション分析します。

  2. アプリケーションをコンテナ化します。

  3. Docker イメージのサイズを評価します。イメージが大きすぎる場合は、手順 4 に進みます。

  4. シェルスクリプト (添付) を使用して、サイズの大きいファイルを特定します。

  5. analysis.json ファイル内の appExcludedFilesappSpecificFiles リストを更新します。

ツール

ツール

  • App2Container - AWS App2Container (A2C) はオンプレミスデータセンターまたは仮想マシンで実行中のアプリケーションをリフトアンドシフトし、Amazon Elastic Container Service (Amazon ECS) または Amazon Elastic Kubernetes Service (Amazon EKS) で管理されるコンテナで実行できるようにするコマンドラインツールです。

コード

optimizeImage.sh シェルスクリプトと 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
/ディレクトリの下にある大きなサブディレクトリを特定します。

前のコマンドで一覧表示されている各サブディレクトリの場合は、そのサブディレクトリのサイズを特定します。-t で深さを増分し、-d で最上位レベルのディレクトリを示します。

たとえば、/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 が必要な場合は、その appSpecificFiles セクションに /usr/lib/jvm を追加します。

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