---
title: "Azure Container Instancesを使ってみた | grasys blog"
url: "https://blog.grasys.io/post/arai/azure-container-instances"
description: "grasysの新井です。 今回はAzureのコンテナーサービスの一つ「Azure Container Instances」について特徴や構築方法をご紹介します。 Azure Container Instances(ACI)とは サーバーレスなマネージドAzure環境内でコンテナーをオンデマンドで実行できるリソース。…"
---

# Azure Container Instancesを使ってみた

-   ![](/_astro/noicon.CTHOhNiB_1HMs6A.webp)[arai](/authors/arai/)
-   公開日：2023年4月25日
-   カテゴリー：[Tech](/categories/tech/)
-   タグ：[#Azure](/tags/azure/)[#Azure Container Instances](/tags/azure-container-instances/)

![Azure Container Instancesを使ってみた](/_astro/hero.Dvk4KfQE_1PQFeR.webp)

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を経由してAzure Container Instancesへデプロイする構成図](/_astro/01-blog-continer-instances-6.drawio-967b654f.CVOJIkmk_Z2tNvc3.webp)

上記、構成図のような環境を構築していく。  
ローカルPCからイメージをAzure Container Registryへpushし、Azure Container Instances側へデプロイしていく。  
コンテナーグループ内ではphp-fpmコンテナーとサイドカーとしてnginxコンテナーを起動させる。

### コンテナーグループとは？

同じホストコンピュータ上にスケジュール設定されるコンテナのコレクション。kubernatesのPodのようなもの。

![2つのコンテナーとAzure Filesで構成されたAzure Container Instancesのコンテナーグループ](/_astro/02-1d1f58b7f3d36b5a3e9a883ab402f7e3-1024x842-8966eefe.B7UaRULx_Yebqj.webp)

