コラム

[Docker]DockerをAzureで使用

予算の都合やデプロイのし易さ等、クラウド上でのDocker使用は適切な選択肢になる場合があります。
今回はPostgreSql、Adminer、SpringBootアプリのコンテナをAzure上に作成する手順を説明していきます。

前提条件

・Docker Desktopが動作する環境にある事
 (Docker Desktopの動作環境はDocker ComposeをWindowsで使用するを見てください。)

Azure側の準備

Azureの準備はコマンドを使用してますが、azure portalからでも可能です。

Azureへのログイン

PowerShellを起動後、次のコマンド実行「docker login azure」
実行後にブラウザでアカウント選択画面が出ます。

ここからログイン処理を行って下さい。

リソースグループ作成

azコマンドでリソースグループを作成します。(azコマンドのインストール方法はここで見れます。)
今回は「myResourceGroup」という名称で作成します。

「az group create --name myResourceGroup --location japaneast」を実行。
正常に作成されたかは「az group list」で確認できます。

ACI(Azure Container Instances)コンテキスト作成

今回は「aci001」という名称で作成します。

「docker context create aci aci001」コマンドを実行し、
正常に作成されたかは「docker context ls」で以下の図のような一覧で確認できます。


Volumeに関連付けるAzureストレージ作成

azureではvolumeをストレージで管理する為、使用したいvolumeがある場合その分のストレージを作成します。
今回はDBの初期化処理の為のvolumeを作成するので、その分のストレージを作成します。
(DBデータのvolumeは何故か出来なかったので今回は省きます)

・先ほど作成したコンテキスを使用するように設定
 「docker context use aci001」コマンド実行
・ストレージ作成(ファイル共有名:initdata-share、アカウント名:initdatavolume)
 「docker volume create initdatashare --storage-account initdatavolume」コマンド実行

正常に作成されたかは、「az storage account list」かazure portal上で確認できます。

ストレージ上に初期化ファイルアップロード

上記で作成したストレージに初期化用のファイルをアップロードします。
以下の2つのファイルを用意します。

  CREATE TABLE user (
    id bigserial,
    username VARCHAR(30),
	);
  INSERT INTO user (username) VALUES ('sato');
  INSERT INTO user (username) VALUES ('oohashi');
  INSERT INTO user (username) VALUES ('sasaki');

次のコマンドでファイルアップロード

「az storage file upload --account-name initdatavolume--share-name initdata-share--source   ./db/init/01_create_table.sql」
「az storage file upload --account-name initdatavolume--share-name initdata-share--source ./db/init/02_insert_data.sql」

正常に作成されたかは、「az storage file list--account-name initdatavolume--share-name initdata-share」かazure portal上で確認できます。

Azure Container Registry の作成

SpringBootアプリの様な予めDockerHubに用意されてないイメージを保管する為に作成する必要があります。

以下のコマンド作成(名称はcontainerregdvで作成)
「az acr create --resource-group myResourceGroup --name containerregdv --sku Basic」を実行

SprintBootアプリの用意

SpringBootのDockerイメージ作成で使用したSpringBootアプリを使用します。
DBの中身を一覧表示する単純なアプリです。此方からソースを取得できます。(docker-compose.yml、DockerFileも含まれています)

ディレクトリ構成・Dockerファイル内容

docker-sample-azure/
                   ├─ account/
                   ├─ docker-compose.yml

accountにはSpringBootのアプリを配置
docker-compose.ymlを作成

version: '3.8'

volumes:
  initdata:
    driver: azure_file
    driver_opts:
      share_name: initdata-share
      storage_account_name: initdatavolume

networks:
  default:

