ローカルの Dockerイメージ を Azure Container Registry（ACR）に プッシュしてみました


## 概要

[この記事](https://qiita.com/turupon/items/e637ded0a42806b4e901) から始まる３つのステップで稼働させた一連のローカルDockerコンテナアプリのイメージを Azure Container Registry（ACR）にプッシュするまでの手順を説明します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/ccb4fdfc-1b3e-a23b-d3b3-b1c9b8715074.png)

## ローカル環境

macOS Big Sur 11.3 
python 3.8.3

## 事前準備

[この記事](https://qiita.com/turupon/items/96c5ce8c7c1d39373eac) を参考にして、AKS と ACR を構築していること。

---

## コンテナイメージのプッシュ

### Docker環境での動作確認

[この記事](https://qiita.com/turupon/items/7d1eb598e0291fb999da) にあるように、ローカルのIoTデータ生成プログラムからのデータがGrafanaでリアルタムに表示されることを確認します。この状態のイメージを使用していきます（「docker-compose stop」の実行）。

### コンテナIDの取得

```
$ docker ps -a

CONTAINER ID   IMAGE                                             COMMAND                  CREATED       STATUS                        PORTS     NAMES
b244ceea916e   confluentinc/cp-enterprise-control-center:6.0.0   "/etc/confluent/dock…"   2 hours ago   Exited (143) 37 seconds ago             control-center
05b3be2d1261   confluentinc/cp-ksqldb-cli:6.0.0                  "/bin/sh"                2 hours ago   Exited (0) 38 seconds ago               ksqldb-cli
bac53178ec6a   confluentinc/cp-ksqldb-server:6.0.0               "/etc/confluent/dock…"   2 hours ago   Exited (143) 34 seconds ago             ksqldb-server
4463b1c854a3   cp-connect-base:latest                            "/etc/confluent/dock…"   2 hours ago   Exited (143) 32 seconds ago             connect
93339b96092d   confluentinc/cp-schema-registry:6.0.0             "/etc/confluent/dock…"   2 hours ago   Exited (143) 30 seconds ago             schema-registry
94f49390c759   confluentinc/cp-server:6.0.0                      "/etc/confluent/dock…"   2 hours ago   Exited (137) 18 seconds ago             broker
d74cf86680bb   grafana/grafana                                   "/run.sh"                2 hours ago   Exited (0) 38 seconds ago               grafana
21167621d7e3   confluentinc/cp-zookeeper:6.0.0                   "/etc/confluent/dock…"   2 hours ago   Exited (143) 15 seconds ago             zookeeper
5075946da389   rabbitmq:3.8.17-management                        "docker-entrypoint.s…"   2 hours ago   Exited (0) 32 seconds ago               rabbitmq
aaaf61e234c6   influxdb:1.8.6                                    "/entrypoint.sh infl…"   2 hours ago   Exited (0) 36 seconds ago               influxdb
```

### ACRログインサーバーアドレスの取得

```
$ ACR_LOGIN_SERVER=$(az acr list --resource-group $ACR_RES_GROUP --query "[].{acrLoginServer:loginServer}" --output tsv)

$ echo $ACR_LOGIN_SERVER
acr0ituru.azurecr.io
```

### ACR ログインサーバアドレスでのコミット

```
$ docker commit 5075946da389 $ACR_LOGIN_SERVER/rabbitmq:3.8.17
$ docker commit d74cf86680bb $ACR_LOGIN_SERVER/grafana:8.0.6
$ docker commit aaaf61e234c6 $ACR_LOGIN_SERVER/influxdb:1.8.6
$ docker commit 4463b1c854a3 $ACR_LOGIN_SERVER/cp-connect-base:6.0.0
$ docker commit 94f49390c759 $ACR_LOGIN_SERVER/cp-server:6.0.0
$ docker commit b244ceea916e $ACR_LOGIN_SERVER/cp-control-center:6.0.0
$ docker commit 21167621d7e3 $ACR_LOGIN_SERVER/cp-zookeeper:6.0.0
$ docker commit bac53178ec6a $ACR_LOGIN_SERVER/cp-ksqldb-server:6.0.0
$ docker commit 05b3be2d1261 $ACR_LOGIN_SERVER/cp-ksqldb-cli:6.0.0
$ docker commit 93339b96092d $ACR_LOGIN_SERVER/cp-schema-registry:6.0.0


$ docker images | grep $ACR_LOGIN_SERVER

acr0ituru.azurecr.io/cp-connect-base                6.0.0               ab7c3ded2793   7 days ago   1.66GB
acr0ituru.azurecr.io/grafana                        8.0.6               7a91cc35d504   7 days ago   212MB
acr0ituru.azurecr.io/cp-schema-registry             6.0.0               651bacf2cb5c   7 days ago   1.33GB
acr0ituru.azurecr.io/cp-ksqldb-cli                  6.0.0               5c113d6adf2f   7 days ago   785MB
acr0ituru.azurecr.io/cp-ksqldb-server               6.0.0               0987ef6c7751   7 days ago   1.06GB
acr0ituru.azurecr.io/cp-zookeeper                   6.0.0               23253e3dbc5c   7 days ago   721MB
acr0ituru.azurecr.io/cp-control-center              6.0.0               99971d18b95d   7 days ago   995MB
acr0ituru.azurecr.io/cp-server                      6.0.0               1a00ecce9821   7 days ago   1.24GB
acr0ituru.azurecr.io/influxdb                       1.8.6               2ff29d3611c4   7 days ago   308MB
acr0ituru.azurecr.io/rabbitmq                       3.8.17              e99b3b21637f   7 days ago   324MB
```

### ACRへのログイン（プッシュが失敗したときに）

```
$ az acr login --name $ACR_NAME
Login Succeeded
```

### イメージをACRにプッシュ

```
$ docker push $ACR_LOGIN_SERVER/rabbitmq:3.8.17
$ docker push $ACR_LOGIN_SERVER/grafana:8.0.6
$ docker push $ACR_LOGIN_SERVER/influxdb:1.8.6
$ docker push $ACR_LOGIN_SERVER/cp-connect-base:6.0.0
$ docker push $ACR_LOGIN_SERVER/cp-server:6.0.0
$ docker push $ACR_LOGIN_SERVER/cp-control-center:6.0.0
$ docker push $ACR_LOGIN_SERVER/cp-zookeeper:6.0.0
$ docker push $ACR_LOGIN_SERVER/cp-ksqldb-server:6.0.0
$ docker push $ACR_LOGIN_SERVER/cp-ksqldb-cli:6.0.0
$ docker push $ACR_LOGIN_SERVER/cp-schema-registry:6.0.0
```

### イメージ一覧の表示

```
$ az acr repository list --name $ACR_NAME --output table

Result
----------------------------
cp-connect-base
cp-control-center
cp-ksqldb-cli
cp-ksqldb-server
cp-schema-registry
cp-server
cp-zookeeper
grafana
influxdb
rabbitmq
```

### まとめ

これで、Dockerイメージが全てACRに登録されました。

---

## 付録

### イメージ詳細の確認

```
$ az acr repository show --name $ACR_NAME --repository rabbitmq

{
  "changeableAttributes": {
    "deleteEnabled": true,
    "listEnabled": true,
    "readEnabled": true,
    "teleportEnabled": false,
    "writeEnabled": true
  },
  "createdTime": "2021-07-30T00:41:56.1995854Z",
  "imageName": "rabbitmq",
  "lastUpdateTime": "2021-07-30T00:41:56.3674178Z",
  "manifestCount": 1,
  "registry": "acr0ituru.azurecr.io",
  "tagCount": 1
}
```

### イメージタグの確認

```
az acr repository show-tags -n $ACR_NAME --repository rabbitmq --output table

Result
--------
3.8.17
```

### イメージの削除

```
$ az acr repository delete --name $ACR_NAME --repository rabbitmq
Are you sure you want to delete the repository 'rabbitmq' and all images under it? (y/n): y
```

### レジストリ サイズの管理

```
$ az acr show-usage --resource-group $ACR_RES_GROUP --name $ACR_NAME --output table

NAME      LIMIT         CURRENT VALUE    UNIT
--------  ------------  ---------------  ------
Size      107374182400  3043966295       Bytes
Webhooks  10            0                Count
```

---

## 番外編

### イメージを ACR に 直接build する方法

例）connect のコンテナイメージを ACR に build します

```
$ az acr build --registry $ACR_NAME --image cp-connect-base:latest docker/
```

```
<docker/Dockerfile>

FROM confluentinc/cp-server-connect-base:6.0.0
RUN confluent-hub install --no-prompt confluentinc/kafka-connect-rabbitmq:latest
RUN confluent-hub install --no-prompt confluentinc/kafka-connect-influxdb:latest
```

## 超番外編

### RabbitMQ - Management Plugin による JSON を用いた一括設定

起動時に JSON ファイルを読み込んで Queue などの作成・設定を一括で行う機能が Management Plugin に備わっています。

rabbitmqに接続します。該当ディレクトリに移動します。

```
$ docker exec -it rabbitmq /bin/bash
root@rabbitmq:/# apt-get update
root@rabbitmq:/# apt-get install vim
root@rabbitmq:/# cd /etc/rabbitmq
```
「rabbitmq.conf」に以下の設定を追加します。

```/etc/rabbitmq/rabbitmq.conf
management.load_definitions = /etc/rabbitmq/cp_definitions.json
```

設定 JSON ファイル

```cp_definitions.json

{
    "rabbit_version": "3.8.17",
    "rabbitmq_version": "3.8.17",
    "product_name": "RabbitMQ",
    "product_version": "3.8.17",
    "users": [
        {
            "name": "hogehoge",
            "password_hash": "fhjanfeodvyaer;85sdZzHvqyIWg9Yqpe3vtU8s5YTXWk27e",
            "hashing_algorithm": "rabbit_password_hashing_sha256",
            "tags": "administrator",
            "limits": {}
        }
    ],
    "vhosts": [
        {
            "name": "/"
        }
    ],
    "permissions": [
        {
            "user": "guest",
            "vhost": "/",
            "configure": ".*",
            "write": ".*",
            "read": ".*"
        }
    ],
    "topic_permissions": [],
    "parameters": [],
    "global_parameters": [
        {
            "name": "internal_cluster_id",
            "value": "rabbitmq-cluster-id-rYaWHykqgYLbTdQoLsCYdQ"
        }
    ],
    "policies": [],
    "queues": [
        {
            "name": "IoTHub",
            "vhost": "/",
            "durable": false,
            "auto_delete": false,
            "arguments": {}
        }
    ],
    "exchanges": [],
    "bindings": []
}
```

「rabbitmq.conf」を確認します。

```
root@rabbitmq:/etc/rabbitmq# cat rabbitmq.conf

loopback_users.guest = false
listeners.tcp.default = 5672
default_pass = guest
default_user = guest
management.tcp.port = 15672
management.load_definitions = /etc/rabbitmq/cp_definitions.json
```