前回(コンソールアプリ編)ではDockerで実行すると文字が表示されるだけの簡単なアプリを作成しました。
今回はWEBアプリ(ASP.NET MVC)を使用して構築を行いたいと思います。
今回構築するアプリを使用して次回以降でDBとの連携も行おうと思います。
では早速、構築してみます。
開発環境
- macOS High Sierra
- Docker for Mac Version 18.06.1-ce-mac74
- .Net Core 2.1.4
- Visual Studio Code
ASP.NET Core MVCの準備
前回同様、ASP.NET Coreのテンプレートを使用してコマンドラインで雛形を作成します。
# 以下のコマンドをアプリを作成したいフォルダ内で実行する
$ dotnet new mvc
今回も「App」フォルダ内で実行したため、以下の構成となりました。
.
├── App.csproj
├── Controllers
│ └── HomeController.cs
├── Models
│ └── ErrorViewModel.cs
├── Program.cs
├── Startup.cs
├── Views
│ ├── Home
│ │ ├── About.cshtml
│ │ ├── Contact.cshtml
│ │ └── Index.cshtml
│ ├── Shared
│ │ ├── Error.cshtml
│ │ ├── _Layout.cshtml
│ │ └── _ValidationScriptsPartial.cshtml
│ ├── _ViewImports.cshtml
│ └── _ViewStart.cshtml
├── appsettings.Development.json
├── appsettings.json
├── bundleconfig.json
├── obj
│ ※省略
└── wwwroot
※省略
実行してみます。
$ dotnet run
Hosting environment: Production
Content root path: /Users/XXXX/App
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.
http://localhost:5000 にアクセスすると以下のページが表示されます。
以上でC#側のセッティングは完了です。
Dockerの準備
Dockerfileを作成します。
FROM microsoft/dotnet:2.1-sdk
WORKDIR /app
# csprojをコピーし、依存パッケージを取得
COPY *.csproj ./
RUN dotnet restore
# プログラムのコピー
COPY . ./
# リリース資材をoutフォルダに出力
RUN dotnet publish -c Release -o out
# プログラム実行
ENTRYPOINT ["dotnet", "out/App.dll"]
はい。コンソールアプリの時と内容は全く同じです。
ビルドします。
# -tオプションはリポジトリ名を指定(好きな名称でOK)
$ docker build -t dotnet-mvc .
実行します。
$ docker run -p 8080:80 --rm dotnet-mvc
warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
No XML encryptor configured. Key {6fe44792-8387-4765-b497-59b96bab297e} may be persisted to storage in unencrypted form.
Hosting environment: Production
Content root path: /app
Now listening on: http://[::]:80
Application started. Press Ctrl+C to shut down.
-p オプションでコンテナのポート番号とホストのポート番号をマッピングします。
何も指定せずにPublish(公開)状態でコンテナ内で実行しているため、
コンテナ内のポート番号は80番で実行されています。
http://localhost:8080 にアクセスするとローカル実行時と同様の画面が表示されます。
以上でC# × DockerのWEBアプリ(MVC)の構築は完了です!
次回はデータベースとの連携を行います。
MS製品だとSQL Serverですが、一般的なRDBは全て記載したいと思います。