Azureでコンテナ化アプリを動かしてみよう その1

コンテナ化アプリケーションの例

仮想化技術には以前からハイパーバイザー(仮想マシン(VM)を作成するためのソフトウェア)によるサーバーの仮想化がありますが、こちらはOSやミドルウェアも仮想化の対象としています。そのため仮想サーバに割り当てられたリソースを有効に活用できるように、一つの仮想サーバに複数のミドルウェアやアプリケーションをインストールしたりデプロイして運用する方法が一般的となっています。一方でコンテナ仮想化の場合、コンテナはOSの1プロセスとして実行されるためリソースの利用を軽量に抑えることができます。この特徴を活かすため、原則として単一のアプリケーションと実行環境だけが含まれるようにコンテナを作成することが推奨されています。このことは、機能単位でアプリケーションを分割するマイクロサービス・アーキテクチャの設計思想に合っているため、マイクロサービスの構築にコンテナ化アプリケーションを採用する事例が多くあります。

Dockerについて

コンテナ化アプリケーションを実行する基盤としてコンテナ実行エンジンが必要となります。コンテナ実行エンジンとして最も有名なのがDockerです。Dockerではコンテナ化アプリケーションを「Dockerコンテナ」と呼び、実行します。Dockerコンテナは「Dockerイメージ」と呼ばれる形式でビルドされたイメージファイルをもとに起動されるプロセスです。Dockerイメージは「Dockerfile」というファイルに記述した手順に従って構築されます。

Azureが提供しているコンテナ関連のサービス

Azureではコンテナ化アプリケーションの作成や管理、実行をサポートするいくつかのサービスを提供しています。以下にコンテナ関連のサービスのうち代表的なものを挙げます。

・Azure Container Registry(ACR) Azure上でホスティングされたプライベートなDockerレジストリです。DockerレジストリはDockerイメージをバージョンごとに管理することのできる保管庫のことで、DockerレジストリにあるDockerイメージを取得(プル)したり、自分が作成したDockerイメージを登録(プッシュ)することができます。パブリックなDockerレジストリとしてはDocker Hubがあり、様々なミドルウェアやツールのDockerイメージが公開されています。ACRはプライベートなDockerレジストリのため、ビジネスに特化したアプリケーションのようにセキュアな情報を含むDockerイメージを範囲を限定して公開することができるようになります。

・Azure Container Instances(ACI) Azure上でコンテナ化アプリケーションを実行する方法のひとつが、Azure Container Instances(ACI)の利用です。ACIを利用することで自前でVMなどのサーバを構築せずに、サーバレスでコンテナを実行することができます。ACIは比較的単純なアプリケーションやバッチ処理など、単一のコンテナでアプリケーションを実行することを想定したサービスとなっています。

・Web App for Containers(App Service) Web App for ContainersはAzure App Serviceの利用形態のひとつで、App Service上にWebアプリケーション用途のDockerコンテナをデプロイすることができます。App Serviceのリソースと知識を使ってコンテナ化アプリケーションを実行することができるので、App Serviceの利用経験がある場合は比較的容易に運用をすることができます。

・Azure Kubernetes Service(AKS) コンテナ化アプリケーションのデプロイやスケーリングなどの管理を自動化するためのプラットフォームであるKubernetesをAzure上で利用できるのがAzure Kubernetes Service(AKS)です。Kubernetesは複数のコンテナを協調させてアプリケーションを構築する場合に有用で、その役割からコンテナオーケストレーションエンジンと呼ばれています。Kubernetesは任意の環境に構築して利用することができますが、AKSを利用することでKubernetesの主要なコンポーネントをAzureがホスティングし管理してくれるため、煩わしい保守を軽減することができます。

・Azure Container Apps Azure Container Appsもサーバレスなコンテナ実行のためのサービスで、Webアプリケーションやバッチアプリケーションを実行することができます。Azure Container Appsもサービスの基盤としてKubernetesを使用していますが、KubernetesのAPIを直接使用できないようになっているため開発者はアプリケーションの実装に集中できるようになっています。そのためAKSに比べてKubernetes関連の設定の自由度は低いですが、気軽にマイクロサービスを構築したい場合に選択肢として検討する価値があります。なおAzure Container Appsは「Microsoft Ignite 2021」で発表された新しいサービスで、執筆時点ではプレビュー版として提供されています。

