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の説明
- 注意点
- ASP.NET5の概念は、こちらの記事のP3とP4を読んでください。
- kpm が dnu にリネーム
- kvm が dnvm にリネーム
- k が dnx にリネーム
- kprojがxprojにリネーム
- サンプルのlatestが動かず、1.0.0-beta4は動くという罠があります。
- ASP.NET5の概念は、こちらの記事のP3とP4を読んでください。
この時点でのファイル構造(関係ないところは省略)
/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
---> 94b7c4941bccStep 1 : ADD ./Home/samples/1.0.0-beta4 /app
---> 7577bcb65df0
Removing intermediate container dfdf4ce1d496Step 2 : WORKDIR /app/HelloWeb
---> Running in 5c965567463e
---> c2445e98ce6b
Removing intermediate container 5c965567463eStep 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 84f4580847b8Step 4 : EXPOSE 5004
---> Running in 9c7ee0026d35
---> 6a7785a4718d
Removing intermediate container 9c7ee0026d35Step 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