😀

.NET Framwork 2.0 のアプリを Azure AppService Hyper-V コンテナで動かしてみた

に公開

背景と目的

その昔、コードを書いている時点では、このシステムが 20 年以上も使われ続けているなんて、全く想像していませんでした。そのシステムは、5 年に 1 回訪れるハードウェア入れ替えにより計 4 回引越を行いました。最初ノート PC 上で動いていたそのシステムは、タワー型の PC サーバーやデータセンターの 1U サーバーに引越、その後仮想化基盤の上で 2 回引越ました。そして今後も使われる事が想定されるそのシステムは、コンテナ化して Azure の AppService に引っ越す事になりました。これらのストーリーは一部フィクションですが、こんなシステムが世の中に存在するのです。

今回は、.NET Framwork 2.0 を用いた ASP.NET Web アプリを VB で作成して、コンテナ化した上で Azure App Service で動かしてみたいと思います。

前提条件

検証で使用したツールは下記の通りです。

  • Visual Studio 2022
  • Docker Desktop for Windows

検証用のアプリを作成

新しいプロジェクト作成

aspnetweb-vb20-01.png

プロジェクト名とフレームワーク選択

aspnetweb-vb20-02.png

空のまま作成

aspnetweb-vb20-03.png

Web フォームを追加

aspnetweb-vb20-04.png

Default にする

aspnetweb-vb20-05.png

HTML を変更

    <div>
        <p>
        Machine Name: <asp:Label id="Label1" 
                     Text="Machine Name" 
                     runat="server"/>
        </p>
        <p>
        Runtime Version: <asp:Label id="Label2" 
                     Text="Runtime Version" 
                     runat="server"/>
        </p>
    </div>

aspnetweb-vb20-06.png

コードを表示

aspnetweb-vb20-07.png

コードを追加

        Label1.Text = Environment.MachineName
        Label2.Text = Environment.Version.ToString()

aspnetweb-vb20-08.png

IIS Express で Debug

aspnetweb-vb20-09.png

ローカル環境で動作確認

aspnetweb-vb20-10.png

Terminal を開く

aspnetweb-vb20-11.png

Dockerfile を作成

Out-File Dockerfile -encoding ascii

devenv /edit Dockerfile
FROM mcr.microsoft.com/dotnet/framework/sdk:3.5 AS build
WORKDIR /app
COPY . .
RUN nuget restore
RUN msbuild /p:Configuration=Release -r:False

FROM mcr.microsoft.com/dotnet/framework/aspnet:3.5-windowsservercore-ltsc2019 AS runtime
WORKDIR /inetpub/wwwroot
COPY --from=build /app .

aspnetweb-vb20-12.png

Docker で動作確認

docker build -t aspnetwebvb20 .

docker run --name aspnetwebvb20 -d -p 8000:80 aspnetwebvb20

http://localhost:8000

docker stop aspnetwebvb20

docker rm aspnetwebvb20

aspnetweb-vb20-13.png

AppService 作成

$region = "japaneast"
$prefix = "aspnetwebvb20"

az group create `
  --name ($prefix + "-rg") `
  --location $region

az acr create `
  --name ($prefix + "acr") `
  --resource-group ($prefix + "-rg") `
  --sku Basic `
  --admin-enabled true

az acr build `
  --platform windows `
  --registry ($prefix + "acr") `
  --image $prefix `
  .

az appservice plan create `
  --name ($prefix + "-plan") `
  --resource-group ($prefix + "-rg") `
  --hyper-v `
  --sku P1V3

$acrpass = az acr credential show `
  --resource-group ($prefix + "-rg") `
  --name ($prefix + "acr") `
  --query passwords[0].value `
  --output tsv

az webapp create `
  --name ($prefix + "-app") `
  --resource-group ($prefix + "-rg") `
  --plan ($prefix + "-plan") `
  --deployment-container-image-name ($prefix + "acr.azurecr.io/" + $prefix + ":latest") `
  --docker-registry-server-user ($prefix + "acr") `
  --docker-registry-server-password $acrpass

AppService で動作確認

aspnetweb-vb20-14.png

参考

az group delete `
  --name ($prefix + "-rg")

下記は、参考サイトです。

https://github.com/microsoft/dotnet-framework-docker/blob/main/samples/aspnetapp/Dockerfile

Discussion