ASP.NET5(C#)をCoreOSのDockerで動かす

ASP.NET5の「1.0.0-beta4」を、AzureのCoreOSのDcokerで動かす手順をメモりました。

ASP.NET vNextのDocker

https://github.com/aspnet/aspnet-docker
https://registry.hub.docker.com/u/microsoft/aspnet/


AzureでCoreを作成
Dockerを使うためにCoreOSを使用します。
Azureでインスタンスを作るには、ギャラリーからCoreOSのStableを選択するだけです。


とりあえずはパスワードを指定しておけば、大丈夫です。


ASP.NETアプリを外からつながせたい場合はエンドポイントでHTTPを追加します。

CoreOSでは、DockerもGitも使える状態になっています。


Linux(CoreOS)にSSHクライアントから接続
プロビジョニングが終わったら、PuttyなどのSSHクライアントで繋ぎます。

#ホームへ
cd 

# 作業フォルダを作って移動
mkdir aspnet
cd aspnet

# ASP.NETのサンプルをGitから取得
git clone git://github.com/aspnet/Home.git

# 今回のデプロイ用のDockerの設定ファイルを作成
vim Dockerfile


Dockerファイルの編集
Dockerfileをvimエディタで作成し、以下の内容で保存します。(保存はESCキー後の、ZZ、終了は:q!)

FROM microsoft/aspnet:1.0.0-beta4
ADD ./Home/samples/1.0.0-beta4 /app
WORKDIR /app/HelloWeb
RUN ["dnu", "restore"]

EXPOSE 5004
ENTRYPOINT ["dnx", ".", "kestrel"]
  • Dockerfileの説明
    • beta4のMicrosoftのDockerはMono4.0.1をベースにしています。
    • Gitでとってきたサンプルファイルを渡し、dnu restore(旧 kpm restore)コマンドを実行しています。
    • その後ポート5004で公開して、dnx kestrel (旧k kestrel)コマンドを実行しています。
    • kestrelLinuxでも動くHTTPサーバーです。

この時点でのファイル構造(関係ないところは省略)

/home/aoki/aspnet

--Dockerfile
--Home
--.gitattributes
--.gitignore
--CONTRIBUTING.md
--GettingStartedDeb.md
--Home.sln
--LICENSE.txt
--README.md
--dnvm.cmd
--dnvm.ps1
--dnvm.sh
--dnvminstall.ps1
--dnvminstall.sh
--samples
--1.0.0-beta4
--HelloWeb
--HelloWeb.xproj
--Properties
--launchSettings.json
--Startup.cs
--project.json
--wwwroot
--image.jpg
--NuGet.Config



Dockerイメージ作成
Dockerイメージを作成します。

sudo docker build -t aspnetvnext .

しばらく待ちます。dnu restoreコマンドでアセンブリの取得をするので、時間がかかります。



実行結果

Sending build context to Docker daemon 2.177 MB
Sending build context to Docker daemon
Step 0 : FROM microsoft/aspnet:1.0.0-beta4
---> 94b7c4941bcc

Step 1 : ADD ./Home/samples/1.0.0-beta4 /app
---> 7577bcb65df0
Removing intermediate container dfdf4ce1d496

Step 2 : WORKDIR /app/HelloWeb
---> Running in 5c965567463e
---> c2445e98ce6b
Removing intermediate container 5c965567463e

Step 3 : RUN dnu restore
---> Running in 84f4580847b8
Restoring packages for /app/HelloWeb/project.json
GET https://www.myget.org/F/aspnetvnext/api/v2/FindPackagesById()?Id='Kestrel'.
GET https://nuget.org/api/v2/FindPackagesById()?Id='Kestrel'.
(省略)
OK https://www.myget.org/F/aspnetvnext/api/v2/package/System.Security.Cryptography.Hashing/4.0.0-beta-22907 643ms
(省略)
Installing System.Security.Cryptography.Hashing 4.0.0-beta-22907
Writing lock file /app/HelloWeb/project.lock.json
Restore complete, 565334ms elapsed
---> c08b36d2b243
Removing intermediate container 84f4580847b8

Step 4 : EXPOSE 5004
---> Running in 9c7ee0026d35
---> 6a7785a4718d
Removing intermediate container 9c7ee0026d35

Step 5 : ENTRYPOINT dnx . kestrel
---> Running in b092448c2d29
---> fbc1a2b1c89a
Removing intermediate container b092448c2d29
Successfully built fbc1a2b1c89a

STEP順に実行されます。
(以前と異なり、project.jsonだけではなく、project.lock.jsonなるものが生成されていました。人が触らないファイルのように見えます。)




Dockerイメージの確認

sudo docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
aspnetvnext         latest              fbc1a2b1c89a        11 minutes ago      778.7 MB

aspnetvnextという名前のDockerイメージができています。


Dockerコンテナに配置
Dockerのrunコマンドで、コンテナに配置します。

sudo docker run -t -p 80:5004 aspnetvnext

ポート5004を80に割り当てて実行。
エラーがあれば表示されます。


sudo docker ps -a

上記コマンドで実行できてているDockerコンテナを確認します。




正常起動した場合は

sudo docker stop <コンテナID>

で停止できます。


エラーがなければ、Dockerを-d(デーモン)オプションを付けてサービス実行します。(こちらは、エラーがあっても気づきません。)

 sudo docker run -t -d -p 80:5004 aspnetvnext

確認
画面から確認します。

無事動いていることを確認できました。