DockerfileのマルチステージングビルディングとAlibaba Cloud Container Registryのイメージ構築サービスを使用すると、Javaアプリケーション用の小型イメージを安全かつ迅速に構築できます。
前提条件
Container Registryサービスが有効化されています。
Javaアプリケーションが作成され、そのソースコードがGitHub、GitLab、またはBitbucketのリポジトリにホストされます。
説明複数ステージの建物を体験するには、GitHubでホストされているMavenベースのJavaプロジェクトを使用できます。
背景情報
Dockerイメージ構築の一般的な問題
Container Registryのイメージ構築機能では、Dockerfileを使用してアプリケーションの最終イメージを構築します。 このプロセス中に、次の問題が発生する可能性があります。
Dockerfileを書くのは難しいです。
プログラミング言語、特にJavaの強力なフレームワークを使用してアプリケーションを構築することに精通している場合、Dockerfilesを記述してアプリケーションイメージを構築することは難しい場合があります。
最終的な画像は、サイズが大きくてもよい。
イメージをビルドするときに、アプリケーションのコンパイル、テスト、およびパッケージ化プロセスを同じDockerfileに含めることができます。 Dockerfileの各コマンドはイメージのレイヤーを作成し、イメージの構造を複雑にし、イメージサイズを拡大します。
ソースコードが漏洩する可能性があります。
アプリケーションのソースコードを最終イメージにパッケージ化すると、コードが漏洩する可能性があります。
マルチステージビルのメリット
Dockerfileでマルチステージビルディングを使用して、Javaなどのコンパイル言語を使用して開発されたアプリケーションのイメージを構築する場合、次の利点が得られます。
最終的なイメージは安全な方法で構築されます。
イメージ構築の最初の段階では、適切なベースイメージを指定する必要があります。 次に、ソースコードをベースイメージにコピーし、アプリケーションの依存関係をダウンロードし、ソースコードをコンパイルし、アプリケーションをテストし、アプリケーションをパッケージ化する必要があります。 第2段階では、別の適切なベースイメージを指定し、第1段階で生成されたランタイム依存関係ファイルをベースイメージにコピーする必要があります。 このように、最終的なイメージはソースコードを含まない。
最終的な画像は、層が少なく、サイズが小さい。
最終画像は、ベース画像およびコンパイルされたアーティファクトのみを含む。 その結果、最終的な画像は、いくつかの層からなり、小さな記憶サイズを必要とする。
最終的なイメージは速いスピードで構築されます。
DockerやBuildkitなどのビルドツールを使用すると、複数のビルドプロセスを同時に実行できます。これにより、イメージのビルドが高速化されます。
ステップ1: マルチステージ建物を含むDockerfileを作成する
この例では、簡単なDockerfileがGitHubで作成され、ホストされています。 Dockerfileをリポジトリにコピーします。
手順2: コンテナレジストリにソースコードリポジトリへのアクセスを許可する
Container Registryコンソールにログインし、Container Registryにソースコードリポジトリへのアクセスを許可します。 この例では、Container RegistryはGitHubのソースコードリポジトリへのアクセスを許可されています。
Container Registryコンソールにログインします。
上部のナビゲーションバーで、リージョンを選択します。
[インスタンス] ページで、管理するPersonal Editionインスタンスをクリックします。
Container Registry Personal Editionインスタンスの管理ページの左側のナビゲーションウィンドウで、 .
GitHubに対応する [アクション] 列で、[アカウントのバインド] をクリックします。 GitHubダイアログボックスで、[ソースコードリポジトリに移動してアカウントをバインドする] をクリックします。 表示されるページで、ユーザー名とパスワードを入力してGitHubにログインします。
権限付与ページで、AliyunDeveloperの権限付与をクリックします。 アカウントがバインドされている場合、アカウントがGitHubにバインドされていることを示すメッセージが表示されます。 [コードソース] ページに移動します。 GitHubサービスのステータスがバインド済みと表示されるかどうかを確認します。
ステップ3: イメージリポジトリを作成する
Container Registryコンソールにログインします。
上部のナビゲーションバーで、リージョンを選択します。
[インスタンス] ページで、管理するPersonal Editionインスタンスをクリックします。
Container Registry Personal Editionインスタンスの管理ページの左側のナビゲーションウィンドウで、 を選択します。 [リポジトリ] ページで、[リポジトリの作成] をクリックします。
イメージリポジトリのパラメーターを設定します。
パラメーター
説明
例:
リージョン
イメージリポジトリが存在するリージョン。
中国 (杭州)
名前空間
イメージリポジトリが属する名前空間。 イメージリポジトリは1つの名前空間にのみ属しますが、名前空間には複数のイメージリポジトリを含めることができます。
test23432
リポジトリ名
イメージリポジトリの名前。
test
リポジトリ型
イメージリポジトリのタイプ。 有効な値: PublicおよびPrivate。 リポジトリタイプに関係なく、イメージリポジトリにログインした後にのみイメージリポジトリにイメージをプッシュできます。 パブリックリポジトリはパブリックで使用できます。 データの損失を防ぐため、[プライベート] を選択することを推奨します。
パブリック: イメージリポジトリにログインしなくても、イメージリポジトリからイメージをプルできます。
プライベート: Dockerクライアントのイメージリポジトリにログインした後にのみ、イメージリポジトリからイメージをプルできます。
プライベート
概要
イメージリポジトリの簡単な説明。
-
説明
イメージリポジトリの詳細な説明。 Markdown形式がサポートされています。
「手順1: マルチステージビルディングを含むDockerfileを作成する」で作成したDockerfileとContainer Registryのイメージビルディング機能を使用して、イメージをビルド、パッケージ化、実行します。
[次へ] をクリックします。 コードソースステップで、コードソースを指定し、ビルド設定を構成します。
パラメーター
説明
コードソース
[コードソース] セクションの [GitHub] タブで、[アカウントのバインド] をクリックし、[ステップ2: コンテナレジストリにソースコードリポジトリへのアクセスを許可する] でバインドしたソースコードリポジトリをバインドします。
ビルド設定
この例では、[コードが変更されたときにイメージを自動的に構築] および [中国本土外に配置されたサーバーで構築] を選択します。
コードが変更されたときにイメージを自動的に構築: コードがブランチからコミットされると、構築ルールが自動的にトリガーされます。
中国本土外に配置されたサーバーによるビルド: イメージは中国本土外のデータセンターに構築され、指定されたリージョンのイメージリポジトリにプッシュされます。
キャッシュなしのビルド: イメージがビルドされるたびに、システムはベースイメージをプルします。 これにより、構築プロセスが遅くなる可能性があります。
クリックリポジトリの作成.
イメージリポジトリの作成後、イメージリポジトリの詳細ページにリダイレクトされます。 詳細ページでイメージリポジトリの基本情報を表示できます。
イメージリポジトリの詳細ページの左側のナビゲーションウィンドウで、リポジトリ名の横にあるアイコンをクリックします。 [リポジトリ] ページで、作成したイメージリポジトリを表示できます。 イメージリポジトリの [ステータス] 列に [正常] が表示されている場合、イメージリポジトリが作成されます。
ステップ4: イメージを作成する
左側のナビゲーションウィンドウで、 を選択します。 [リポジトリ] ページで、イメージリポジトリを見つけます。 リポジトリ名をクリックするか、[操作] 列の [管理] をクリックして、リポジトリの詳細ページに移動します。
左側のナビゲーションウィンドウで、[ビルド] をクリックします。 表示されるページで、[ビルドルール] セクションの [ビルドルールの追加] をクリックします。
[ビルドルールの追加] ダイアログボックスで、必要に応じてパラメーターを設定します。
項目
説明
例:
データ型
構築ルールをトリガーするためにソースコードリポジトリにプッシュされるコンテンツのタイプ。 有効な値: BranchとTag。
ブランチ
ブランチ /タグ
ビルドルールをトリガーするコードブランチまたはタグ。
master
ビルドコンテキストディレクトリ
Dockerfileのディレクトリ。 指定されたディレクトリは相対ディレクトリであり、コードブランチのルートディレクトリが親ディレクトリとなります。 この例では、Dockerfileのディレクトリは /Dockerfileです。 /を入力します。
/
Dockerfileファイル名
Dockerfileの名前。 デフォルト値: Dockerfile。 たとえば、Dockerfileのパスが /Dockerfileの場合、このパラメーターの値としてDockerfileを指定します。
Dockerfile
画像タグ
ビルドするイメージのタグ。
V1.0.0
クリック確認.
では、ビルドルールセクションで、作成したルールを見つけてクリックします。ビルドで、アクションルールに対応する列。
建物を開始すると、[ビルドログ] セクションに建物レコードが生成されます。 構築レコードのステータスが成功になると、イメージが構築されます。
手順5: Elastic Compute Service (ECS) インスタンスへのDockerのインストール
ECS コンソールにログインします。
左側のナビゲーションウィンドウで、[インスタンスとイメージ] > [インスタンス] を選択します。
[インスタンス] ページで、接続するインスタンスを見つけ、[操作] 列の [接続] をクリックします。
[リモート接続] ダイアログボックスで、[ワークベンチ] セクションの [今すぐサインイン] をクリックします。
[インスタンスログイン] ダイアログボックスで、パラメーターを指定します。 ダイアログボックスの下部で [より少ないオプション] または [より多くのオプション] を選択して、単純モードまたは詳細モードに切り替えることができます。 次の表で、関連パラメーターについて説明します。 OKをクリックします。
パラメーター
説明
インスタンス
現在のECSインスタンスの情報が自動的に入力されます。
接続
この例では、VPCが選択されています。
VPCにあるECSインスタンスに接続するには、インスタンスのパブリックIPアドレスまたはプライベートIPアドレスを使用します。
クラシックネットワークにあるECSインスタンスに接続するには、インスタンスのパブリックIPアドレスまたは内部IPアドレスを使用します。
認証方法
認証方法を選択します。 この例では、パスワードベースが選択されています。 次の認証方法がサポートされています。
パスワードベース: rootやecs-userなどのユーザー名とパスワードを入力します。
証明書ベース: rootやecs-userなどのユーザー名を入力し、証明書を入力またはアップロードします。 証明書が暗号化されている場合は、証明書のキーパスフレーズを入力します。
資格情報ベース: 資格情報を選択または作成します。
資格情報は、ユーザー名、パスワード、キーなどのインスタンス情報を保存するために使用されます。 資格情報を使用して、ユーザー名やパスワードを入力することなく、安全な方法でインスタンスにログインできます。
次のコマンドを実行して、ECSインスタンスにDockerをインストールします。
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
結果
イメージがビルドされているかどうかを確認
Container Registry Personal Editionインスタンスの管理ページの左側のナビゲーションウィンドウで、[リポジトリ] > [リポジトリ] を選択します。 リポジトリの名前をクリックするか、リポジトリに対応する [操作] 列の [管理] をクリックします。 リポジトリの詳細ページの左側のナビゲーションウィンドウで、[タグ] をクリックして、作成した画像を表示します。
Dockerでイメージを実行する
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.aliyuncs.com
次のコマンドを実行してイメージをプルします。 コマンドの
cn-hangzhou
を、Personal Editionインスタンスが存在するリージョンに置き換えます。test23432
を使用する名前空間に置き換えます。test:V1.0.0
を、使用するリポジトリ名とイメージタグに置き換えます。docker pull registry.cn-hangzhou.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.aliyuncs.com/test23432/test:V1.0.0 Hello World!