1. 概要

アプリケーションが複数のデータベースを使用することは珍しくありません。 機密情報を独自の資格情報を持つ別のデータベースに配置する必要がある場合があります。 または、アプリケーションがマルチテナントであり、テナントごとに1つのデータベースが必要な場合もあります。

この短い記事では、 docker-composeとMariaDBを使用してサービスを実行し、複数のデータベースにアクセスする方法を説明します

また、以下の説明では、データベースの増分アップグレードについては説明していません。 これは、migrationsを使用してアプリケーション層で実現できます。

2. MariaDBを使用してスキーマとデータをエクスポートする

このチュートリアルで採用するアプローチは、2つの既存のデータベースをバックアップすることです。 次に、そのバックアップをベースとして使用し、docker-composeを使用して新しいシステムでこれらのデータベースを最初から再構築します。

開発環境にすでにデータベースdb1db2があるとします。 mariadb-dumpを使用してそれらをバックアップできます。

$ mariadb-dump --skip-add-drop-table --databases db1 db2 > databases-backup.sql

このコマンドは、スキーマとデータの両方をバックアップします。 スキーマのみが必要な場合は、 –no-data引数を追加できます。

テーブルの削除コマンドをスキップするには、–skip-add-drop-table引数が必要です。 後で、docker-composeはデータベースを1回だけ初期化する必要があります。 ただし、データベースを再度初期化しようとしても、テーブルとデータは削除されません。

これは、上記のコマンドのdatabases-backup.sqlです。

...
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `db1`
USE `db1`;
CREATE TABLE `table1` ( ...
...
INSERT INTO `table1` VALUES ( ...
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `db2`
USE `db2`;
...
CREATE TABLE `table2` ( ...
...
INSERT INTO `table2` VALUES ( ...

この1つのバックアップには、両方のデータベースが含まれています。 これは、新しい環境を作成するためのdocker-compose構成の主要部分になります。

3. docker-composeファイルを作成します

docker-compose.ymlファイルを表示することから始めましょう。 主なセクションについては後で説明します。

version: '3.8'

services:
  db:
    image: mariadb
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD
    volumes:
      - databases:/var/lib/mysql
      - ./databases-backup.sql:/docker-entrypoint-initdb.d/databases-backup.sql
  app:
    build: ./app
    ports:
      - 80:80
volumes:
  databases:

以下を実行してサービスを開始できます。

$ docker-compose up

YAMLファイルの最後にあるボリュームセクションに注目しましょう。 Dockerコンテナーは一時的なものであり、再起動後も変更を加えても存続しません。 Volumes は、コンテナーの外部にコンテナーから独立したストレージを提供することで、この問題に対処します。

上記の例では、ボリュームをリクエストし、databasesという名前を付けました。 その後、 / var / lib /mysqlにMariaDBのボリュームをマウントする必要があります。 これは、dbサービス内のvolumesセクションで確認できます。

volume の2行目はボリュームを要求していませんが、それでも非常に重要です。 最後のセクションからコンテナ内の特定の場所にバックアップをマウントします。 これは、MariaDBDockerイメージドキュメントから取得したものです。 新しいインスタンスを初期化するには、/docker-entrypoint-initdb.dフォルダー内にバックアップファイルが必要です。

docker-composeが起動するとすぐに、サービス名を参照してデータベースにアクセスできます。 たとえば、 app サービス内で、MariaDBターミナルクライアントを実行して両方のデータベースにアクセスできます。

$ mariadb -h db
> USE db1;
> SELECT * FROM table1;
...
> USE db2;
> SELECT * FROM table2;
...

docker-compose.yml ファイルでは、 app サービスのポート80のみを公開し、データベースにはポートを公開していません。 つまり、MariaDBは docker-compose の他のサービスにのみアクセスでき、アプリは外部からアクセスできます。

4. 結論

この短い記事では、複数のデータベースを管理する1つの方法は、MariaDBとdocker-composeを使用することであることを学びました。 MariaDBはデータベースを初期化するための便利な方法を提供し、docker-composeは他のすべてのサービスをデータベースサーバーに接続するための配線を提供します。

同じ結果を達成する方法は他にもありますが、ここで説明する方法は、最も簡単に実装できる方法の1つです。