きな粉もち.net

.NET関連仕事に携わっています。OSSのソースを読んで気がついたことを中心に呟いたりブログに投稿したりしています。最近はUiPathを使ったRPAも研究中。気軽にフォローやツッコミよろしくおねがいします! Gitはここを使っています https://github.com/kinakomotitti

Azure Windows Container × ASP.NET × サンプルアプリをデプロイしてみた

この記事の目的

この記事では、
Azure Container Instancesでコンテナを起動すること、
そのうえでアプリを動かすところまで確認すること

を目的としています。

本題

★やりたいことの全体像

kubernetesLinuxベースのDocker Image、WindowsベースのDocker Image(Windows Container)を管理するための調査を行っています。Linuxベースの方は、AKSを利用することで簡単にK8sクラスタの作成から、コンテナの作成まで確認ができました。しかし、Windowsベースの方はまだ検証ができていません。そんな中、同じAzureのサービスであるAzure Container InstancesとAKSを組み合わせることで、AKSWindows Containerの管理もできるという情報を得ました。そこで、本記事では、自分で開発したアプリをなんやかんやでAzure Container Instancesに配置するところまでを行っていこうと思います。


★Containerを作成する(失敗編)

Microsoft docsのContainer Instancesクイックスタートを参考にコンテナを作成しようとして失敗したときのメモです。
参考)
docs.microsoft.com


- 失敗1
エラーメッセージ「コンテナー グループ 'windowscontainer001' の DNS 名ラベル 'mycontainer' は使用できません。別のラベルを使用してみてください」
DNS名を指定する際、チュートリアルに書かれている値をそのまま利用して”mycontainer”を指定したときに出たエラーです。この値は利用することができないようなので、別の値を指定することで解決しました。

- 失敗2
- エラーメッセージなし「イメージとOSタイプが違う件」
f:id:kinakomotitti:20180904211518p:plain
→Containerの設定を行うとき、ContainerのOS Typeを指定することができます。今回は、WindowsベースのContainerを作成しようとしていましたが、ここのOS Typeの指定を変更するのを忘れていたためにうまくデプロイが進みませんでした。

- 失敗3
エラーメッセージ「イメージの OS バージョン 'microsoft/windowsservercore:1709' はサポートされていません。」
→サポートされているか確認せずに、とりあえずで選択したために出たエラー。このバージョンのDocker Imageはサポートされていないので、別のイメージを指定することでエラーを解消しました。
追記Windows Container Instancesでは、LTSBとなったバージョンのWiindows Serverのみサポートすることになっています。そのため、2018年9月現在、利用することができるOSバージョンは、1607のみとなります。
参考)Windows 10 リリース情報
https://www.microsoft.com/ja-jp/itpro/windows-10/release-information

参考)Windows Container Instancesトラブルシューティング
https://docs.microsoft.com/ja-jp/azure/container-instances/container-instances-troubleshooting#os-version-of-image-not-supported

★Containerを作成する(成功編)

利用したイメージ:microsoft/iis
利用したOS Type:Windows

その他のパラメータは、チュートリアルの値を入力していきました。
Containerのデプロイが完了すると、コンテナにIPアドレスが割り当てられます。特にアプリを配置していないので、http://ip address/で作成したContainerにアクセスし、IISのデフォルトページが正しく表示されることまでを確認します。
f:id:kinakomotitti:20180904211540p:plain
正しく構成されていれば、IISの画面が表示されます。よかった・・・ここまでで、既存のイメージを使ったWindows ContainerをAzureに配置することができました。しかし、この状態では、まだ自分の作ったアプリを起動することができていません。次のステップでは、自分の作ったアプリを配置したイメージをローカルで作成し、それをAzureにデプロイしていきます。

★デプロイする用のWebアプリの作成

ここでは、ローカルマシン上で、Visual Studioを使って作成したASP.netのWebアプリをWindows Containerのイメージにするところまでを行います。
とにもかくにも、Windows Containerがインストールされていないと話が進まない。ということで、Windows Containerをインストールしていきます。インストールは、下記ドキュメントを参考にしました。

