自作の ASP.NET アプリを乗せた Windows コンテナをビルドする
開発部の本橋です。
Windows コンテナで ASP.NET (4.6) Web アプリを実行しようとしてみたら意外と簡単にできたのでメモっておきます。
Web アプリを用意
簡単な Web アプリを用意します。今回は以下のような仕様としました。
- ASP.NET MVC 5 (.NET Framework 4.6.2) で実装。
- テキストエリアに任意の文字列を入力可能。
- “POST” ボタンをクリックするとサーバー上にテキストファイルを出力。
- 出力したテキストファイルはブラウザからアクセス可能。
コード
コントローラーとビューのコードは以下のようにしました。(ASP.NET MVC プロジェクトの作り方は省略します。)
// コントローラー using System.IO; using System.Web.Mvc; namespace MyWebApp.Controllers { public class HomeController : Controller { // GET: Home/Index // POST: Home/Index public ActionResult Index() { if (this.Request.HttpMethod.ToLower() == "post") { var text = this.Request.Form["text"]; var path = Path.Combine(this.Request.PhysicalApplicationPath, "out.txt"); using (var sw = new StreamWriter(path, false)) { sw.Write(text); } var appPath = this.Request.ApplicationPath.EndsWith("/") ? this.Request.ApplicationPath : this.Request.ApplicationPath + "/"; this.ViewBag.file = appPath + "out.txt"; } return this.View(); } } }
// ビュー @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <div> <form action="~/" method="post"> <textarea name="text"></textarea> <button type="submit">POST</button> </form> @if (this.ViewBag.file != null) { <a href="@this.ViewBag.file" target="_blank">@this.ViewBag.file</a> } </div> </body> </html>
コンテナイメージを作る
Web アプリを発行
上記のコードをどこかのフォルダに発行します。今回は “C:\_work\MyWebApp\app” フォルダに発行したとして進みます。
Dockerfile
dockerhub のマイクロソフト公式アカウントに microsoft/aspnet というコンテナイメージがあるのでこれを使うと簡単です。
以下の内容を “C:\_work\MyWebApp\Dockerfile” として保存します。
FROM microsoft/aspnet:4.6.2 RUN mkdir c:\inetpub\wwwroot\MyWebApp COPY app\* c:/inetpub/wwwroot/MyWebApp RUN powershell -Command "New-WebApplication -Site 'Default Web Site' -Name 'MyWebApp' -PhysicalPath 'c:\inetpub\wwwroot\MyWebApp' -ApplicationPool 'DefaultAppPool'" \ && icacls c:\inetpub\wwwroot\MyWebApp /grant IIS_IUSRS:F
やってることは簡単で、
- 発行した Web アプリをコンテナにコピー
- Web アプリケーションを作成
- フォルダにアクセス権限を与える
です。COPY
命令のコピー先フォルダのパス区切り文字は \
でなく /
にする必要があるので気をつけます。
また、今回はコンテナ上にファイルを出力するため Web アプリケーションの物理フォルダに書き込めるようアクセス権限を設定します。
注:通常、コンテナ上に永続的な目的のファイルを出力するべきではありません。今回は実装の簡略化のためにコンテナ上に出力していますが、本来はホストのファイルシステムをマウントしたり、データボリュームコンテナを利用したりします。
コンテナイメージをビルド
docker build
コマンドでイメージをビルドします。ベースイメージである microsoft/aspnet
の容量が10GBほどあるため、キャッシュがない場合は結構時間がかかります。
cd c:\_work\MyWebApp docker build -t mywebwpp .
実行
docker run
コマンドでビルドしたコンテナを実行します。
docker run -d mywebapp
ブラウザでアクセスしてみましょう。
“POST” ボタンをクリック↓
“/MyWebApp/out.txt” のリンクをクリック↓
ちゃんと動いている事が確認できます。これで自作の Web アプリケーションを Windows コンテナで実行できました!