_参照元: [https://learn.microsoft.com/ja-jp/azure/container-instances/container-instances-container-groups](https://learn.microsoft.com/ja-jp/azure/container-instances/container-instances-container-groups)_

## 構築手順

#### 1\. コンテナーレジストリを作成していく。

「コンテナレジストリ」で検索し該当リソースを開く。

![Azure Portalでコンテナーレジストリを検索する画面](/_astro/03-c8e050913b46566b040cc40e3fcb5b8e-a360cf3d.BepW0Lez_16o8pt.webp)

必要な項目を入力する。

![Azure Container Registryの基本情報入力画面](/_astro/04-Photokako-mosaic-1lybNc7rzBOkxHEG-88305858.EWBqMneG_2tjeBh.webp)

| 項目名 | 説明 |
| --- | --- |
| サブスクリプション | リソース使用料などの支払い単位、かつリソースのスコープ単位。 リソースの論理コンテナー。 |
| リソースグループ | 複数リソースをブループ化し管理するための仕組み。 |
| レジストリ | ACRのリポジトリ名。 |
| 場所(ロケーション) | サービスを稼働させる場所。 |
| SKU | サービス階層。 Basic, Standard, Premiumに分かれており、すべて同じプログラム機能を有しているが、レジストリの容量や使用パターンによりオプションが分かれる。 |

SKUの詳細: [https://learn.microsoft.com/ja-jp/azure/container-registry/container-registry-skus](https://learn.microsoft.com/ja-jp/azure/container-registry/container-registry-skus)

ネットワーク設定は今回publicで設定する。  
プライベートネットワークを使用したい場合は、SKUをPremiumへアップグレードする必要がある。

![Azure Container Registryのネットワーク設定画面](/_astro/05-57bcecea1524aff2ab121806e798962a-1e4fcaa9.CyUTu94r_Zn8VTY.webp)

ここまで完了したら、「確認および作成」ボタン→「作成」ボタンをクリックしレジストリを作成する。

### 2\. ローカルでイメージを作成する

#### ディレクトリ構成

Plain textcontent\_copy

```
.
├── docker-compose.yml
├── container-group.yml
├── nginx
│   ├── Dockerfile
│   └── default.conf
└── php-fpm
    ├── Dockerfile
    └── src
        └── index.php
```

-   nginx/default.conf

Plain textcontent\_copy

```
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

Plain textcontent\_copy

```
FROM nginx:latest
COPY ./default.conf /etc/nginx/conf.d/default.conf
```

-   php-fpm/Dockerfile

Plain textcontent\_copy

```
FROM php:8.2-fpm
COPY src /var/www/html
```

-   php-fpm/src/index.php

Plain textcontent\_copy

```
<?php
phpinfo();
```

-   docker-compose.yml

Plain textcontent\_copy

```
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
```

イメージとタグを作成する。

Plain textcontent\_copy

```
# イメージ作成
$ 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へログインする。

Plain textcontent\_copy

```
# azureへログイン
az login

# acrへログイン
# az acr login --name {{ REGISTRY_NAME }}
az acr login --name araiblog
```

イメージをACRへプッシュする。

Plain textcontent\_copy

```
# 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ポータルへログインし、「コンテナーレジストリ」を検索し、「リポジトリ」をクリックする。

![Azure Container Registryにプッシュしたコンテナーイメージ一覧](/_astro/06-Photokako-mosaic-fmeH8OgEraAk0yCp-1024x297-9989fd00.MJM6_Jtj_fsv7y.webp)

### 4\. コンテナーグループを作成する。

container-group.ymlを作成。

Plain textcontent\_copy

```
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ポータルの「コンテナーレジストリ」→「アクセスキー」内の管理者ユーザーを有効化した際のユーザー名とパスワードを利用する。

![Azure Container Registryのアクセスキー画面](/_astro/07-Photokako-mosaic-XcoP208OmnROR6du-3c099a2b.CzJa4BjI_Z4Btj9.webp)

今回は管理者ユーザーのユーザ名とパスワードを利用するが、プロダクトを運用する場合はよりセキュアな認証として[マネージドID](https://learn.microsoft.com/ja-jp/azure/container-instances/container-instances-managed-identity)や[サービスプリンシパル](https://learn.microsoft.com/ja-jp/azure/container-instances/container-instances-using-azure-container-registry)を使用し、最低限の権限付与にする必要がある。

作成したcontainer-group.ymlを用いて、ACIへアプリケーションをデプロイしていく。

Plain textcontent\_copy

```
# az container create --resource-group {{ RESOURCE_GROUP_NAME }} --file {{ YAML_FILE }}
$ az container create --resource-group arai-container-instances --file container-group.yml
```

デプロイをWEBコンソールから確認する。

![Azure Portalのコンテナーインスタンス概要画面](/_astro/08-Photokako-mosaic-f3mlvfXjAEosAWxY-faa96fb9.DUIepkMg_1AIU1k.webp)

上記、ページに表示されているIPアドレスをブラウザへ入力し、表示を確認する。

![Azure Container Instancesで公開したphpinfoページ](/_astro/09-Photokako-mosaic-Sy4abqdn6wOpEVKp-85d842ee.CRwvF7SX_Z2kJSUI.webp)

## まとめ

今回はAzure Container Instancesの構築方法やリソースの特徴を紹介してきました。普段、Dockerを利用していなくて手始めとして触れるにはよいリソースだと感じました。HTTPS通信をする場合はユーザ自身でSSL化しないといけないなど、ユーザ側で管理する手間がかかる部分はあるものの、Azure内でコンテナーを手軽に動かしてみたい場合の選択肢の一つにはなると思います。  
機会があれば他のAzureコンテナーサービスも使用してみたいと思います。

## この記事を書いた人

[![](/_astro/noicon.CTHOhNiB_Z24aAgM.webp)](/authors/arai/)

### [arai](/authors/arai/)

araiのプロフィールと執筆記事をご覧いただけます。

[プロフィールと記事一覧](/authors/arai/)