WindowsコンテナDojoトレース③

現在IBM 大西彰さんがシリーズで「WindowsコンテナDojo」を開催してくれております。
この記事ではその内容を自身の Windows 環境にてトレースしていきます。

今回は、2022/5/12 に開催された [WindowsコンテナDojo：第2回 Windowsコンテナアプリのビルド、公開、デプロイ](https://ibm-developer.connpass.com/event/245494/) のトレースです。
主旨:「Windowsコンテナに対応したアプリをVisual Studioでビルドし、コンテナイメージをDocker Hubなどのコンテナレジストリに公開する流れを確認します。公開されているコンテナイメージの名前を利用して、DockerコマンドでWindowsコンテナをデプロイする方法を学びます。さらにアプリを少し更新し、ビルドからデプロイまでの流れを繰り返し、最新版が展開できることを確認します。」
上記リンクにWebinar資料、Webinar動画、コンテナ化推進に関するIBMの取組みご紹介等のドキュメントも添付されています。ぜひご覧ください。

環境については以下を参照。
「仮想マシンの実⾏環境は、Hyper-V以外の環境(Oracle VM VirtualBox, VMware Workstationなど)を
すでにお持ちの場合は、そちらをお使いください。
準備編(前編に続き本編も同様)では、Windows PC上に全ての環境を整えることを想定しています。
Mac OS上にWindows 10/11、Windows Server 2019を揃えて環境を整えられますが、
ホストするデバイスの空きリソース (CPUコア、メモリ、SSDの空き状況)にご注意ください。」
また、WindowsコンテナのホストOSとして以下が対象となるようです。
・Windows Server 2016
・Windows Server 2019
・Windows Server 2022
・Windows 10
・Windows 11

ちなみに私は Windows10 (Intel Core i9-10900K を積んだ2年前の自作PC) を使って参加します。

### ０．今回の大まかな流れ
1. Dockerアプリ  ビルド
1. Docker Hub への公開
1. Docker Hub からデプロイ

### １．Docker アプリ  ビルド
前回のDojoで作成したソリューション(HelloContainer01.sln)を開きます。
|![011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/d6c8dbac-859d-fbf1-0779-d334a65f3926.png)|
|:--|

また、Windows Container を動作させるため、Docker Desktop を「Windows Container」モードにしておく。※Linux Container モードの場合のみ実施
![052.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/7c0e1df1-ac6b-df7e-a8fd-2e2029880e28.png)

ここでDebug/Releaseビルドにより実行されるコードが分岐されることを示すため、以下のようなコードを「Default.aspx」の７行目ー１３行目に入れます。
![032.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/044c701e-491d-0ed6-8fa1-5f9179e18818.png)


上記、実行されるコードは以下のようにビルド構成によって切り替えることができます。
#### デバッグビルドによる成果物実行時
以下のように「Debug」を選択して、三角形の濃い緑ボタンをクリック
![041.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/08e10c1a-2c93-6215-0830-4e149bfb167d.png)


#### リリースビルドによる成果物実行時
以下のように「Release」を選択して、三角形の淡い緑ボタン(デバッグなしで開始；Ctrl+F5)をクリック
![042.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/35c936fd-27fc-e5d3-822b-cd0a32448523.png)
※注) リリースビルドによる成果物は濃い緑ボタンによりデバッグ実行しても動きません。


### ２．Docker Hub への公開
開いたソリューション上で[ビルド] - [○○○の発行(H)]を選択するか、[ソリューションエクスプローラ] - [発行] を選択。
![141.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/8dc84ae0-4362-1298-7acb-ae0d3f6ecf31.png)



次のダイアログでは、「Docker Container Registry」選択 →「Docker Hub」選択 → ocker Hub へのログイン情報を入力 → 実行プロファイル作成完了 まで実施すると、、、
![185.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/1c0c2080-8ebc-c4f1-48a2-cdb656c66e1b.png)



「公開準備が完了しました。」のメッセージが表示されます。
![200.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/e14b3039-50da-0506-98dd-b27b43486934.png)
ここで後述のイメージPush時に接続失敗とならないように Docker Hub へのアクセスを確認するため、画面中に「リポジトリ」と表示されたリンクをクリックします。

リンクをクリックすると404エラー画面になりますが、画面上の「Sign In」をクリックすると「Unorthorized_client」になります。さらに「Back to homepage」をクリックするとDocker Hub にログインできます。
![241.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/882efd2b-fb9b-4d10-8d5b-fabab175c05b.png)

また、イメージタグについて私は以下のようにしています。
デフォルトは「ユーザー定義タグ」なのですが、変更し忘れると同じタグのイメージを上書きしてしまうので「公開時にタグを生成」としています。するとイメージPushのタイミングでタイムスタンプをタグとして機械的につけてくれます。
![265.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/142aa754-fd69-713b-153b-4683d0a99761.png)

※タイムスタンプをタグにすると以下のようになります。
![271.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/5f69dcb4-9c27-6515-738a-e3dc1133cd8e.png)


後は「発行」をクリックするだけで、イメージをDocker Hub に Push してくれます。(とても簡単！)
![301.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/32ceec6f-b4ea-62d7-1cd3-e875159bf4fd.jpeg)

Docker Hub に Push されたイメージ。同じタグになっていますね。
![312.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/e50c873f-004b-dd7e-cab2-f4533a7c5bb9.png)


### ３．Docker Hub からデプロイ
大西さんの資料では、
```
docker run --name wcon --rm -it -d -p 8000:80 oniak3/hellowcon01:latest
```
コマンドにより、Docker Hub から Pull してデプロイまでできていました。一方、私の環境では同様のコマンドを打つと以下のようなエラーになりました。
```
docker: Error response from daemon: manifest for terumatsu/hellowcontainer01:20220815125842 not found: manifest unknown: manifest unknown.
```
理由はタグの指定がおかしいとのことです。
Docker Hub に示されたタグと同じにしても状況が変わらないのですが、```docker images```によりイメージを確認すると Pull できているようです。
![330.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/1964bf2a-06cf-e683-4495-f32cc8a1d86d.png)

ですので、イメージ名を利用してWindows コンテナ をローカルで実行してみます。
```
docker run --name wcon --rm -it -d 8000:80 terumatsu/hellocontainer01:20220815140448
```
![320.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/1aba206c-1bef-cf17-d598-8db19b51688c.png)

ブラウザで```localhost:8000```にアクセスすると、以下のように ASP.NET Release version の実行を確認することができました。
![340.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/d5be7b83-1e1b-f8fe-64de-8a139dfc3e1a.png)


参照：Speaker Deck資料 [Windows コンテナ Dojo 第2回 Windows コンテナアプリのビルド、公開、デプロイ](file:///D:/googleDrive/personal/%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88/Blog/Windowns%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8ADojo/02/WCPP-Dojo-02-BuildDeploy-20220512.pdf)