Windows コンテナーへの ASP.NET MVC アプリケーションの移行
Windows コンテナーで既存の .NET Framework ベース アプリケーションを実行するとき、アプリに変更を加える必要はありません。 Windows コンテナーでアプリを実行するには、アプリを含む Docker イメージを作成し、コンテナーを起動します。 このトピックでは、既存の ASP.NET MVC アプリケーションを取得し、Windows コンテナーに展開する方法について説明します。
既存の ASP.NET MVC アプリから開始し、Visual Studio を使用して発行した資産をビルドします。 Docker を使用し、アプリを含み、これを実行するイメージを作成します。 Windows コンテナーで実行されているサイトに移動し、アプリが動作していることを確認します。
この記事では、Docker の基本的な理解ができていることを前提としています。 Docker の詳細は、「Docker Overview (Docker の概要)」で確認できます。
コンテナーで実行するアプリは、質問にランダムに回答する単純な Web サイトです。 このアプリは基本的な MVC アプリケーションであり、認証やデータベース ストレージはないため Web 層をコンテナーに移動することに集中できます。 今後のトピックで、コンテナー化されたアプリケーションに永続的な記憶域を移動して管理する方法を説明します。
アプリケーションを移行する手順は次のとおりです。
- イメージの資産をビルドする発行タスクを作成します。
- アプリケーションを実行する Docker イメージをビルドします。
- イメージを実行する Docker コンテナーを開始します。
- ブラウザーを使用してアプリケーションを検証します。
完成したアプリケーションが GitHub にあります。
前提条件
開発用コンピューターには、次のソフトウェアが必要です。
- Windows 10 Anniversary Update (以降) または Windows Server 2016 (以降)
- Docker for Windows - バージョン Stable 1.13.0 または 1.12 Beta 26 (以降のバージョン)
- Visual Studio 2017
重要
Windows Server 2016 を使用している場合は、「コンテナー ホストの展開 - Windows Server」の指示に従ってください。
Docker をインストールして起動したら、トレイ アイコンを右クリックし、 [Switch to Windows containers](Windows コンテナーに切り替える) を選択します。 これは、Windows に基づいて Docker イメージを実行するために必要です。 このコマンドの実行には数秒かかります。
発行スクリプト
Docker イメージに読み込む必要があるすべての資産を 1 か所に収集します。 Visual Studio の [発行] コマンドを使用してアプリの発行プロファイルを作成できます。 このプロファイルですべての資産を 1 つのディレクトリ ツリーに集めます。このチュートリアルの後半で、そのディレクトリ ツリーをターゲット イメージにコピーします。
発行の手順
- Visual Studio で Web プロジェクトを右クリックし、[発行] を選択します。
- [カスタム プロファイル] ボタンをクリックし、方法として [ファイル システム] を選択します。
- ディレクトリを選択します。 規則により、ダウンロードしたサンプルには
bin\Release\PublishOutput
が使用されます。
[設定] タブの [ファイル発行オプション] のセクションを開きます。[発行中にプリコンパイルする] を選択します。 この最適化は、Docker コンテナー内のビューをコンパイルすることを意味し、プリコンパイル済みのビューをコピーすることになります。
[発行] をクリックすると、Visual Studio で必要なすべての資産がコピー先フォルダーにコピーされます。
イメージをビルドする
Docker イメージを定義するために、Dockerfile という名前の新しいファイルを作成します。 Dockerfile には、最終的なイメージをビルドする手順が含まれており、基本イメージ名、必要なコンポーネント、実行するアプリ、その他の構成イメージが含まれています。 Dockerfile は、イメージを作成する docker build
コマンドへの入力です。
この演習では、Docker Hub 上にある microsoft/aspnet
イメージに基づいてイメージをビルドします。
基本イメージである mcr.microsoft.com/dotnet/framework/aspnet:4.8
は、Windows Server イメージです。 Windows Server Core、IIS、ASP.NET 4.8 が含まれています。 このイメージをコンテナー内で実行すると、IIS とインストールされている Web サイトが自動的に起動します。
イメージを作成する Dockerfile は、次のようになります。
# The `FROM` instruction specifies the base image. You are
# extending the `mcr.microsoft.com/dotnet/framework/aspnet:4.8` image.
FROM mcr.microsoft.com/dotnet/framework/aspnet:4.8
# The final instruction copies the site you published earlier into the container.
COPY ./bin/Release/PublishOutput/ /inetpub/wwwroot
この Dockerfile には ENTRYPOINT
コマンドが存在しません。 これは必要ありません。 IIS が組み込まれた Windows Server を実行するとき、IIS プロセスは、aspnet 基本イメージ内で起動するように構成されたエントリ ポイントとなります。
Docker ビルド コマンドを実行し、ASP.NET アプリを実行するイメージを作成します。 これを行うには、プロジェクトのディレクトリで PowerShell ウィンドウを開き、ソリューション ディレクトリに次のコマンドを入力します。
docker build -t mvcrandomanswers .
このコマンドは、Dockerfile の指示に従って新しいイメージをビルドし、そのイメージに mvcrandomanswers という名前を付けます (-t というタグを付けます)。 その手順には、Docker Hub から基本イメージをプルし、それからそのイメージにアプリを追加する作業が含まれることがあります。
そのコマンドの完了後、docker images
コマンドを実行して新しいイメージの情報を参照できます。
REPOSITORY TAG IMAGE ID CREATED SIZE
mvcrandomanswers latest 86838648aab6 2 minutes ago 10.1 GB
IMAGE ID はコンピューターによって異なります。 では、アプリを実行しましょう。
コンテナーの開始
コンテナーを開始するには、次の docker run
コマンドを実行します。
docker run -d --name randomanswers mvcrandomanswers
-d
引数は、デタッチ モードでイメージを開始するよう Docker に指示します。 つまり、Docker イメージは現在のシェルから切断された状態で実行されます。
多くの Docker の例では、コンテナーとホスト ポートをマップする -p が表示される場合があります。 既定の aspnet イメージでは、ポート 80 でリッスンして公開するようにコンテナーが既に構成されています。
--name randomanswers
は、実行するコンテナーに名前を付けます。 この名前は、ほとんどのコマンドでコンテナー ID の代わりに使用できます。
mvcrandomanswers
は、開始するイメージの名前です。
ブラウザーでの確認
コンテナーが起動したら、例に示されている http://localhost
を使用して実行中のコンテナーに接続します。 その URL をブラウザーに入力すると、実行中のサイトが表示されます。
Note
一部の VPN またはプロキシ ソフトウェアが原因でサイトに移動できない場合があります。 コンテナーが動作していることを確認するために、それらを一時的に無効にできます。
GitHub のサンプル ディレクトリに含まれる PowerShell スクリプトは、これらのコマンドを実行します。 PowerShell ウィンドウを開き、ソリューション ディレクトリに移動して、次のように入力します。
./run.ps1
上記のコマンドはイメージをビルドし、お使いのマシン上のイメージのリストを表示して、コンテナーを起動します。
コンテナーを停止するには、docker stop
コマンドを実行します。
docker stop randomanswers
コンテナーを削除するには、docker rm
コマンドを実行します。
docker rm randomanswers