docs.microsoft.com

続いて、Web アプリケーションを作成します。チュートリアルレベルなので、アプリ自体は、ASP.netのWeb APIのテンプレートをそのまま利用していきます。詳しくわかっていないですが、Dockerサポートは有効にして作成していきます。
f:id:kinakomotitti:20180904211815p:plain

作成されたWeb アプリケーションがこちらになります。
f:id:kinakomotitti:20180904211822p:plain
また、DockerFileは以下の内容が記述されています。

FROM microsoft/aspnet:4.7.1-windowsservercore-1709
ARG source
WORKDIR /inetpub/wwwroot
COPY ${source:-obj/Docker/publish} .

ここで注目は、ベースとなるDocker ImageのWindows Serverのバージョンです。ここでは、1709となっています。Windows Container Instancesでは、「失敗3」で紹介した通り、LTSBとなったバージョンのみをサポートしています。そのため、このままでは、「失敗3」の二の舞となってしまいます。そのため、LTSBである、バージョン1607を使うようにDocker Fileの内容を変更します。

#FROM microsoft/aspnet:4.7.1-windowsservercore-1709
FROM microsoft/aspnet:4.7.1
ARG source
WORKDIR /inetpub/wwwroot
COPY ${source:-obj/Docker/publish} .


Docker イメージを作成していきます。現時点で分かっているVisual Studio Docker サポートを使ってDocker イメージを作成する方法は、【1.Visual Studio の発行機能を利用する】、【2.Visual StudioでDockerを指定して実行する】の2つがあります。今回は、【2.Visual StudioでDockerを指定して実行する】で作業を進めます。この方法での注意点はここです。Docker Imageを作るときは、【リリース構成】にすることを忘れないようにしないといけません。

デバッグ構成では、反復にボリューム マウントを使用するため、devイメージにはアプリのコンテンツはありません。 イメージをプッシュするには、リリース構成を使用します。

参考)
docs.microsoft.com


★Azureへのイメージのデプロイ準備

次に、Azure Power Shellのインストールを行い、ローカルマシンのPowershellからAzureへの操作をできるようにします。インストールからAzureへの接続までの方法は、以下のドキュメントを参考にしました。
docs.microsoft.com

ここで、インストール作業を進めていくと、【サインイン】のステップにて、「
Import-Module : このシステムではスクリプトの実行が無効になっているため、ファイル C:\Program Files\WindowsPowerShell\Modules\AzureRM\6.8.1\Azur
eRM.psm1 を読み込むことができません。詳細については、「about_Execution_Policies」(https://go.microsoft.com/fwlink/?LinkID=135170) を参照してく
ださい。
」というエラーが発生することがあります。これは、Powershellスクリプトの実行セキュリティポリシーによるものです。以下のように対応して解消しました。

Get-ExecutionPolicy #現在のポリシーを確認。出力:Restricted
Set-ExecutionPolicy RemoteSigned #ポリシーのレベルを変更
Get-ExecutionPolicy #変更後のポリシーを確認。出力: RemoteSigned

参考)
www.atmarkit.co.jp

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

無事、Powershellの設定が終わったら、Azureの操作を行っていきます。ステップとしては、「リソースグループの作成」「コンテナーの作成」があります。リソースグループはすでに作成されているので、コンテナーの作成から作業を行います。
ここで注意することは、Azureにイメージをデプロイする際に利用するイメージ名+タグ名を正しく指定すること。です。正しく指定しないと「そんなimageねぇ」エラーが発生して(;゚Д゚)エエエェェ!ってなります。自分の環境では、Docker Imagesで以下のように表示されました。
f:id:kinakomotitti:20180904211925p:plain
そのため、ここで必要なイメージの名前は、【webapplication1:dev】となります。この値は、以下の処理の中(タグ名付与のステップ)で必要になります。ここまでの準備ができたところで、さっそくAzure Container Registryへイメージをアップロードしていきます。
参考)
docs.microsoft.com


