Service Fabricはself-hostedなサーバー(WebListener, Katana, Kestrel)しかサポートされない。つまりIISが利用できないのでIISに依存したアプリの移行が難しいケースが考えられる。しかし、提供を開始したコンテナを使うことで解決できるようになった。ちなみにDockerとWindows Server Containersの2種類が利用できる。ただし新規アプリ開発ではASP.NET CoreやJavaによるReliable ServiceやReliable Actorsを使った実装が推奨なので安易に使うのではなく最終手段として考えておこう。
ここではASP.NET on IISが含まれるコンテナをService Fabricにデプロイしてみる。
事前準備
Azure VMでイメージを作成する場合はWindows Server with Containersを選択する。
マイクロソフトさんがDocker Hubにコンテナーを公開してくれているので事前に確認して、アカウントを作成
https://hub.docker.com/u/microsoft/
※こちらは公式ドキュメント:Deploy a Windows container to Service Fabric
https://docs.microsoft.com/ja-jp/azure/service-fabric/service-fabric-deploy-container
コンテナのセットアップ
Windows ServerでDocker environmentのセットアップ
Install-Module -Name DockerMsftProvider -Repository PSGallery -Force
Install-Package -Name docker -ProviderName DockerMsftProvider
Restart-Computer -Force
再起動してDockerのバージョンを確認
docker version
docker info
Docker HubからIISが含まれるコンテナをPull
docker pull microsoft/iis
docker images
Docker イメージをカスタマイズするので準備
mkdir dockerfiles
cd dockerfiles
作成したフォルダに以下のDockerFileを保存。またIISのwwwroot以下にASP.NETのモジュールをコピー。
FROM microsoft/iis
SHELL ["powershell"]
RUN Install-WindowsFeature NET-Framework-45-ASPNET ; \
Install-WindowsFeature Web-Asp-Net45
COPY . C:\\inetpub\\wwwroot
EXPOSE 80
実行
docker images
docker build -t [Image Name] .
docker run -d -p 80:80 [Imange Name]
Docker プロセスの確認
docker ps
VMにコマンドでアクセス。ブラウザでアクセスすればIISが動いていることを確認できる。
docker exec -i -t [CONTAINER_ID] cmd
Docker Hubにプッシュ
*Reference: Push to Docker Hub
https://docs.docker.com/engine/getstarted/step_six/#step-1-tag-and-push-the-image
Docker Hub. (Check your docker hub account name)
docker images
docker tag [IMAGEID] [docker hub acccountname]/ [Image Name] :[TAG]
docker login
docker push [docker hub acccountname]/[Image Name]
Service Fabric にDeployはこちらのサイトを参照。Deployの完了には10分以上必要で、その間に以下のようなエラーが発生することがあるが無視する。
https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-deploy-container
準備が完了すると「Status」が「Ready」になる。Endpointの
URLのドメイン名をコピーして RDPで接続。無事にWindows Serverにログインできたらコピーしたアプリが動いていることを確認できる。