Dockerfile のマルチステージビルドと Alibaba Cloud Container Registry のイメージビルドサービスを使用して、Java アプリケーション用のサイズの小さいイメージを安全かつ迅速にビルドできます。
前提条件
Container Registry サービスがアクティブ化されている。
Docker がインストールされている。詳細については、「Docker のインストール」をご参照ください。
Java アプリケーションが作成され、そのソースコードが GitHub、GitLab、または Bitbucket 上のリポジトリでホストされている。
説明GitHub でホストされている Maven ベースの Java プロジェクトを使用して、マルチステージビルドを試すことができます。
背景情報
Docker イメージビルドにおける一般的な問題
Container Registry のイメージビルド機能は、Dockerfile を使用してアプリケーションの最終イメージをビルドします。このプロセス中に、以下の問題が発生する可能性があります。
Dockerfile の記述が難しい。
強力なプログラミング言語のフレームワーク、特に Java を使用してアプリケーションをビルドすることに慣れている場合、アプリケーションイメージをビルドするための Dockerfile の記述が難しい場合があります。
最終イメージのサイズが大きくなる可能性がある。
イメージをビルドするときに、アプリケーションのコンパイル、テスト、およびパッケージ化プロセスを同じ Dockerfile に含める場合があります。 Dockerfile の各コマンドはイメージのレイヤーを作成するため、イメージの構造が複雑になり、イメージサイズが大きくなります。
ソースコードが漏洩する可能性がある。
アプリケーションのソースコードを最終イメージにパッケージ化すると、コードが漏洩する可能性があります。
マルチステージビルドの利点
Dockerfile でマルチステージビルドを使用して、Java などのコンパイル言語で開発されたアプリケーションのイメージをビルドすると、以下の利点があります。
最終イメージは安全な方法でビルドされます。
イメージビルドの最初のステージでは、適切なベースイメージを指定する必要があります。次に、ソースコードをベースイメージにコピーし、アプリケーションの依存関係をダウンロードし、ソースコードをコンパイルし、アプリケーションをテストし、アプリケーションをパッケージ化する必要があります。 2 番目のステージでは、別の適切なベースイメージを指定し、最初のステージで生成されたランタイム依存関係ファイルをベースイメージにコピーする必要があります。このようにして、最終イメージにはソースコードが含まれません。
最終イメージのレイヤー数が少なく、サイズが小さくなります。
最終イメージには、ベースイメージとコンパイル済みアーティファクトのみが含まれています。その結果、最終イメージはレイヤー数が少なく、必要なストレージサイズも小さくなります。
最終イメージは高速でビルドされます。
Docker や Buildkit などのビルドツールを使用して複数のビルドプロセスを同時実行することで、イメージのビルドを高速化できます。
ステップ 1:ソースコードリポジトリを Container Registry インスタンスにバインドする
Container Registry コンソールにログインし、Container Registry にソースコードリポジトリへのアクセスを承認します。この例では、Container Registry は GitHub 上のソースコードリポジトリにアクセスすることを承認されています。
Container Registry コンソール にログインします。
上部のナビゲーションバーで、リージョンを選択します。
[インスタンス] ページで、管理する Personal Edition インスタンスをクリックします。
Container Registry Personal Edition インスタンスの管理ページの左側のナビゲーションウィンドウで、 を選択します。
GitHub に対応する [アクション] 列で、[アカウントをバインド] をクリックします。 GitHub ダイアログボックスで、[ソースコードリポジトリに移動してアカウントをバインド] をクリックします。表示されるページで、ユーザー名とパスワードを入力して GitHub にログインします。
承認ページで、[AliyunDeveloper を承認] をクリックします。アカウントがバインドされている場合は、アカウントが GitHub にバインドされていることを示すメッセージが表示されます。 [コードソース] ページに移動します。 GitHub サービスのステータスが [バインド済み] と表示されていることを確認します。
ステップ 2:イメージリポジトリを作成する
Container Registry コンソール にログインします。
上部のナビゲーションバーで、リージョンを選択します。
[インスタンス] ページで、管理する Personal Edition インスタンスをクリックします。
Container Registry Personal Edition インスタンスの管理ページの左側のナビゲーションウィンドウで、 を選択します。 [リポジトリ] ページで、[リポジトリの作成] をクリックします。
イメージリポジトリのパラメーターを設定します。
パラメーター
説明
例
リージョン
イメージリポジトリが存在するリージョン。
中国 (杭州)
名前空間
イメージリポジトリが属する名前空間。イメージリポジトリは 1 つの名前空間にのみ属しますが、名前空間には複数のイメージリポジトリを含めることができます。
test23432
リポジトリ名
イメージリポジトリの名前。
test
リポジトリタイプ
イメージリポジトリのタイプ。有効な値:パブリック および プライベート。リポジトリタイプに関係なく、イメージリポジトリにログインした後にのみ、イメージをプッシュできます。パブリックリポジトリは、インターネット上の誰でもアクセスできます。データ損失を防ぐため、プライベートを選択することをお勧めします。
パブリック:イメージリポジトリにログインせずに、イメージリポジトリからイメージをプルできます。
プライベート:Docker クライアントでイメージリポジトリにログインした後にのみ、イメージリポジトリからイメージをプルできます。
プライベート
概要
イメージリポジトリの簡単な説明。
-
説明
イメージリポジトリの詳細な説明。 Markdown 形式がサポートされています。
作成した Dockerfile と Container Registry のイメージビルド機能を使用して、イメージをビルド、パッケージ化、および実行します。
[次へ] をクリックします。 [コードソース] ステップで、コードソースを指定し、ビルド設定を行います。
パラメーター
説明
コードソース
[コードソース] セクションの [GitHub] タブで、[アカウントをバインド] をクリックし、「ステップ 2:ソースコードリポジトリへのアクセスを Container Registry に承認する」でバインドしたソースコードリポジトリをバインドします。
ビルド設定
この例では、[コード変更時にイメージを自動的にビルド] と [中国本土以外にデプロイされたサーバーでビルド] を選択します。
コード変更時にイメージを自動的にビルド:ブランチからコードがコミットされると、ビルドルールが自動的にトリガーされます。
中国本土以外にデプロイされたサーバーでビルド:イメージは中国本土以外のデータセンターでビルドされ、指定されたリージョンのイメージリポジトリにプッシュされます。
キャッシュなしでビルド:イメージをビルドするたびに、システムはベースイメージをプルします。これにより、ビルドプロセスが遅くなる可能性があります。
[リポジトリの作成] をクリックします。
イメージリポジトリが作成されると、イメージリポジトリの詳細ページにリダイレクトされます。詳細ページでイメージリポジトリの基本情報を表示できます。
イメージリポジトリの詳細ページの左側のナビゲーションウィンドウで、リポジトリ名の横にある
アイコンをクリックします。 [リポジトリ] ページで、作成したイメージリポジトリを表示できます。イメージリポジトリの [ステータス] 列に [正常] と表示されている場合、イメージリポジトリは作成されています。
ステップ 3:イメージをビルドする
左側のナビゲーション ウィンドウで、 を選択します。[リポジトリ] ページで、イメージ リポジトリを見つけます。リポジトリ名をクリックするか、[管理] 列の [アクション] をクリックして、リポジトリの詳細ページに移動します。
左側のナビゲーションウィンドウで、[ビルド] をクリックします。[ビルドルールを追加] セクションが表示されたページで、[ビルドルール] をクリックします。
[ビルドルールの追加] ダイアログボックスで、必要に応じてパラメーターを設定します。
パラメーター
説明
例
タイプ
ビルドルールをトリガーするためにソースコードリポジトリにプッシュされるコンテンツのタイプ。有効な値:ブランチとタグ。
ブランチ
ブランチ/タグ
ビルドルールをトリガーするコードブランチまたはタグ。
master
ビルドコンテキストディレクトリ
Dockerfile のディレクトリ。指定されたディレクトリは相対ディレクトリであり、コードブランチのルートディレクトリが親ディレクトリとして機能します。この例では、Dockerfile のディレクトリは /Dockerfile です。 / と入力します。
/
Dockerfile ファイル名
Dockerfile の名前。デフォルト値:Dockerfile。たとえば、Dockerfile のパスが /Dockerfile の場合、このパラメーターの値として Dockerfile を指定します。
Dockerfile
イメージタグ
ビルドするイメージのタグ。
V1.0.0
[確認] をクリックします。
[ビルドルール] セクションで、作成したルールを見つけ、ルールに対応する [ビルド][アクション] 列の をクリックします。
ビルドを開始すると、[ビルドログ] セクションにビルドレコードが生成されます。ビルドレコードのステータスが [成功] になると、イメージがビルドされます。
結果
イメージがビルドされているかどうかを確認する
Container Registry Personal Edition インスタンスの管理ページの左側のナビゲーションウィンドウで、[リポジトリ] > [リポジトリ] を選択します。リポジトリの名前をクリックするか、リポジトリに対応する [アクション] 列の [管理] をクリックします。リポジトリの詳細ページの左側のナビゲーションウィンドウで、[タグ] をクリックして、作成したイメージを表示します。
Docker でイメージを実行する
Container Registry は、2024 年 9 月 9 日から Personal Edition インスタンスの作成プロセスを調整しました。詳細については、「新しい Personal Edition インスタンスの制限」をご参照ください。 Container Registry Personal Edition インスタンスのバージョンに基づいて、イメージのプッシュ方法とプル方法を選択できます。
新しいバージョンの Personal Edition インスタンス
Docker で次のコマンドを実行し、環境とリソースを準備するときに設定したパスワードを使用して、Alibaba Cloud Docker Registry にログインします。コマンド内の
acr_e2******@test.aliyunid.com
を Alibaba Cloud アカウントのフルネームに置き換えます。cn-hangzhou
を Personal Edition インスタンスが存在するリージョンに置き換えます。crpi-xxxx
を Personal Edition インスタンスの ID に置き換えます。 Container Registry コンソール にログインし、Personal Edition インスタンスのカードをクリックします。 [概要] ページで、[インスタンス情報] タブをクリックして、Personal Edition インスタンスの ID を取得します。docker login --username=acr_e2******@test.aliyunid.com crpi-xxxx.cn-hangzhou.personal.cr.aliyuncs.com
次のコマンドを実行して、イメージをプルします。
docker pull crpi-xxxx.cn-hangzhou.personal.cr.aliyuncs.com/test23432/test:V1.0.0
次のコマンドを実行して、Docker イメージを表示します。
docker images
次のコマンドを実行して、イメージを実行します。
docker run -ti crpi-xxxx.cn-hangzhou.personal.cr.aliyuncs.com/test23432/test:V1.0.0 Hello World!
古いバージョンの Personal Edition インスタンス
Docker で次のコマンドを実行し、環境とリソースを準備するときに設定したパスワードを使用して、Alibaba Cloud Docker Registry にログインします。コマンド内の
acr_e2******@test.aliyunid.com
を Alibaba Cloud アカウントのフルネームに置き換えます。cn-hangzhou
を Personal Edition インスタンスが存在するリージョンに置き換えます。docker login --username=acr_e2******@test.aliyunid.com registry.cn-hangzhou.cr.aliyuncs.com
次のコマンドを実行して、イメージをプルします。コマンド内の
cn-hangzhou
を Personal Edition インスタンスが存在するリージョンに置き換えます。test23432
を使用する名前空間に置き換えます。test:V1.0.0
を使用するリポジトリ名とイメージタグに置き換えます。docker pull registry.cn-hangzhou.cr.aliyuncs.com/test23432/test:V1.0.0
次のコマンドを実行して、Docker イメージを表示します。
docker images
次のコマンドを実行して、イメージを実行します。コマンド内の
cn-hangzhou
を Personal Edition インスタンスが存在するリージョンに置き換えます。test23432
を使用する名前空間に置き換えます。test:V1.0.0
を使用するリポジトリ名とイメージタグに置き換えます。docker run -ti registry.cn-hangzhou.cr.aliyuncs.com/test23432/test:V1.0.0 Hello World!