12/23/2014

ASP.NET 5のMVCアプリをDockerを使ってAzureで動かしてみる

 

 GitHubのASP.NET 5のMVCサンプルをAzureのDockerで動かしてみます。サンプルは下記のURLから確認してください。

https://github.com/aspnet/Home 

それでは、Dockerのイメージを作っていきましょう!

下図のNOWINは、Kestrelを使わない時に使用していたものなので、本記事では関係ありません。

docker03

 

ASP.NETのサンプルコードを取得する

サンプルコードは普通にGitでcloneしてください。

$ cd ~

$ mkdir aspnetsample

$ cd aspnetsample

$ git clone https://github.com/aspnet/Home.git

 

Docker Imageを作成する

 Docker Imageを作成するためにDockerfileを下記のように作成します。ベースのイメージはマイクロソフト公式のmicrosoft/aspnetを使ってみました。

$ cd ~

$vi ./aspnetsample/Dockerfile

FROM microsoft/aspnet
# copy the contents of the local directory to /app/ on the image
ADD . /app/
# set the working directory for subsequent commands
WORKDIR /app
# fetch the NuGet dependencies for our application
RUN kpm restore
# set the working directory for subsequent commands
WORKDIR /app/Home/samples/HelloMvc
# expose TCP port 5004 from container (see project.json)
EXPOSE 5004
# Configure the image as an executable
# When the image starts it will execute the “k kestrel” command
# effectively starting our web application
ENTRYPOINT ["k", "kestrel"]




Dockerfileを作ったらBuildします。kpm restoreするので、少し時間がかかります。(前回の記事Microsoft AzureでDockerを使ってみるを参考にDockerを使える状態にしてから実行してください。)



$ docker --tls build --tag=hellomvc aspnetsample

Buildして作成されたImageは確認することができます。



$ docker --tls images
REPOSITORY                     TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
hellomvc                       latest              40c8011edf85        About an hour ago   541.3 MB
microsoft/aspnet               latest              a72542b6a95f        4 weeks ago         473.7 MB

 



ASP.NETサンプルアプリのDocker Imageを実行してみる




 それでは、DockerでASP.NETを実行してみます。コンテナ内のサーバはサンプルアプリのproject.jsonでTCPポート5004で動かすように設定されていたので、コンテナの外からはTCPポート8080で受け付けるようにしてみます。




$ docker --tls run -d -t -p 8080:5004 hellomvc
30a655f76e1660596079bf87fe446df605f20a3da2b2b856f848bede14ca9eb8




正常に実行されていることを確認するには、run実行後に作成されるコンテナのIDを使ってログを確認します。Startedと書かれていればサーバとしては正常に動作しています。



$ docker --tls logs -t 30a655f76e1660596079bf87fe446df605f20a3da2b2b856f848bede14ca9eb8
2014-12-23T06:51:01.512809000Z Started




あと、注意しないといけないのがAzureのエンドポイント設定です。適切に設定していない場合は、エンドポイントの設定を変更して、インターネットからTCPポート80で受け付けるようにしておいてください。



$ azure vm endpoint create mydockerhost 80 8080 -n HTTP




これで、WebブラウザからでもMVCアプリを確認することができるようになります。




docker02




停止するには




動いているDockerコンテナは下記のようにDockerのpsコマンドで確認することができます。また、Dockerコンテナは、stopコマンドで停止させることができます。



$ docker --tls ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
30a655f76e16        hellomvc:latest    "k kestrel"             About an hour ago   Up About an hour    0.0.0.0:8080->5004/tcp   stoic_mclean
$ docker --tls stop stoic_mclean
stoic_mclean


 



さいごに



Visual StudioのプロジェクトどDockerコンテナで利用する場合は、こちらの記事を参考にしてください。


http://kentablog.cluscore.com/2015/01/visual-studio-2015-ctp-5aspnet-5docker.html


今回の記事を書くにあたり、kestrelはLinuxで動かないと思っていたため、はじめはNOWINを使うようにNOWIN.vNextを使っていましたが、Linux実装されていることに気が付きました。libuv.so.1のShared LibraryをDynamic LinkするようにKestrelのLinux実装がされていたんですね。MonoはDLL以外もリンクできるんだ。すごい!



https://github.com/aspnet/KestrelHttpServer/blob/1fc591921b6ab00dda18f7d24cf7e549d4b1b308/src/Microsoft.AspNet.Server.Kestrel/KestrelEngine.cs



いやー面白い世の中になりましたねー。



では、皆様良いお年をー。



あ、来年開催されるGoAzure2015に是非参加してくださいね。以前、勝手に紹介した記事もありますので、ご参考にしていただければと。