.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/d105e4f8-692c-cfd2-5184-7d8551b8bba1.png)

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

![aspnetweb-vb20-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/145b31e3-6d3f-b1b3-01f4-bffc1cb2761d.png)

### 空のまま作成

![aspnetweb-vb20-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/6a6db87b-0246-6b60-3ba8-520107b84af2.png)

### Web フォームを追加

![aspnetweb-vb20-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/009364e9-935e-2a28-3d8f-c929184faacc.png)

### Default にする

![aspnetweb-vb20-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/bb7e4ef4-3cd0-de44-b096-3de605e4c15d.png)

### HTML を変更

```aspx
    <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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/cdb89d0b-2761-6753-4093-a9088a3c920c.png)

### コードを表示

![aspnetweb-vb20-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/97ba8e59-9b32-31b8-a650-1072b74467e1.png)

### コードを追加

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

![aspnetweb-vb20-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/a0d07743-acf3-32db-ba1b-4ba5454d3a0b.png)

### IIS Express で Debug

![aspnetweb-vb20-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/7a08ab44-16fc-9f6a-f6ce-84b44bbcf64f.png)

### ローカル環境で動作確認

![aspnetweb-vb20-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/b280cabe-cf05-bfc1-0263-e97839ef8a28.png)

### Terminal を開く

![aspnetweb-vb20-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/8e0bd1b0-ca7c-21c9-f0ac-541f3f68b587.png)

### Dockerfile を作成

```powershell
Out-File Dockerfile -encoding ascii

devenv /edit Dockerfile
```

```Dockefile
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/da3d58fe-bf54-d4e8-3a51-b0701b8de3b9.png)

### Docker で動作確認

```powershell
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/957fd6a6-2ceb-2409-5991-4c06d35a016a.png)

## AppService 作成

```powershell
$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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/4d17888a-433e-a390-458e-48f827b03676.png)

## 参考

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

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

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