自作 Docker イメージを Web App for Containers と Azure Container Instance で動かしてみた

こんにちは。エクセルソフトの田淵です。

> 2017/9/9 時点での情報です。
> 2017/09/11 追記：色々と乱暴に書いてしまったので価格とリンクを修正しました。後、混乱していた Web App on Linux と Web App for Containers について追記しました。日本語のキャプションが間違いだそうで、正式には「Web App for Containers」で良いみたいです！

現在 [jazug 7周年総会](https://jazug.connpass.com/event/64609/) のもくもく部屋でもくもくしています。

[@shibayan](https://twitter.com/shibayan) 先生に Web App for Containers（日本語UIでは Web App on Linux）と Azure Container Instance について教えてもらいましたので共有します。

## まずはそれぞれのサービスについておさらい

### App Service on Linux とは

一応こっちも簡単に説明。

<img width="339" alt="スクリーンショット 2017-09-11 14.21.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/32453/1cdaa9d6-49a3-2d7d-dbcd-dabe3196c966.png">

いわゆるこのアイコンです。いつものやつ。これの作成時に OS で Linux を選ぶと App Service on Linux の Web App と呼ばれているものになると想像。（なんだかとてもややこしいですｗ

つまり、Web アプリケーションを Linux 上で Web App として動かせるものです（のはず）。今まで Windows 上の Web App で動いていたランタイムは .NET Framework で PHP と Java と Python が使えるだけでしたが、App Service on Linux は Web App を作成する時に「OS」から `Linux (プレビュー)` を選ぶと使え、

<img width="1438" alt="スクリーンショット 2017-09-11 11.10.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/32453/4c9b53ad-da1a-4685-0f08-87ed921309e3.png">

ランタイムとして、Node.js の 4.4〜8.1、PHP 5.6／7.0、.Net Core 1.0／1.1、Ruby 2.3 が使えるようです。

<img width="229" alt="スクリーンショット 2017-09-11 11.10.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/32453/ff60cac3-c587-8929-0b15-8062e9a710e2.png">

さらに、この Web App は Docker で動いていて、これらのランタイムが使えるのは「ビルトイン」の Docker イメージのようです。

<img width="1411" alt="スクリーンショット 2017-09-11 11.44.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/32453/ba13af2b-530e-d79f-0c54-c6a8c7c76b6e.png">

これは作成済みの App Service on Linux の Web App のプロパティですが、「Docker コンテナー」の項目があり、ビルトインが選択されています。


### Web App for Containers（日本語UIでは Web App on Linux になっているのでさらにややこしい）とは

普通に Web App on Linux を新規作成する時には Docker Hub などの Docker イメージをソースとしては選べないのですが、新規作成時に選べるようにしたテンプレートが、Web App for Containers（日本語UIでは Web App on Linux）だと思われます。

<img width="585" alt="スクリーンショット 2017-09-11 13.34.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/32453/a73da0f7-662e-9aff-f7cc-47064a08ee42.png">

<img width="585" alt="スクリーンショット 2017-09-11 13.37.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/32453/aa10d28c-5f6a-6322-50e8-b7da6f1754ea.png">

この紫のコンテナーのアイコンから Web App を作成すると、作成時に Docker コンテナイメージを指定できるため、事実上どんなランタイムの Web アプリケーションでも Docker イメージさえ作れば、Web App としてスケールさせたり https を利用したりできるっぽいですね。

感覚的には、Azure Container Service で Swarm や Kubernetes などのオーケストレーションを用意する代わりに、Web App の仕組みでスケールできるぜ！って感じかなぁと思っています。（詳しい方は教えてください）

Web App on Linux の詳細は、[Azure App Service の新機能 – Web App on Linux (プレビュー) – MSDN オンライン チームブログ](https://blogs.msdn.microsoft.com/devamm/2017/07/25/see-whats-new-for-azure-app-service-on-linux-preview/) をご覧ください。


### Azure Container Instance とは

[Azure Container Instances は Hypervisor レベルでの分離を備えた次世代のコンテナ実行環境 - しばやん雑記](http://blog.shibayan.jp/entry/20170727/1501088370) をご覧ください。

## やってみよう

では実際に作ってみましょう。今回は https://hub.docker.com/r/ytabuchi/realm/ のイメージを使用しました。Dockerfile は [こちら](https://github.com/ytabuchi/RealmDocker/blob/master/docker/Dockerfile) です。

両方 Microsoft Azure のサービスなので、Azure の通常のアカウント、評価アカウント、Dev Essential、BizSpark、MSDN など、Azure のクレジットが使えるサブスクリプションを用意してください。Dev Essential は、開発者向けに１ヶ月3,000円分の無料枠が使える素晴らしいサービスなので、お持ちでない方はぜひ[申し込んでみてください](https://www.visualstudio.com/ja/dev-essentials/)。

### Web App for Containers

Web App の実行イメージとして Docker イメージをそのまま使えるというものです。Web App のインスタンスとなるので、Web App の機能、URL や https やスケールなど各種機能を使えます。ただし、Free のプランは存在せず、月額 5,000円くらいが最低掛かります。

<img width="584" alt="スクリーンショット 2017-09-11 10.13.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/32453/77ded7c4-a5b6-791d-a298-92b34f5eb6da.png">

作り方は、Azure のポータルから、「コンテナー＞Web App on Linux（英語UIの場合は Web App for Containers）」を選択し、アプリ名、リソースグループ、プランを決めたら、後は「コンテナーの構成」から、Docker Hub や Azure Container Registry のパスを指定するだけです。

<img width="1344" alt="スクリーンショット 2017-09-09 15.46.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/32453/79678132-2348-b0bb-6680-c8d52bae4985.png">

今回使用した Realm Mobile Platform のイメージは 440MB ほどあるので、内部的に `docker pull` してくるのに少し時間が掛かりましたが、イメージはキャッシュされるようなので、次回からは早くなりそうです。

無事実行できました！

<img width="1345" alt="スクリーンショット 2017-09-09 15.52.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/32453/af3452e8-afec-171c-5394-2e907fce6a33.png">

では今日の本命、Azure Container Instance をみてみましょう。


### Azure Container Instance

Azure ポータルから「コンテナー＞Azure Container Instances (preview)」を選択します。

<img width="645" alt="スクリーンショット 2017-09-09 17.16.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/32453/1521c208-4ba9-35b4-90c6-12fd38507f92.png">

コンテナ名、Docker Hub イメージのパス（Azure ポータルからは Docker Hub からしか選べないみたい？ CLI 環境ではもっと色々できるらしいです。）、リソースグループなどを選びます。現時点では場所が「米国西部、米国東部、ヨーロッパ西部」です。

<img width="630" alt="スクリーンショット 2017-09-09 16.23.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/32453/73a3bae6-8573-7eec-d913-b9300e6d8600.png">

コア数、メモリ、「Public IP address」（Yes にしましょう）とポートを決めます。複数ポートを公開する場合などは CLI でやるとできるみたいです。今回は 9080 ポートを Dockerfile で `EXPOSE` してあるので、9080 を指定しました。

<img width="632" alt="スクリーンショット 2017-09-09 16.23.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/32453/25c1be54-13ba-1e2f-538f-dd3a201a6c51.png">

バリデーションがパスすると、OK ボタンが押せるようになります。

<img width="898" alt="スクリーンショット 2017-09-09 16.24.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/32453/bb250432-17d7-7ffe-dedb-92418c6a1074.png">

たったこれだけ。４クリックで Docker イメージが起動してしまいました！！！

それだけではありません。驚くべきはその [価格](https://azure.microsoft.com/en-us/pricing/details/container-instances/) です。

|課金対象|価格|
|---|---|
|コンテナインスタンス作成| 一個作るあたり 0.26円|
|コンテナインスタンス期間|メモリ: １GB（1秒）あたり 0.001275円 <br /> コア: １コア（1秒）あたり 0.001275円|

意味わからないですね。上記の価格計算ページの価格サンプルでは

- 1コア、1GB のコンテナインスタンスを1日1回30日間作成。各インスタンスは5分間(300秒)起動した。<br />合計額：30.60円
- 1コア、2GBのコンテナインスタンスを1日50回30日間作成。各インスタンスは2分30秒(150秒)起動した。<br />合計額：1,243.13円

と記載されていましたｗ 安いｗｗ

試験環境やとりあえず Docker を試してみたい方は、Azure Container Instance はすごくおすすめだなと感じました。

ぜひみなさん使ってみてください〜(^^)

以上です。