將 ASP.NET MVC 應用程式遷移到 Windows 容器

在 Windows 容器中執行現有的 .NET Framework 架構應用程式,不需要對您的應用程式進行任何變更。 若要在 Windows 容器中執行您的應用程式,您可以建立包含您應用程式的 Docker 映像,然後啟動該容器。 本主題說明如何才能擷取現有 ASP.NET MVC 應用程式 (ASP.NET MVC application) 並部署到 Windows 容器中。

您可以從現有的 ASP.NET MVC 應用程式開始,然後使用 Visual Studio 建置已發行的資產。 您可以使用 Docker,建立其中包含並會執行您應用程式的映像。 接著瀏覽到 Windows 容器中正在執行的網站,並確認應用程式可以正常運作。

本文假設您對 Docker 有基本認識。 您可藉由閱讀 Docker 概觀來了解 Docker。

您將在容器中執行的應用程式是會隨機回答問題的簡單網站。 此應用程式是沒有驗證或資料庫儲存體的基本 MVC 應用程式,讓您著重於將 Web 層移至容器。 未來的主題將說明如何移動和管理容器化應用程式中的永續性儲存體。

移動您的應用程式包含下列步驟:

  1. 建立發行工作以建置映像資產
  2. 建立用以執行應用程式的 Docker 映像
  3. 啟動執行映像的 Docker 容器
  4. 使用瀏覽器確認應用程式

完成的應用程式在 GitHub 上。

必要條件

開發電腦必須具有下列軟體:

重要

如果您在使用 Windows Server 2016,請遵循容器主機部署 - Windows Server 的指示。

安裝並啟動 Docker 之後,以滑鼠右鍵按一下系統匣圖示,然後選取 [切換至 Windows 容器]。 這是執行以 Windows 為基礎的 Docker 映像時的必要動作。 此命令需要幾秒鐘的時間執行:

Windows 容器

發行指令碼

收集您需要在一個地方載入 Docker 映像中的所有資產。 您可以使用 Visual Studio 的 [發行] 命令來建立應用程式的發行設定檔。 此設定檔會將所有資產放在一個樹狀目錄中,您稍後會在本教學課程將此目錄複製到目標映像。

發行步驟

  1. 以滑鼠右鍵按一下 Visual Studio 中的 Web 專案,然後選取 [發行]
  2. 按一下 [自訂設定檔] 按鈕,然後選取 [檔案系統 ] 作為 方法。
  3. 選擇目錄。 依照慣例,下載的範例會使用 bin\Release\PublishOutput

發佈連線

開啟 [設定] 索引標籤的 [檔案發佈選項] 區段。選取[發行期間先行編譯]。 此最佳化表示您將要編譯 Docker 容器中的檢視,而正在複製預先編譯的檢視。

發佈設定發佈

按一下 [發行],Visual Studio 會將所有需要的資產複製到目的資料夾。

建立映像

建立名為 Dockerfile 的新檔案,以定義您的 Docker 映射。 Dockerfile 包含建置最終映射的指示,並包含任何基底映射名稱、必要元件、您要執行的應用程式,以及其他組態映射。 Dockerfile 是建立映射之 docker build 命令的輸入。

在此練習中,您將根據 microsoft/aspnet 位於Docker Hub上的映射來建置映射。 基礎映像 microsoft/aspnet 是 Windows Server 映像。 它包含 Windows Server Core、IIS 和 ASP.NET 4.7.2。 當您在容器中執行此映像時,其將會自動啟動 IIS 和已安裝的網站。

建立映像的 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 中的指示來建置新的映射,並將 (-t 標記) 映射命名為 mvcrandomanswers。 這可能包括從 Docker Hub 提取基礎映像,然後將您的應用程式加入至該映像。

該命令完成之後,您可以執行 docker images 命令來了解新映像的相關資訊:

REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
mvcrandomanswers              latest              86838648aab6        2 minutes ago       10.1 GB

您電腦上的映像識別碼會有所不同。 現在,讓我們來執行應用程式。

啟動容器

執行下列 docker run 命令來啟動容器:

docker run -d --name randomanswers mvcrandomanswers

-d 引數會指示 Docker 在離線模式中啟動映像。 這表示 Docker 映像可在與目前殼層中斷連線的情況下執行。

在許多 Docker 範例中,您可能會看到 -p 來對應容器和主機埠。 預設 aspnet 映射已設定容器以接聽埠 80 並公開它。

--name randomanswers 提供執行中容器的名稱。 您可以使用此名稱,而不是大多數命令中的容器識別碼。

mvcrandomanswers 是要啟動之映像的名稱。

在瀏覽器中確認

容器啟動時,請使用 http://localhost 所示的範例連線到執行中的容器。 在您的瀏覽器中輸入該 URL,您應該會看到執行中的網站。

注意

某些 VPN 或 Proxy 軟體可能會阻止您瀏覽至您的網站。 您可以暫時停用,以確保您的容器可以正常運作。

GitHub 上的範例目錄包含 PowerShell 指令碼,可為您執行這些命令。 開啟 PowerShell 視窗,將目錄變更為您的方案目錄,然後輸入:

./run.ps1

上述命令會建置映射、顯示您電腦上的映射清單,以及啟動容器。

若要停止容器,請發出 docker stop 命令:

docker stop randomanswers

若要移除容器,請發出 docker rm 命令:

docker rm randomanswers