イノベーション エンジニアブログ


株式会社イノベーションのエンジニアたちの技術系ブログです。ITトレンド・List Finderの開発をベースに、業務外での技術研究などもブログとして発信していってます!


このエントリーをはてなブックマークに追加

Docker イメージを Azure Container Instances で動かしてみた

お久しぶりです、ドラゴンクエスト11でカジノのマジスロにハマり過ぎ、全く冒険が進まない syoga です。

以前の 記事 通り、PS4版と3DS版両方購入しましたが、マジスロはPS4版にしか実装されていないため、PS4版を進めざるを得ない状況となっています。

激アツが本当にアツいっていいですね!

さて、最近弊社の某プロダクトでは空前の Docker ブーム(?)が到来しております、そんな中 Microsoft Azure で新たなコンテナサービスが発表されましたので、今回はそちらに触れてみようと思います。

そもそもコンテナって?

皆様ご存知かとは思いますが、自身の復習も兼ねてざっくり記載したいと思います。

従来の仮想化について

従来の仮想化というと、物理コンピュータ上にソフトウェアで仮想的なコンピュータを構築したり、ハイパーバイザという専用ソフトウェア上に仮想的なコンピュータを構築するという、PC上に仮想PCを作るというイメージでした。

どのような仮想化の方法があるのかを、確認してみます。

ホストOS型

物理コンピュータのハードウェア上で実行されているOS(ホストOS)内で、仮想化ソフトウェアのアプリケーションを立上げ、その中で仮想コンピュータのOS(ゲストOS)を動作させ、アプリケーションを実行するという仕組みです。

ホストOS型の個人的イメージ図 azure1.png

ホストOS、ゲストOSの両方にリソースを割かれるため、物理コンピュータのスペックによっては動作が重くなる場合がありますが、個人で利用する分にはとても手軽に別環境が作れるのが魅力かと思います。

VirtualBox や VMware Player 等が該当します。

ハイパーバイザ型

ホストOSが存在せず、物理コンピュータに仮想化用のレイヤーが作成され、その上で仮想コンピュータを動作する仕組みが、ハイパーバイザ型となります。

ハイパーバイザ型の個人的イメージ図
azure2.png

主にサーバで利用され、ハードウェアの BIOS から直接仮想化ソフトウェアを起動する事で、オーバヘッドをより小さくできるという事です。

ホストOS型の図と比べると余裕のある構成(ギュウギュウじゃない)となっていますので、それだけ処理の手続きが少なくて済むという感じでしょうか、図ではゲストOSは1台ですが、通常は複数OSを1台の物理コンピュータ(サーバ)で動作させるケースが多いです。

VMware ESXi や Microsoft Hyper-V 等が該当します。

という事は…

ホストOS型もハイパーバイザ型も仮想コンピュータで動作するOSには制限がなく、仮想コンピュータのハードウェアは、物理コンピュータのスペックに依存するため各種リソースの消費量が大きいが、自由度が高い仮想化という事であると理解しました!

コンテナについて

上記を踏まえた上でコンテナを利用した仮想化ってなんだろうという事ですが、ホストOSのカーネルが物理コンピュータ上に、コンテナという隔離された仮想コンピュータの区画を作成し、その区画を利用するという仕組みになります。

コンテナ型の個人的イメージ図
azure3.png

あくまでも物理コンピュータ上に作成された区画の上で、コンテナは1プロセスとして動作するため、前述した仮想化技術とは異なり、ホストOS と同一の OS を利用する事で、リソースの消費量が抑えられ軽量かつ可搬性の高い仮想化という事であると理解しました!

コンテナを管理するソフトウェアとして、Docker を利用します。

カーネルの機能が利用されているため別の OS を利用したいという場合は、コンテナでは実現ができないというデメリットもありますが、今回は特に気にしません。

という訳で、ざっくり確認したとろで…

Azure Container Instances を利用してみます

今回は以下のチュートリアルを参考に、Azure Container Instances を利用したいと思います!
Azure Container Instances のドキュメント - チュートリアル

■ 必要なもの
・Azure アカウント
・Azure CLI
・Docker

コンテナのイメージ作成

Microsoft が公開している Azure Container Instances用の Node.js サンプルコードを GitHub から git clone します。

git clone https://github.com/Azure-Samples/aci-helloworld.git

構成は以下のようになっています。

▾ aci-helloworld/
  ▾ app/
      index.html
      index.js
      package.json
    Dockerfile
    LICENSE
    README.md

サンプルコードの Dockerfile の中身です。

