Azure Container Instances で簡単デプロイ

最近はコンテナを動かす基盤として、 AWS Fargate や ECS, GCP の GCE などありますが、一番簡単にコンテナをデプロイして動かすまでが出来ると思った Azure Container Instances を使ってみることにしました。

今回の前提条件として、動作させるサービス群は docker-compose.yml を用いて複数のコンテナが協調動作するものとします。またイメージは公式の Docker Hub 等から取得できるものだけでなく、自分のアプリのコンテナイメージも生成して使うものとします。

Azure Container Registry 準備

自分のアプリケーションのコンテナのために、 Azure の Container Registry を使用します。ビルドしたコンテナをこのレジストリに登録して、実行環境で Pull して使うという流れになります。

イメージのビルドと登録

イメージのビルド

Dockerfile でアプリケーションコンテナ用の定義をしているとして、まずビルドします。以下のコマンドはカレントに Dockerfile がある前提です。

docker build --target app -t (yourregistry-repo)/(name):latest  .

ここで Dockerfile はマルチステージビルドを活用するものとして、”–target” で対象を指定しています。アプリ実行環境用としてスリムなコンテナになるように配慮して、ビルド用のコンテナから必要なものだけ抽出して作るようにしています(以下参照)。

(抜粋)

FROM python:3.8-slim-buster as app
EXPOSE 8080

WORKDIR /workspace/backend
COPY --from=base /usr/local/lib/python3.8/site-packages /usr/local/lib/python3.8/site-packages

COPY backend/ .

(以下省略)

この手法は以下のサイトを参考にしました。

仕事でPythonコンテナをデプロイする人向けのDockerfile (1): オールマイティ編 | フューチャー技術ブログ
Pythonで書かれたアプリケーションをDockerイメージにする堅い方法の紹介です。イメージサイズを少しでも削ろう!とかではなくて実用性重視の方向です。今回は第一弾ということで、Debianベースのイメージを使う方法を紹介します。 続編も公開されました。 Pythonのベースイメー

マルチステージビルドの説明は以下の URL を参照してください。

マルチステージビルドの利用
マルチステージイメージを使って、イメージサイズを小さく維持する。

Azure へのログインとイメージの登録

イメージを登録するために docker コマンドで Azure へのログインをします。以下のコマンドを入力して行います。

docker login azure

成功すれば login succeeded と表示されます。
イメージをレジストリに登録するために、以下のコマンドを実行します。

docker push (yourregistry-repo)/(name):latest

コンテキストの生成

Azure Container Instances でコンテナを管理するために ACI コンテキストを生成します。このコンテキストをもって、インスタンスを作成・管理を行います。

docker context create aci myacicontext

このコマンドで

  • サブスクリプションIDの選択
  • リソースグループの選択(新規作成も可能)

といった設定をしてコンテキストが生成されます。コンテキストは以下のコマンドで確認が可能です。

docker context ls

Azure 上にコンテナを作成・実行する

Azure Container Instances 操作用のコンテキストに切り替えます。

docker context use myacicontext

デプロイ用の deploy-compose.yml が用意されているとして、プロジェクト名 HelloMyContainer として、 Azure Container Instances にデプロイ&実行するコマンドは以下の通りです。

docker -f deploy-compose.yml --project-name HelloMyContainer   compose up

もし、ファイル名が docker-compose.yml の場合にはファイル指定を省略できますし、現在のdocker-compose.yml がおいてあるフォルダ名がプロジェクト名ならそれも省略ができます。

正常にデプロイが完了し実行されていれば Azure のポータルからも確認することができます。

docker-compose によるデプロイでは、このAzure1つのコンテナーインスタンスの中にコンテナが複数(今の場合3)入っていたりします。aci コンテキスト用に1つのコンテナを使うようです(サイドカー構成)。

docker-compose.yml ファイルによるデプロイのコマンドが、 ハイフンなしのコマンド列になっている点に注意してください。

コンテナを停止する場合は以下のコマンドになります。このコマンドを実行すると実行が停止され、デプロイが解除されます。

docker -f deploy-compose.yml compose down

その他・気になったことなど

コンテナが思ったような起動・動作をしてくれない場合に調査したいことがあります。このときには、Azure のダッシュボード等からコンテナを選択し、コンテナ内のコンソールで操作をすることが出来ます。

パブリックな IP が割り当てられないときに確認すべきポイントは次の点でしょうか。

  • コンテナは起動完了状態になったか?再起動を繰り返していないか?
  • 外部公開しているポートの設定は正しいか?

まとめ

今回は Azure Container Instances で docker-compose を用いている場合のデプロイについて記載しました。単独の Dockerfile から生成されるコンテナを起動してサービスが動くようなタイプの場合は、今回のような手順よりももっと簡単になります。ACIのコンテキストすら不要で、レジストリにPush したら、それを Azure のダッシュボードから選択する形でコンテナの設定が完了します。

今回の内容は docker-compose.yml を用いている場合で、どうやって配置できるだろうかという点で調べたこと、トライしたことのまとめです。ちゃんとあるところにはドキュメントがあるのですが、なかなか日本語でトライしているものが見つからなかったため、これが誰かの役に立つと幸いです。

ダッシュボードから docker-compose.yml を選択して配置する方法はちょっと分からなかったので、その辺は今後の課題です。

参考

チュートリアル - Docker Compose を使用して複数コンテナー グループをデプロイする - Azure Container Instances
Docker Compose を使用して、複数コンテナーのアプリケーションをビルドして実行し、アプリケーションを Azure Container Instances にデプロイする
404 - コンテンツは見つかりませんでした
Run containers in Azure Container Instances straight from Docker CLI
Harden Docker images and eliminate vulnerabilities before pushing your images to a registry. Docker scan and Snyk bring professional scanning capabilities strai...
サーバー構築 プログラミング
すらりんをフォローする
すらりん日記

コメント

タイトルとURLをコピーしました