目次
grasysの新井です。
今回はAzureのコンテナーサービスの一つ「Azure Container Instances」について特徴や構築方法をご紹介します。
Azure Container Instances(ACI)とは
サーバーレスなマネージドAzure環境内でコンテナーをオンデマンドで実行できるリソース。
仮想マシンをプロビジョニングする必要はなく、コマンド1つで簡単にコンテナを実行できる。
また数秒で起動し、稼働した秒単位で課金される。
特徴
- サーバーを管理することなくコンテナーを実行できる。
- コンテナーグループを利用し、マルチコンテナーアプリケーションをデプロイできる。
- ハイパーバイザー分離によってアプリケーションのセキュリティを保護できる。
できないこと
- ACI単体もしくはAzure Load Balancerでのオートスケーリングはできない。
→ Azure Kubernetes Service (AKS)と連携させることでロードバランシングを実現することはできる。
- HTTPS通信をマネージドサービスで実現できない。
→ ユーザ自身がサイドカーコンテナーでプロキシサーバなどを建ててTLS/SSL化する必要がある。
料金プラン
- 従量課金制
稼働したCPUとメモリに対して、秒単位に課金される。
- コンピューディング用のAzure節約プラン
1年間もしくは3年間コンピュートリソースに対して時間単位の固定金額を支払うコミットをすることで、割引を受けることができる。
実際に使ってみる
上記、構成図のような環境を構築していく。
ローカルPCからイメージをAzure Container Registryへpushし、Azure Container Instances側へデプロイしていく。
コンテナーグループ内ではphp-fpmコンテナーとサイドカーとしてnginxコンテナーを起動させる。
コンテナーグループとは?
同じホストコンピュータ上にスケジュール設定されるコンテナのコレクション。kubernatesのPodのようなもの。
参照元: https://learn.microsoft.com/ja-jp/azure/container-instances/container-instances-container-groups
構築手順
1. コンテナーレジストリを作成していく。
「コンテナレジストリ」で検索し該当リソースを開く。
必要な項目を入力する。
項目名 | 説明 |
サブスクリプション | リソース使用料などの支払い単位、かつリソースのスコープ単位。 リソースの論理コンテナー。 |
リソースグループ | 複数リソースをブループ化し管理するための仕組み。 |
レジストリ | ACRのリポジトリ名。 |
場所(ロケーション) | サービスを稼働させる場所。 |
SKU | サービス階層。 Basic, Standard, Premiumに分かれており、すべて同じプログラム機能を有しているが、レジストリの容量や使用パターンによりオプションが分かれる。 |
SKUの詳細: https://learn.microsoft.com/ja-jp/azure/container-registry/container-registry-skus
ネットワーク設定は今回publicで設定する。
プライベートネットワークを使用したい場合は、SKUをPremiumへアップグレードする必要がある。
ここまで完了したら、「確認および作成」ボタン→「作成」ボタンをクリックしレジストリを作成する。
2. ローカルでイメージを作成する
ディレクトリ構成
.
├── docker-compose.yml
├── container-group.yml
├── nginx
│ ├── Dockerfile
│ └── default.conf
└── php-fpm
├── Dockerfile
└── src
└── index.php
- nginx/default.conf
server {
listen 80;
server_name localhost;
root /var/www/html;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
- nginx/Dockerfile
FROM nginx:latest
COPY ./default.conf /etc/nginx/conf.d/default.conf
- php-fpm/Dockerfile
FROM php:8.2-fpm
COPY src /var/www/html
- php-fpm/src/index.php
<?php
phpinfo();
- docker-compose.yml
version: "3"
services:
nginx:
build: ./nginx
tty: true
ports:
- "80:80"
volumes:
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
depends_on:
- php
php:
build: ./php-fpm
tty: true
ports:
- "9000:9000"
volumes:
- ./php-fpm/src:/var/www/html
イメージとタグを作成する。
# イメージ作成
$ docker-compose build
# タグ作成
$ docker tag blog-php:latest araiblog.azurecr.io/blog-php:latest
$ docker tag blog-nginx:latest araiblog.azurecr.io/blog-nginx:latest
# 作成したイメージを確認
$ docker images | grep blog
araiblog.azurecr.io/blog-php latest ac079c1f757b About an hour ago 450MB
blog-php latest ac079c1f757b About an hour ago 450MB
araiblog.azurecr.io/blog-nginx latest 9c520d1c109f About an hour ago 142MB
blog-nginx latest 9c520d1c109f About an hour ago 142MB
3. Azure Container Registry(ACR)へプッシュする。
Azure、ACRへログインする。
# azureへログイン
az login
# acrへログイン
# az acr login --name {{ REGISTRY_NAME }}
az acr login --name araiblog
イメージをACRへプッシュする。
# docker push <YOUR_ACR_NAME>.azurecr.io/blog-php:latest
$ docker push araiblog.azurecr.io/blog-php:latest
$ docker push araiblog.azurecr.io/blog-nginx:latest
レポジトリでホスティングされたことを確認する。
Azureポータルへログインし、「コンテナーレジストリ」を検索し、「リポジトリ」をクリックする。
4. コンテナーグループを作成する。
container-group.ymlを作成。
apiVersion: 2021-10-01
location: japanwest
# コンテナグループ名
name: araiBlogContainerGroup
properties:
containers:
- name: nginx
properties:
# ACRのイメージを指定
image: araiblog.azurecr.io/blog-nginx:latest
resources:
requests:
cpu: 1
memoryInGb: 1.5
ports:
- protocol: tcp
port: 80
- name: php
properties:
# ACRのイメージを指定
image: araiblog.azurecr.io/blog-php:latest
resources:
requests:
cpu: 1
memoryInGb: 1.5
ports:
- protocol: tcp
port: 9000
# ACRの管理者ユーザークレデンシャルを指定
imageRegistryCredentials:
- server: {{ LOGIN_SERVER }}
username: {{ USER_NAME }}
password: {{ PASSWORD }}
osType: Linux
restartPolicy: OnFailure
ipAddress:
type: Public
ports:
- protocol: tcp
port: 80
sku: Standard
type: Microsoft.ContainerInstance/containerGroups
今回のACRのクレデンシャルはAzureポータルの「コンテナーレジストリ」→「アクセスキー」内の管理者ユーザーを有効化した際のユーザー名とパスワードを利用する。
今回は管理者ユーザーのユーザ名とパスワードを利用するが、プロダクトを運用する場合はよりセキュアな認証としてマネージドIDやサービスプリンシパルを使用し、最低限の権限付与にする必要がある。
作成したcontainer-group.ymlを用いて、ACIへアプリケーションをデプロイしていく。
# az container create --resource-group {{ RESOURCE_GROUP_NAME }} --file {{ YAML_FILE }}
$ az container create --resource-group arai-container-instances --file container-group.yml
デプロイをWEBコンソールから確認する。
上記、ページに表示されているIPアドレスをブラウザへ入力し、表示を確認する。
まとめ
今回はAzure Container Instancesの構築方法やリソースの特徴を紹介してきました。普段、Dockerを利用していなくて手始めとして触れるにはよいリソースだと感じました。HTTPS通信をする場合はユーザ自身でSSL化しないといけないなど、ユーザ側で管理する手間がかかる部分はあるものの、Azure内でコンテナーを手軽に動かしてみたい場合の選択肢の一つにはなると思います。
機会があれば他のAzureコンテナーサービスも使用してみたいと思います。