services:

  db:
    image: postgres
    container_name: db
    ports:
      - 5432:5432
    environment:
      - POSTGRES_DB=${DB_NAME:-postgres}
      - POSTGRES_USER=${DB_USER:-postgres}
      - POSTGRES_PASSWORD=${DB_PASSWORD:-password}
    volumes:
      - initdata:/docker-entrypoint-initdb.d
      #- ../../share/postgresql/data:/var/lib/postgresql/data

  adminer:
    image: michalhosna/adminer
    container_name: adminer
    ports:
      - 8080:8080
    restart: always
    depends_on:
      - db
    environment:
      - ADMINER_SERVER=db
      - ADMINER_DRIVER=pgsql
      - ADMINER_DB=${DB_NAME:-postgres}
      - ADMINER_USERNAME=${DB_USER:-postgres}
      - ADMINER_PASSWORD=${DB_PASSWORD:-password}
      - ADMINER_NAME=ADMINER for PostgreSQL DB
      
      
  account:
    image: containerregdv.azurecr.io/account
    container_name: account
    build:
      context: ./account
      dockerfile: Dockerfile
    ports:
      - "80:80"
    depends_on:
      - db
    environment:
      - CONTAINER_NAME=account
      - PORT=80
      - DB_USER=${DB_USER:-postgres}
      - DB_PASSWD=${DB_PASSWORD:-password}
      - DB_URL=${DB_URL:-r2dbc:postgresql://db:5432/postgres}
    networks:
      - default

以下、少しファイルの内容説明。

volumes:
  initdata:
    driver: azure_file
    driver_opts:
      share_name: initdata-share
      storage_account_name: initdatavolume

volumeの設定、DBの初期化ファイルが入っているストレージアカウント、ファイル共有名を指定
driver: azure_fileの記述の部分はそう記述するように決まっています。

 account:
    image: containerregdv.azurecr.io/account
    container_name: account
    build:
      context: ./account
      dockerfile: Dockerfile
    ports:
      - "80:80"
    depends_on:
      - db
    environment:
      - CONTAINER_NAME=account
      - PORT=80
      - DB_USER=${DB_USER:-postgres}
      - DB_PASSWD=${DB_PASSWORD:-password}
      - DB_URL=${DB_URL:-r2dbc:postgresql://db:5432/postgres}
    networks:
      - default

SpringBootアプリの設定
image: containerregdv.azurecr.io/accountの記述は「AzureContainerRegistry名.azurecr.io/アプリ名」の形式で指定します。

ビルド・起動

Azure Container Registryへログイン

「az acr login --name containerregdv」コマンドを実行

ビルド

SpringBootアプリのイメージを作成します。

コンテキストをdefautに設定します。
「docker context use default」コマンド実行


コンテキスト一覧を表示して確認します。
「docker context ls」コマンド実行
以下の用に使用コンテキスにはアスタリスクがついています。

ビルドを実行します。
「docker-compose build account」コマンドを実行


dockerイメージ一覧を表示して確認します。
「docker images」コマンド実行
以下の用にイメージが表示されていればビルドが正常に出来ています。

Azure Container Registryへのプッシュ

ビルドしたSpringBootイメージをAzure Container registryへプッシュします。

「docker-compose push」コマンドを実行
レジストリにイメージが格納されてるかを確認します。
「az acr repository show --name containerregdv --repository account」コマンド実行

起動

ACIにデプロイしてアプリケーションを実行します。

コンテキストをAzureのコンテキストに設定します。
「docker context use aci001」コマンド実行


アプリケーションを起動します。
「docker compose up」コマンド実行


プロセス一覧で起動確認します。
「docker ps」コマンド実行

PORTSのIPにブラウザでアクセス
上記の例だとhttp://52.224.17.52/account

以上の用に表示されていれば正常です。

最後に

AzureでのDocker使用を試してみましたが、SpringBootは上手くできたのですがDBの永続化データをvolumeとして管理出来ない事象が出ました。
MySql等でも試してみましたが、私がやった範囲のバージョンでは出来ませんでした。
理由は今の所不明ですが、後に調べてみようと思います。

この記事をシェアする
  • Facebookアイコン
  • Twitterアイコン
  • LINEアイコン

お問い合わせ ITに関するお悩み不安が少しでもありましたら、
ぜひお気軽にお問い合わせください

お客様のお悩みや不安、課題などを丁寧に、そして誠実にお伺いいたします。

お問い合わせはこちら
お電話でのお問い合わせ 03-5820-1777(平日10:00〜18:00)
よくあるご質問