- 03-5820-1777平日10:00〜18:00
- お問い合わせ
予算の都合やデプロイのし易さ等、クラウド上でのDocker使用は適切な選択肢になる場合があります。
今回はPostgreSql、Adminer、SpringBootアプリのコンテナをAzure上に作成する手順を説明していきます。
前提条件
・Docker Desktopが動作する環境にある事
(Docker Desktopの動作環境はDocker ComposeをWindowsで使用するを見てください。)
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」を実行
SpringBootのDockerイメージ作成で使用したSpringBootアプリを使用します。
DBの中身を一覧表示する単純なアプリです。此方からソースを取得できます。(docker-compose.yml、DockerFileも含まれています)
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等でも試してみましたが、私がやった範囲のバージョンでは出来ませんでした。
理由は今の所不明ですが、後に調べてみようと思います。