Azure Container Registryにコンテナイメージを登録しよう

ここからは、Azure Container Registry(ACR)の使い方について説明していきます。実際にAzure上にコンテナレジストリを作成して、Dockerイメージのプッシュ(アップロード)とプル(ダウンロード)の操作を行っていきます。なおコンテナレジストリにDockerイメージを登録する方法は大きく分けて2通りあります。1つ目がローカルマシンやビルドマシン上でビルドしたDockerイメージをコンテナレジストリへプッシュする方法です。2つ目がACRタスクというACRの機能を使い、Azure上でDockerイメージを作成してコンテナレジストリへプッシュする方法です。今回は前者の方法でDockerイメージを登録する手順について説明していきます。

コンテナレジストリの作成

まずはコンテナレジストリの作成を行います。Azureポータルにログインして、画面上部の検索バーに「コンテナ」と入力して表示される「コンテナー レジストリ」を選択します。コンテナレジストリの一覧画面が表示されるので、画面左上の「作成」ボタンか、画面下部の「コンテナー レジストリの作成」ボタンを選択します。

コンテナレジストリの新規作成画面が表示されたら、内容を入力していきます。「サブスクリプション」および「リソースグループ」は任意のものを選択します。「レジストリ名」には作成するコンテナレジストリに使用する名称を入力します。レジストリ名はACRで一意となる必要があります。「場所」ではコンテナレジストリを配置するリージョンを指定します。「SKU」はコンテナレジストリの価格プランを指します。コンテナレジストリのストレージサイズやgeoレプリケーションの有無などがSKUによって異なります。今回は開発・検証用途のため、最も低コストな「Basic」プランを選択します。SKUがBasicプランの場合は、「ネットワーク」および「暗号化」のタブで設定を変更できる項目がないため、「確認および作成」ボタンを選択します。

確認画面に遷移し、入力内容に誤りがなければ「作成」ボタンを選択してコンテナレジストリの作成を開始します。

しばらく待つとコンテナレジストリの作成が完了します。完了したら、Dockerイメージをコンテナレジストリに登録することができるようになります。

Dockerイメージの作成

