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 層をコンテナーに移動することに集中できます。 今後のトピックで、コンテナー化されたアプリケーションに永続的な記憶域を移動して管理する方法を説明します。

アプリケーションを移行する手順は次のとおりです。

  1. イメージの資産をビルドする発行タスクを作成します。
  2. アプリケーションを実行する Docker イメージをビルドします。
  3. イメージを実行する Docker コンテナーを開始します。
  4. ブラウザーを使用してアプリケーションを検証します。

完成したアプリケーションが GitHub にあります。

前提条件

開発用コンピューターには、次のソフトウェアが必要です。

重要

Windows Server 2016 を使用している場合は、「コンテナー ホストの展開 - Windows Server」の指示に従ってください。

Docker をインストールして起動したら、トレイ アイコンを右クリックし、 [Switch to Windows containers](Windows コンテナーに切り替える) を選択します。 これは、Windows に基づいて Docker イメージを実行するために必要です。 このコマンドの実行には数秒かかります。

Windows コンテナー

発行スクリプト

Docker イメージに読み込む必要があるすべての資産を 1 か所に収集します。 Visual Studio の [発行] コマンドを使用してアプリの発行プロファイルを作成できます。 このプロファイルですべての資産を 1 つのディレクトリ ツリーに集めます。このチュートリアルの後半で、そのディレクトリ ツリーをターゲット イメージにコピーします。

発行の手順

  1. Visual Studio で Web プロジェクトを右クリックし、[発行] を選択します。
  2. [ カスタム プロファイル] ボタンをクリックし、メソッドとして [ファイル システム ] を選択します。
  3. ディレクトリを選択します。 規則により、ダウンロードしたサンプルには bin\Release\PublishOutput が使用されます。

ファイル

[設定] タブの [ファイル発行オプション] セクションを開きます。[発行中にプリコンパイルする] を選択します。 この最適化は、Docker コンテナー内のビューをコンパイルすることを意味し、プリコンパイル済みのビューをコピーすることになります。

発行設定 発行設定

[発行] をクリックすると、Visual Studio で必要なすべての資産がコピー先フォルダーにコピーされます。

イメージをビルドする

Docker イメージを定義するために 、Dockerfile という名前の新しいファイルを作成します。 Dockerfile には、最終的なイメージをビルドする手順が含まれており、基本イメージ名、必要なコンポーネント、実行するアプリ、およびその他の構成イメージが含まれています。 Dockerfile は、イメージを作成する docker build コマンドへの入力です。

この演習では、Docker Hubにあるイメージにmicrosoft/aspnet基づいてイメージを作成します。 基本イメージである microsoft/aspnet は、Windows Server イメージです。 これには、Windows Server Core、IIS、ASP.NET 4.7.2 が含まれています。 このイメージをコンテナー内で実行すると、IIS とインストールされている Web サイトが自動的に起動します。

イメージを作成する Dockerfile は、次のようになります。

# The `FROM` instruction specifies the base image. You are
# extending the `microsoft/aspnet` image.

FROM microsoft/aspnet

# 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