最近はコンテナを動かす基盤として、 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/ .
(以下省略)
この手法は以下のサイトを参考にしました。
マルチステージビルドの説明は以下の 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 を選択して配置する方法はちょっと分からなかったので、その辺は今後の課題です。