技術

Docker上に.NET Core構築してみた

w2solution

w2solution

2020/12/28

初めまして、新卒エンジニアの中村です。

私の職場では、もっぱら.NET WebFormsというWebフレームワークが利用されています。
しかし、このWebForms。レガシーな環境であるため、色々と限界がありそうだなと感じてきている次第です。
例えば、WebFormsは構造上、デザインファイルとロジックのコード分離が難しいという現状があります。
そのため、プログラマとデザイン会社さんの連携も難しくなってしまいます。
プログラマがプログラミングを行い、デザイン会社さんがデザインの編集のみを行う、という連携が理想ですね。
しかし、WebFormsで行うには不可能に近く、プログラマがデザインファイルを編集する必要がどうしても出てきてしまいます。
そうなると、プログラマは、デプロイを行うにあたり、デザインファイルの変更分を本番サーバのデザインファイルに対して手動でマージを行うことになってしまいます。
 この作業が結構負担になり、また本番環境のサーバに触れる機会も増えるため事故の要因にもなるなあ、というのが私見です。
また、構造上単体テストやバージョン管理なども難しくなってくるのではないかとも感じています。


なので、今回の記事を通して最新の実行環境(?)である.NET Core MVCを試しに触ってみるとともにその素晴らしさを実感していこうと思います。

.NET Coreとは

.NET Coreとは、一言でいえばマルチプラットフォームで動作する.NET環境です。
従来の.NET Frameworkでは、マイクロソフトが単体で開発をおこなっていたためWindows環境でしか動きませんでした。
しかし、.NET Coreは様々なOS上で実行することが可能です。
マイクロソフト主導による、OSSとしての開発が盛んに行われているため、現在.NET環境での主流と呼べるような存在になってきています。

メリットとしては、IISに依存せずに実行できるので、実行環境の構築が非常に容易である(最低でも.Net Core SDKをインストールするだけ)という点と、マルチプラットフォームに対応しているという点、Dockerでサポートされており実行環境の管理や共有が行いやすいという点などが挙げられます。
(唯一の?)デメリットとしては、IIS上でのみ実行できるWebFormsが.NET Coreでは実行できないということです。
ただし、新規のプロジェクト開発でWebFormsを選択する方はごく少数であると思うので、あまり問題にならないのでしょう。

実質的に推奨環境だと感じているので、新規でWebアプリケーション開発するのであればどんどん.NET Core MVCを採用していきましょう!

.NET Core MVCのプロジェクトを作成する

それでは、.NET Core MVCのプロジェクトをパソコン上に作成してみましょう。
まずは、下記URLから.Net Core SDKをインストールします。
https://dotnet.microsoft.com/download

インストール出来ましたら、こちらのコマンドを実行してみてください。

dotnet new mvc -o aspnetapp

すると、以下の構成でファイルが展開されることが確認出来ると思います。

└─aspnetapp
    │  appsettings.Development.json
    │  appsettings.json
    │  aspnetapp.csproj
    │  Dockerfile
    │  Program.cs
    │  Startup.cs
    │
    ├─Controllers
    │      HomeController.cs
    │
    ├─Models
    │      ErrorViewModel.cs
    │
    ├─obj
    │      aspnetapp.csproj.nuget.cache
    │      aspnetapp.csproj.nuget.dgspec.json
    │      aspnetapp.csproj.nuget.g.props
    │      aspnetapp.csproj.nuget.g.targets
    │      project.assets.json
    │
    ├─Properties
    │      launchSettings.json
    │
    ├─Views
    │  │  _ViewImports.cshtml
    │  │  _ViewStart.cshtml
    │  │
    │  ├─Home
    │  │      Index.cshtml
    │  │      Privacy.cshtml
    │  │
    │  └─Shared
    │          Error.cshtml
    │          _Layout.cshtml
    │          _ValidationScriptsPartial.cshtml
    │
    └─wwwroot

