技術的な話

Azure コンテナーレジストリにdocker-composeでイメージをPushする

Dockerイメージも管理される時代です。
Docker Hubにアップするのも良いですがAWSやAzure、GCPにも同等のサービスがあります。

コンテナレジストリとは

そもそもコンテナレジストリとはコンテナイメージを管理、格納するレジストリサービスです。
AWS、Azure、GCPのレジストリサービスを使用すると各クラウド会社のサービスとの連携がし易くなり、開発・運用が楽になったりします。

3大クラウドが提供するレジストリサービス

  • AWS:Amazon Elastic Container Registry (ECR)
  • Azure:Azure Container Registory(ACR)
  • GCP:Container Registry

https://aws.amazon.com/jp/ecr/

https://azure.microsoft.com/ja-jp/services/container-registry/

https://cloud.google.com/container-registry/

Azure Container Registoryを作成してみる

Azureのコンソールにアクセスする

コンソールにアクセスしたら検索ボックスにコンテナと入力します。
そうするとコンテナーレジストリが表示されるので選択します。

コンテナーレジストリを新規作成する

画面左上に新規ボタンがあるので新規作成します。

コンテナーレジストリを新規作成する

リソースグループの選択の後、レジストリ名を入力します。
場所やSKUはお好みで。

あとはデフォルトでも問題ないです

その後にネットワークの設定、暗号化、タグなどの設定画面が続きますが、Premium SKU出ない限り基本的には不要で問題無いです。

最後に作成をクリックして完了です。

作成が完了したら少し設定を変更します

作成されたら該当のコンテナーレジストリ画面を開きます。
左側のメニューからアクセスキーを選択します。
管理者ユーザが初期状態では無効となっているので有効とします。

有効になるとパスワードなどが表示されます。
以下をメモしておきます。

  • ログインサーバー
  • ユーザ名
  • パスワード

VSCodeを起動してdocker-composeファイルなどを作成する

とりあえず以下のような形でcomposeファイルやDockerfileを作成しました。
3つのDockerコンテナーを作成します。
Web、アプリケーション、DBコンテナーに分けてみました。

.
├── docker
│   ├── app
│   │   └── Dockerfile
│   ├── mysql
│   │   └── Dockerfile
│   └── nginx
│       └── Dockerfile
└── docker-compose.yml

version: '3.7'

services:
    nginx:
        container_name: nginx
        build:
            context: .
            dockerfile: ./docker/nginx/Dockerfile
        ports:
            - 80:80
        restart: always
        tty: true
    
    app:
        container_name: app
        build:
            context: .
            dockerfile: ./docker/app/Dockerfile
        ports:
            - 3000:3000
        restart: always
        tty: true
    
    mysql:
        container_name: mysql
        build:
            context: .
            dockerfile: ./docker/mysql/Dockerfile
        ports:
            - 3306:3306
        restart: always
        tty: true

Dockerfileは適当にDockerHubからプルしてくるだけです。

FROM nginx:stable

FROM golang:1.16.4-stretch

FROM mysql:5.7.34

ビルドする

composeコマンドを使用してビルドを実行する。

$ sudo docker-compose build --no-cache

Azure コンテナーレジストリにログインする

下記コマンドを実行してログインします。
先程メモしたサーバー名、ユーザ、パスワードを使用します。

$ sudo docker login devregistory.azurecr.io
$ Username: xxxxxxxxxxxx
$ Password: xxxxxxxxxxxx

Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

docker-composeファイルを修正する

下記のようにimageタグを付与してビルド時にタグ付けをします。

version: '3.7'

services:
    nginx:
        container_name: nginx
        image: devregistory.azurecr.io/nginx:latest
        build:
            context: .
            dockerfile: ./docker/nginx/Dockerfile
        ports:
            - 80:80
        restart: always
        tty: true
    
    app:
        container_name: app
        image: devregistory.azurecr.io/app:latest
        build:
            context: .
            dockerfile: ./docker/app/Dockerfile
        ports:
            - 3000:3000
        restart: always
        tty: true
    
    mysql:
        container_name: mysql
        image: devregistory.azurecr.io/mysql:latest
        build:
            context: .
            dockerfile: ./docker/mysql/Dockerfile
        ports:
            - 3306:3306
        restart: always
        tty: true

再度ビルドを実行して、コンテナーレジストリにイメージをPushします。

$ sudo docker-compose build --no-cache
$ sudo docker-compose push

Azure コンテナーレジストリの状況を確認します

コンソールにアクセスしリポジトリを確認します。
下記のようにタグ付けをした通りにイメージが格納されているのが分かります。
これで完了です。このレジストリを使用して他のサービス(Azure Container Instanceなど)と容易に連携できたりします。

まとめ

自分のローカルからクラウドのコンテナーレジストリにイメージをPushしました。
覚えれば意外と簡単にできます。
次はAzureの他のサービスと連携してみたいと思います。

-技術的な話
-, ,