↓実際に実行したコマンドたち。

#レジストリの作成
$registry = New-AzureRMContainerRegistry -ResourceGroupName "myResourceGroup" -Name
 "kinakomotittiregistory" -EnableAdminUser -Sku Basic

#レジストリの管理者の資格情報を取得
$creds = Get-AzureRmContainerRegistryCredential -Registry $registry

#ログイン
$creds.Password | docker login $registry.LoginServer -u $creds.Username --password-stdin

#タグ名の生成
 $image = $registry.LoginServer + "/webapplication1:v1"

#タグ名付与
docker tag webapplication1:dev $image
#※:devがないと、:lastestが補完されるため、「そんなイメージはないエラー」が発生する。
 :devをつける必要がある。・・・というか、タグ名に合わせる。

#イメージの配置実行。
docker push $image


ここまでの操作で、Azure Windows ContainerからアクセスできるDockerリポジトリの中に自分で作成した「ASP.NET WEB APIのアプリケーションが配置されたDocker Image」が保存された状態になりました。

★Azure Windows Containerのコンテナ作成

いよいよ、自分で作成したDocker ImageをAzure Windows Containerのコンテナに配置して、アプリを起動していこうと思います。このステップでは、Azure PowerShellの環境があるため、勢いに乗って、CLIからコンテナを作成していこうと思います。CLIでコンテナを作成するためには、以下のコマンドを実行します。
※あらかじめAzureにログインしてあることを前提としています。

#レジストリの資格情報を PSCredential に変換
$secpasswd = ConvertTo-SecureString $creds.Password -AsPlainText -Force
$pscred = New-Object System.Management.Automation.PSCredential($creds.Username, $secpasswd)

#コンテナーの DNS 名ラベルは、作成する Azure のリージョン内で一意である必要があります。 
#生成された名前を変数に設定するには、次のコマンドを実行します。
$dnsname = "aci-demo-" + (Get-Random -Maximum 9999)

#GUIでも設定したようなパラメータを指定していることがよくわかりますね!
※見やすいように改行しています。
New-AzureRmContainerGroup 
 -ResourceGroup myResourceGroup 
 -Name "windowscontainer001"
  -Image $image 
 -RegistryCredential $pscred 
 -Cpu 1 
 -MemoryInGB 1 
 -DnsNameLabel $dnsname 
 -OsType Windows

★最後の接続確認

無事にコンテナが作成できたら、いよいよ接続確認をしていきます。Azure Windows Containerができたときに、IPアドレスが発行されているので、そのIPアドレスを使って、ブラウザから接続していきます。

http://ip address/home

以下の画面が無事表示されました!成功です!
f:id:kinakomotitti:20180904231523p:plain

★今後の展望

今回は、ローカルマシンで作成したイメージを【Azure Container Registry】にアップロードし、Azure Container Registryにあるイメージから、【Azure Windows Container Instance】を作成しました。今後は、今回作成したコンテナを【AKS】で認識させ、k8sで管理するところまで調査していこうと思います。

まとめ

今回は、Azure Container Registryを使ってAzure Windows Container InstancesにWindows OSベースのDocker コンテナを作成する方法を調べてみました。結果として、カスタムイメージ(自分で開発したアプリを含むDocker Image)を配置してコンテナを起動するまでには、以下の手順が必要であることがわかりました。
※Azure Power Shellを利用する場合

  • 【ローカル】Azure Power Shellのインストール & ログイン
  • 【ローカル】Docker for Windows(Windows Container)のインストール
  • 【ローカル】アプリケーションの作成
  • 【ローカル】Docker イメージの作成
  • 【Azure】リソースグループの作成
  • 【Azure】Azure Container Registryの作成
  • 【ローカル】Docker imageのプッシュ(アップロード)
  • 【Azure】Windows Container の作成