WSL2 でビルドした Docker イメージを Azure Container Registry へ push する

# はじめに
Azure 上の各サービスでコンテナーを実行させるためには、コンテナー レジストリが必要となります。Azure では、カスタムのイメージを格納するためのプライベート コンテナー レジストリとして、Azure Container Registry が提供されています。
ここでは、Azure Portal で Azure Container Registry をセットアップし、WSL2 上の docker CLI からカスタムイメージを push する方法を説明します。

# 前提条件

- WSL2 をインストール
    - セットアップは、[Microsoft ストア版 WSL(Windows Subsystem for Linux) インストール](https://qiita.com/hiromasa-masuda/items/355fe0c882a1a0abe1e1) を参照ください。
- WSL2 へ Docker をインストール
    - セットアップは、[WSL2 に Docker をインストールする](https://qiita.com/hiromasa-masuda/items/4902686b404682376c29) を参照ください。
- カスタム イメージ
    - WSL2 上の Docker にカスタム イメージが必要です。Visual Studio 2022 で開発した Web アプリのコンテナーイメージをビルドする場合は、[Visual Studio 2022 + WSL2 + Docker で ASP.NET Core Web アプリのリモート デバッグ環境構築](https://qiita.com/hiromasa-masuda/items/526c30d3914ae32565aa) を参照ください。
- Azure 環境
    - Azure Container Registry を構築するために必要です。

# Azure Container Registry のセットアップ

[Azure Portal](https://portal.azure.com/) を起動します。[リソースの作成] で、"Container Registry" を検索して、[Container Registry] - [作成] を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172205/187c6ab5-d818-4c4b-7b9c-9672fee9830a.png)

[コンテナーレジストリの作成] で各種項目を入力し、[確認および作成] - [作成] を選択します。
[レジストリ名]: `<入力した値>.azurecr.io` がレジストリの名前になります。docker login, docker push で、このレジストリ名を使用します。
[SKU]: [Basic]、[Standard]、[Premium] から選択します。上位の SKU ほど、ディスク容量、帯域幅のスペックが上がります。作成後に、SKU を変更することもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172205/d6a8a559-9500-5e17-03fa-d434480c36ca.png)

デプロイが完了したら、[リソースに移動] を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172205/abf527e2-1008-4ec4-a2fa-3aae89e140cc.png)

[設定] - [アクセス キー] を選択します。[管理者ユーザー] を [有効] にします。
この画面の [ログイン サーバー]、[ユーザー名]、[Password] は、以降の手順で使用するので、参照できるようにしておいてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172205/0b9e2485-60fc-e388-c97a-ef651867ca13.png)


# Azure Container Registry へイメージを push
WSL 側から、`docker images` コマンドでローカルのイメージを一覧します。
Azure Container Registry へプッシュしたいイメージの "IMAGE ID" を確認してください。
```bash:WSL
$ docker images
REPOSITORY                     TAG       IMAGE ID       CREATED         SIZE
hiromasa/netcorewebapp001      latest    ac25818306de   36 hours ago    217MB
```

`docker tag <IMAGE ID> <新しいイメージ名>` コマンドで、新しいイメージ名を追加します。
<IMAGE ID> には、プッシュしたいイメージの "IMAGE ID" を指定します。
<新しいイメージ名> には、<ログイン サーバー名>/<任意のイメージ名> を指定します。
```bash:WSL
$ docker tag ac25818306de azconreg001.azurecr.io/netcorewebapp001
```
`docker images` コマンドでイメージを一覧します。同じ "IMAGE ID" で新しいイメージ名が追加されていることを確認します。
```bash:WSL
$ docker images
REPOSITORY                                TAG       IMAGE ID       CREATED         SIZE
azconreg001.azurecr.io/netcorewebapp001   latest    ac25818306de   36 hours ago    217MB
hiromasa/netcorewebapp001                 latest    ac25818306de   36 hours ago    217MB
```
`docker login <ログイン サーバー名>` で、Azure Container Registry にログインします。
Username には、Azure Container Registry の [アクセス キー] 画面の [ユーザー名]、Password には、同画面の [password] を指定します。
```bash:WSL
$ docker login azconreg001.azurecr.io
Username:
Password:
...
Login Succeeded
```
`docker push <イメージ名>` で、Azure Container Registry にイメージを push します。
<イメージ名> には、Azure Container Registry のログイン サーバー名を先頭に付与したイメージ名を指定します。
```bash:WSL
$ docker push azconreg001.azurecr.io/netcorewebapp001
Using default tag: latest
The push refers to repository [azconreg001.azurecr.io/netcorewebapp001]
...
```

# Azure Container Registry での確認
Azure Portal 側の [サービス] - [リポジトリ] を選択し、リポジトリの一覧に、push したイメージが表示されていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172205/56bb9bf7-fb98-3280-0ad5-b830e648ec4c.png)

# まとめ
Azure Container Registry へカスタム イメージを push する方法を説明しました。これで、クラウド経由で、カスタム イメージを参照できるようになります。

# 参考
- [Azure Container Registry サービス階層](https://learn.microsoft.com/ja-jp/azure/container-registry/container-registry-skus)
- [WSL2 に Docker をインストールする
](https://qiita.com/hiromasa-masuda/items/4902686b404682376c29)
- [Visual Studio 2022 + WSL2 + Docker で ASP.NET Core Web アプリのリモート デバッグ環境構築](https://qiita.com/hiromasa-masuda/items/526c30d3914ae32565aa)