読者です 読者をやめる 読者になる 読者になる

Knowlbo 開発者ブログ

株式会社Knowlboの開発者ブログです。

自作の 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

やってることは簡単で、

  1. 発行した Web アプリをコンテナにコピー
  2. Web アプリケーションを作成
  3. フォルダにアクセス権限を与える

です。COPY 命令のコピー先フォルダのパス区切り文字は \ でなく / にする必要があるので気をつけます。

また、今回はコンテナ上にファイルを出力するため Web アプリケーションの物理フォルダに書き込めるようアクセス権限を設定します。

注:通常、コンテナ上に永続的な目的のファイルを出力するべきではありません。今回は実装の簡略化のためにコンテナ上に出力していますが、本来はホストのファイルシステムをマウントしたり、データボリュームコンテナを利用したりします。

コンテナイメージをビルド

docker build コマンドでイメージをビルドします。ベースイメージである microsoft/aspnet の容量が10GBほどあるため、キャッシュがない場合は結構時間がかかります。

cd c:\_work\MyWebApp
docker build -t mywebwpp .

実行

docker run コマンドでビルドしたコンテナを実行します。

docker run -d mywebapp

ブラウザでアクセスしてみましょう。

f:id:knowlbodev:20170217174201p:plain

“POST” ボタンをクリック↓

f:id:knowlbodev:20170217174202p:plain

“/MyWebApp/out.txt” のリンクをクリック↓

f:id:knowlbodev:20170217174203p:plain

ちゃんと動いている事が確認できます。これで自作の Web アプリケーションを Windows コンテナで実行できました!