FROM node:8.2.0-alpine
RUN mkdir -p /usr/src/app
COPY ./app/* /usr/src/app/
WORKDIR /usr/src/app
RUN npm install
CMD node /usr/src/app/index.js

Alpine Linux という軽量なディストリビューションを利用してベースイメージを作成していますね、後は作業ディレクトリの設定、モジュールのインストールといった具合でした。

さっそくイメージを作成するため、docker build コマンドを実行します。

docker build ./aci-helloworld -t aci-tutorial-app

実行結果

Sending build context to Docker daemon  119.8kB
Step 1/6 : FROM node:8.2.0-alpine
8.2.0-alpine: Pulling from library/node
88286f41530e: Already exists
84f3a4bf8410: Already exists
d0d9b2214720: Already exists
Digest: sha256:c73277ccc763752b42bb2400d1aaecb4e3d32e3a9dbedd0e49885c71bea07354
Status: Downloaded newer image for node:8.2.0-alpine
 ---> 90f5ee24bee2
Step 2/6 : RUN mkdir -p /usr/src/app
 ---> Running in fd2884ac733a
 ---> fa95a2f944df
Removing intermediate container fd2884ac733a
Step 3/6 : COPY ./app/* /usr/src/app/
 ---> ab5086699178
Removing intermediate container 802725fc6fbb
Step 4/6 : WORKDIR /usr/src/app
 ---> 9672fb073fdc
Removing intermediate container 405e6261d157
Step 5/6 : RUN npm install
 ---> Running in 24f54a4b1d92
npm info it worked if it ends with ok
npm info using npm@5.3.0
npm info using node@v8.2.0
npm info lifecycle aci-helloworld@1.0.0~preinstall: aci-helloworld@1.0.0
npm http fetch GET 200 https://registry.npmjs.org/express 604ms
〜 略 〜

added 45 packages in 5.006s
npm info ok
 ---> fc740c1f5333
Removing intermediate container 24f54a4b1d92
Step 6/6 : CMD node /usr/src/app/index.js
 ---> Running in 9ef0205a5e9d
 ---> 5581a6aeecdf
Removing intermediate container 9ef0205a5e9d
Successfully built 5581a6aeecdf
Successfully tagged aci-tutorial-app:latest

完了しました。

とりあえずローカルで実行してみます、-d でバックグラウンドで起動させ、-p でローカルマシンの 8080 番ポートをコンテナの 80 番ポートにマッピングします。

docker run -d -p 8080:80 aci-tutorial-app

localhost にアクセスすると… azure4.png

サンプルページが表示されました。

Azure Container Registry へイメージをアップロード

Azure Container Registry とは、Azure 版 Docker Hub のような感じで、お値段はストレージに保存するイメージの転送量だけとなります。

また、ここからは Azure CLI で作業を進めていきます。

リソースグループ作成

まずは今回の作業用のリソースグループ(その名の通りリソースを管理するグループ)を Azure Container Instances が利用できる eastus リージョンに作成します、今回は myContainer という名前のリソースグループを作成します。

az group create --name  myContainer --location eastus

コンテナレジストリとストレージアカウントの作成

次にコンテナレジストリとイメージ保存用のストレージアカウントを作成します、 コンテナレジストリの名前は一意である必要があり、ストレージアカウントは自動で作成されます。

az acr create --resource-group myContainer --name <ACR Name> --sku Basic --admin-enabled true

本当に east us リージョンに myContainer というリソースグループで、Azure Container Registry とストレージアカウントが作成されたのか、Azure のコンソールを確認してみます。 azure5.png

ちゃんと作成されていますね!

コンテナレジストリのログインサーバ、パスワード確認

次にコンテナレジストリのログインサーバを確認しメモメモ。

az acr show --name <ACR Name> --query loginServer

確認できたら次はパスワードを確認しメモメモ。

az acr credential show --name <ACR Name> --query passwords[0].value

コンテナレジストリサーバへログイン

作成したイメージをアップロードする前に コンテナレジストリインスタンスにログインする必要がありますので、docker login を利用します、先程確認したログインサーバ、パスワードをここで使います。

docker login --username=<ACR Name> --password=<ACR Password> <ACR LoginServer>

Login Succeeded が表示されれば成功です。

コンテナイメージのタグ付け

ローカルのレジストリからコンテナイメージをアップロードするためには、イメージにタグを付ける必要があるという事なので、先程作成したイメージ aci-tutorial-app にタグを付与します。

チュートリアルに従い、タグ名は v1とします。

docker tag aci-tutorial-app <ACR LoginServer>/aci-tutorial-app:v1

確認してみましょう。 azure6.png

タグが付与されたイメージが作成されました。

アップロード開始!

docker pushで作成したイメージを、コンテナレジストリサーバへアップロードします。

docker push <ACR LoginServer>/aci-tutorial-app:v1

アップロードされたコンテナレジストリの確認

以下のコマンドでコンテナレジストリのリストを確認できますので、確認してみます。

az acr repository list --name <ACR Name> --username <ACR Name> --password <ACR Password> --output table
Result
----------------
aci-tutorial-app

Azure Container Instances へデプロイする

それではコンテナレジストリにアップロードしたイメージを、コンテナインスタンスへデプロイします。

1コマンドでコンテナインスタンスへデプロイできますが…長い!リソースをCPU 1コア、メモリ 1GB の要求で、コンテナレジストリからコンテナイメージをデプロイします。

az container create --name aci-tutorial-app --image <ACR LoginServer>/aci-tutorial-app:v1 --cpu 1 --memory 1 --registry-login-server <ACR LoginServer> --registry-username <ACR Name> --registry-password <ACR Password> --ip-address public -g myContainer

数秒でコマンドの実行結果が返ってきました、実行結果としてパブリック IP アドレスが表示されますので、こちらにアクセスしてみます。
azure7.png

お、表示されました!こちらも Azure コンソール上で確認してみます。 azure8.png

作成されていますね!

感想

気になるお値段ですがCPU 1コア、メモリ 1GB の場合は1秒間に¥0.00255 + 作成要求が1コンテナにつき¥0.26となっています(1秒以下のは利用料金無料)、処理時間は短いけど頻繁に動作するバッチ処理を、こちらに乗り換える事でインスタンス料金の節約になりそうです。

1秒単位での課金となっていますので、作業完了後にそそくさとコンテナを Stop としようと思ったら、Azure コンソール上からは実行できず Azure CLI でコンテナを Delete する必要がありました。

Azure コンソール上で UI からコンテナインスタンスを作成する事も可能で、Docker Hub からイメージを取得する事もできます。

Windows コンテナは記事執筆時には選択できませんでしたが、近いうちに追加されるという事でこちらも触ってみたいと思います。

皆様まだまだ暑い日が続きますので、熱中症とログの出し忘れにはお気をつけ下さい。