ここからはDockerを使ってコンテナレジストリにプッシュするためのコンテナイメージ(Dockerイメージ)を作成していきます。Dockerイメージの作成など、dockerコマンドを使った様々なコンテナの操作を行うためには「Docker Desktop」が必要となります。Docker Desktopは個人利用の場合は無料で使用できるので、インストールがまだの場合は[Docker Desktopのインストールページよりインストールを行って下さい。Docker Desktopが用意できたら、コンテナレジストリにプッシュするDockerイメージを用意していきます。Dockerイメージを作成するためには、「Dockerfile」と呼ばれるDockerイメージ構築用のスクリプトファイルを作成します。Dockerfileをもとにローカルマシン上でDockerイメージをビルドし、それをACRにプッシュしていきます。まずは任意のディレクトリを新規作成し、その中に「Dockerfile」という名前のファイルを作成して以下の1行を記述します。

Hello Worldを出力するDockerイメージの作成(Dockerfile)

FROM hello-world:latest

Dockerfileでは、行の先頭で命令と呼ばれるコマンドを指定し、その後ろに命令の引数となる内容を記述していきます。上記のDockerfileでは「FROM」命令を使用しています。FROM命令では、ビルドするDockerイメージのベースとなるイメージを指定します。今回はDockerが提供している公式イメージである「hello-world」というイメージをベースイメージとして指定しています。「:latest」の部分はDockerでは「タグ」と呼ばれるもので、イメージのバージョンを指定する記述になります。latestを指定した場合は、最新バージョンのイメージを参照することができます。Dockerfileを作成したら、Dockerイメージをビルドします。ターミナルで以下のコマンドを実行します。

Azureでコンテナ化アプリを動かしてみよう その1

Dockerイメージのビルド

$ cd $ docker build -t zerokara-sample:0.1 .

dockerコマンドのサブコマンドである「build」コマンドを使用することで、DockerfileからDockerイメージをビルドすることができます。「-t」オプションでイメージの名前とタグ(バージョン)を指定することができます。今回は「zerokara-sample」というイメージ名と「0.1」というタグを指定しています。コマンドの最後のピリオドは、Dockerfileのありかを相対パスで指定してます。現在はDockerfileのあるディレクトリでコマンドを実行しているので、カレントディレクトリを表す「.」を指定しています。

docker buildコマンドの実行後、「docker images」コマンドを実行して作成したイメージが一覧に表示されていることを確認します。

Dockerイメージの確認

$ docker imagesREPOSITORY TAG IMAGE ID CREATEDSIZEzerokara-samplelatest bb31f47d8cce2 months ago13.3kB

docker imagesコマンドを実行すると、現在のマシンに存在するDockerイメージの一覧を表示することができます。上記のように、「REPOSITORY」列に先程ビルドした「zerokara-sample」という名前のイメージが表示されていればビルドは成功しています。

Dockerコンテナの起動

続いて作成したDockerイメージをもとに、コンテナを起動できるか試してみます。

作成したDockerイメージからコンテナを起動する

$ docker run zerokara-sample:0.1Hello from Docker!This message shows that your installation appears to be working correctly.・・・中略

「docker run」コマンドを実行することでDockerイメージからコンテナを起動することができます。コマンドの引数にはDockerイメージ名とタグ名を指定します。コンテナを起動した結果、「Hello from Docker!」というメッセージが標準出力に表示されました。これはベースイメージである「hello-world」の中で実装されたアプリケーションコードが実行されたことを表しています。Dockerイメージが用意できたので、次はコンテナレジストリにイメージをプッシュしていきます。

DockerイメージをACRにプッシュする

DockerイメージをACRのコンテナレジストリへプッシュするためには、ターミナルでAzure CLIおよびdockerコマンドを使用します。まずは先程作成したACRのコンテナレジストリに接続していきます。

コンテナレジストリにログインする

$ az login・・・中略$ az acr login --name zerokaraLogin Succeeded

まずターミナル上でAzureにログインした状態となるために、Azure CLIの「az login」コマンドを実行します。Azureに未ログインの場合はここでブラウザが表示されてAzureの認証画面が表示されるので、認証処理を行います。ブラウザでの認証が成功すると、ターミナルにAzureアカウント情報のJSONが出力されます。次にACRのコンテナレジストリに対してもログインします。コンテナレジストリへログインすることでイメージのプルやプッシュを行うことができるようになります。「az acr login」コマンドに「--name」オプションで先程作成したコンテナレジストリのレジストリ名を指定して実行します。コマンド実行後、「Login Succeeded」と出力されればログインは成功です。コンテナレジストリへのログインまで完了したら、Dockerイメージをレジストリへプッシュしていきます。Dockerイメージをコンテナレジストリへプッシュするためには、まずイメージの名称をコンテナレジストリへプッシュできる形式に変更する必要があります。「docker tag」コマンドを使うことで、Dockerイメージに別のイメージ名を付与することができます。「docker tag」に続く最初の引数には参照元となるイメージの名前とタグを指定します。2つ目の引数に参照先のイメージ名とタグを指定します。参照先のイメージ名の前に、プッシュ先のコンテナレジストリのホスト名とスラッシュを入れることでコンテナレジストリへプッシュできるようになります。コンテナレジストリのホスト名は、ACRの場合は「コンテナレジストリ名 + azurecr.io」となります。

Dockerイメージに別名を付与する

$ docker tag zerokara-sample:0.1 zerokara.azurecr.io/zerokara-sample:0.1

この状態で一度イメージの一覧を確認してみます。

Dockerイメージの確認

$ docker imagesREPOSITORY TAG IMAGE ID CREATEDSIZEzerokara-sample0.1 bb31f47d8cce2 months ago13.3kBzerokara.azurecr.io/zerokara-sample0.1 bb31f47d8cce2 months ago13.3kB

DockerfileからビルドしたDockerイメージに加え、docker tagで別名を付与したイメージも一覧に表示されるようになりました。イメージの実体はどちらも同じものなので、「IMAGE ID」や「SIZE」は同じ値となっていることが分かります。最後に「docker push」コマンドでDockerイメージをコンテナレジストリにプッシュします。

Dockerイメージをコンテナレジストリへプッシュする

$ docker push zerokara.azurecr.io/zerokara-sample:0.1

プッシュ完了後、Azureポータルからコンテナレジストリのメニュー内の「リポジトリ」を確認すると、プッシュしたDockerイメージおよびタグが表示されていることを確認することができます。

ACRのコンテナレジストリにDockerイメージをプッシュすると、「リポジトリ」メニュー内に一覧表示されるようになります。今回は1つのDockerイメージの1つのタグのみをプッシュしましたが、複数のDockerイメージおよび複数のタグを登録して確認することができます。

ACRからDockerイメージをプルしてコンテナを起動する

最後に、ACRのコンテナレジストリに登録したDockerイメージをローカルマシンにプルしてコンテナを起動できるかを試してみます。動作確認のために現在ローカルマシンにある、プッシュに使用したDockerイメージを一度削除します。「docker rmi」コマンドを使うことでローカルマシン上にあるDockerイメージを削除することができます。

ローカルマシンにあるDockerイメージを一度削除する

$ docker rmi zerokara.azurecr.io/zerokara-sample:0.1

Dockerイメージの削除後にdocker imagesコマンドを実行すると、イメージの一覧から該当のDockerイメージが削除されていることを確認することができます。削除されていることが確認できたら、ACRのコンテナレジストリからイメージをプルします。

ACRのコンテナレジストリからDockerイメージをプルする

$ docker pull zerokara.azurecr.io/zerokara-sample:0.10.1: Pulling from zerokara-sampleDigest: sha256:f778eedb947aadf60ec077c8458c1abed9a05d98cd192d77b2cfbc560c5a37dcStatus: Downloaded newer image for zerokara.azurecr.io/zerokara-sample:0.1zerokara.azurecr.io/zerokara-sample:0.1

「docker pull」コマンドを実行すると、引数に指定したコンテナレジストリのホストから該当のDockerイメージ名とタグを持つDockerイメージをプル(ダウンロード)することができます。プルの完了後にdocker imagesコマンドを実行すると、イメージの一覧に再び該当のDockerイメージが表示されていることが確認できます。プルしたDockerイメージを使って、コンテナを起動してみます。

コンテナレジストリからプルしたDockerイメージを使ってコンテナを起動する

$ docker run zerokara.azurecr.io/zerokara-sample:0.1Hello from Docker!This message shows that your installation appears to be working correctly.・・・中略

docker runコマンドの引数にACRのコンテナレジストリからプルしたDockerイメージを指定してコンテナを起動し、先程と同じ実行結果が表示されることが確認できました。

なお、Azure Container Registryはコンテナレジストリが存在する間は課金が発生するため、必要に応じて今回作成したコンテナレジストリは削除して下さい。

コンテナレジストリの削除

az acr delete --name zerokara

コンテナレジストリを削除すると、プッシュしたコンテナイメージも削除されますので注意して下さい

まとめ

今回はAzureで提供しているコンテナ化アプリケーションのためのサービスについての紹介と、Azure Container Registry(ACR)の使い方について説明しました。dockerコマンドを使ってACRにDockerイメージをプッシュしたりプルする方法が分かったかと思います。ACRは他のコンテナ化アプリケーションを実行するAzureサービスから利用されるサービスであるため、使い方について良く理解しておく必要があります。次回は引き続きAzure Container Registryを取り上げ、ACRタスクと呼ばれる機能を使ってコンテナイメージを作成していく方法について説明していく予定です。

関連記事