これが.NET Core MVCプロジェクトの原型となります。
単に動作確認するだけであれば、このプロジェクトをdotnet runコマンドでビルドするだけで、もう.NET CoreがPC上で実行できます、簡単ですね。
また、マルチプラットフォームなので、この時点でWindowsでもLinuxでもMacでも動きます。
しかし、せっかくなのでDocker上での実行も行ってみます。

Docker上で実行してみる

続いて、Dockerのコンテナ上で.NET Coreの実行環境を作成してみます。
Dockerのコンテナを作成するために、まずはコンテナのプロトタイプであるイメージを作成します。
イメージを作成するためにはDockerfileが必要となりますので、以下のマイクロソフト公式ドキュメントを参考にしつつDockerfileを記述しましょう。
https://docs.microsoft.com/ja-jp/dotnet/core/docker/build-container

実際に私が作成したDockerfileは以下となります。

FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build

WORKDIR /app/aspnetapp
COPY . .
RUN dotnet publish -c Release -o out

FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime
WORKDIR /app
COPY --from=build /app/aspnetapp/out ./
ENTRYPOINT ["dotnet", "aspnetapp.dll"]

.NET Coreをお試しで実行してみるだけであれば、上記の設定で不足はなさそうですね。
業務において本番用のサーバ上で実際に運営する場合は、nginxを用いてWebサーバを起動するような構成にしてみるとよりいいかもしれません。
では、Windows環境にて、Dockerを実行するためのコマンドを打っていきます。
まずは、上記のDockerfileを /app/aspnetapp フォルダに格納します。
 続いて、cdコマンドで上記フォルダに移動しましょう。

cd .\asp\aspnetapp

さらに、Dockerイメージを構築するコマンドを実行します。
以下コマンド実行により、aspnetappというイメージが生成されます。

docker build -t aspnetapp .

上記実行しましたら、取り敢えずイメージが確実に作成できたか確認してみます。
こちらのコマンドを実行してみてください。

docker ps

これで、IMAGE欄にaspnetappと表示されればOKです、aspnetappイメージが生成されているということが確認できます。
イメージが出来ましたらコンテナを作成し、実行してみます。

docker run -it --rm -p 5000:80 --name aspnetcore_sample aspnetapp

これで、aspnetcore_sampleというコンテナが作成され、ついでにビルドと実行までされます。
なんと、これだけの操作で.NET Core MVCがDocker環境上で動きだします!
ウェブブラウザからlocalhost:5000にアクセスしてみてください、こちらのページが表示されるはずです。

とても簡単な操作だったと思いますが、これらの操作によってDocker上に.NET Coreのイメージを作成し、様々な環境で動かすことが出来ます。
実行環境の作成がここまで簡易に出来るのは色々とメリットが大きそうですね。

まとめ

WebFormsでもまだまだ現役で戦えるとは思いますが、完全に新規で開発を行う場合は.NET Coreを導入することをおすすめします。
今回は導入までだったので、次回の記事で開発を行っていきたいと思います。


追伸
こちらの記事を作成してから公開するまでの間に、.NETの新しいバージョンが公開されてしまっていたのでついでに少しだけご紹介させていただきます!
2020年11月10日に、マイクロソフトが.NET 5の正式リリースを発表しました。

(原文)
https://www.infoq.com/news/2020/11/microsoft-releases-dotnet-5/

詳細についてはまた改めてご紹介させていただきたいと思うのですが、概要としては従来型のフレームワークである.NET Frameworkと.NET Coreの機能を統合したものとなっております。
この統合をきっかけに、.NETのバージョン5からは.NET Coreや.NET Frameworkという呼称ではなく、.NETという呼称に統一されることとなるので注意が必要になるかと思います。
また、.NET 5は、.NET Framework 4.x系の後継であり、かつ、.NET Core 3.x系の後継にあたります。(ですので、.NET Coreにはバージョン4が存在しないということになります)
最新版の.NET Core(あるいは.NET Framework)を利用したい場合には、この点注意しておきましょう。