MySQLとPostgreSQLをDockerとDocker Composeで連携させる:実践ガイド
DockerとDocker Composeで複数のデータベースを使用する
要件
- Dockerがインストールされていること
概要
DockerとDocker Composeを使用すると、個々のデータベースインスタンスを分離したコンテナで実行できます。これにより、データベースを独立してスケーリングおよび管理し、異なるアプリケーション間でデータベースを共有することが容易になります。
方法
- Dockerfileの作成
各データベース用のDockerfileを作成する必要があります。Dockerfileには、データベースイメージの作成方法と、データベースサーバーを起動するための設定が含まれます。
- docker-compose.ymlの作成
docker-compose.yml
ファイルを作成する必要があります。このファイルには、実行するすべてのコンテナとその構成が含まれます。各データベースコンテナには、独自の名前、イメージ、ポート、環境変数などを定義する必要があります。
- コンテナの起動
docker-compose up
コマンドを実行して、すべてのコンテナを起動します。
- データベースへの接続
コンテナ内のデータベースに接続するには、コンテナのIPアドレスとポート番号を使用する必要があります。接続情報は、docker-compose ps
コマンドを使用して取得できます。
例
以下の例では、mysql
と postgresql
の 2 つのデータベースコンテナを定義する方法を示します。
Dockerfile (mysql.Dockerfile)
FROM mysql:5.7
ENV MYSQL_ROOT_PASSWORD=password
RUN --default-database mydatabase
FROM postgres:14
ENV POSTGRES_PASSWORD=password
RUN mkdir -p /var/lib/postgresql/data
version: "3"
services:
mysql:
build: ./mysql
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: password
postgresql:
build: ./postgresql
ports:
- "5432:5432"
environment:
POSTGRES_PASSWORD: password
この例を実行するには、次のコマンドを実行します。
docker-compose up -d
これで、mysql
データベースに接続するには 3306
ポートで、postgresql
データベースに接続するには 5432
ポートで、それぞれコンテナの IP アドレスを使用できます。
補足
- 複数のデータベースを単一のコンテナで実行することもできますが、これは一般的に非推奨です。
- データベース間のデータ共有が必要な場合は、Docker Compose のネットワーク機能を使用できます。
- データベースの永続化については、Docker ボリュームを使用する必要があります。
Dockerfile
mysql.Dockerfile
FROM mysql:5.7
ENV MYSQL_ROOT_PASSWORD=password
RUN --default-database mydatabase
FROM postgres:14
ENV POSTGRES_PASSWORD=password
RUN mkdir -p /var/lib/postgresql/data
version: "3"
services:
mysql:
build: ./mysql
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: password
postgresql:
build: ./postgresql
ports:
- "5432:5432"
environment:
POSTGRES_PASSWORD: password
使用方法
- 上記のコードを 2 つのファイル (mysql.Dockerfile と docker-compose.yml) に保存します。
- 保存したディレクトリに移動します。
- 以下のコマンドを実行して、コンテナを起動します。
docker-compose up -d
docker-compose logs
docker-compose ps
データベースクライアントを使用して、各データベースに接続します。
- mysql:
mysql -h <コンテナのIPアドレス> -p -u root -ppassword
- postgresql:
psql -h <コンテナのIPアドレス> -p -U postgres
- mysql:
注記
<コンテナのIPアドレス>
は、docker-compose ps
コマンドを使用して取得できます。
このサンプルコードは、基本的な使用方法を示すものです。本番環境で使用するには、セキュリティ対策や永続化などの設定を追加する必要があります。
- 上記のサンプルコードは、MySQL と PostgreSQL の 2 つのデータベースにのみ対応しています。他のデータベースを使用する場合は、Dockerfile を編集する必要があります。
- データベースのバックアップと復元については、別途ツールを用意する必要があります。
DockerとDocker Composeで複数のデータベースを使用するその他の方法
複数のデータベースを単一のコンテナで実行する
前述のように、複数のデータベースを単一のコンテナで実行することは一般的に非推奨です。しかし、リソースが限られている場合や、データベース間の密接な統合が必要な場合は、この方法が役立つ場合があります。
このアプローチを実装するには、Dockerfileで適切なデータベースイメージを指定し、必要なデータベースを作成および構成するエントリポイントスクリプトを作成する必要があります。
例:
FROM postgres:14
ENV POSTGRES_PASSWORD=password
RUN mkdir -p /var/lib/postgresql/data
RUN echo "CREATE DATABASE mydb1;" | docker-entrypoint-initdb.d/init.sql
RUN echo "CREATE DATABASE mydb2;" | docker-entrypoint-initdb.d/init.sql.gz
Docker Composeのネットワーク機能を使用してデータベースを接続する
データベース間でデータ共有が必要な場合は、Docker Composeのネットワーク機能を使用して、それらを相互に接続できます。これにより、各コンテナが別のコンテナのサービスにアクセスできるようになります。
version: "3"
services:
db1:
build: ./db1
ports:
- "5432:5432"
networks:
- backend
db2:
build: ./db2
ports:
- "5433:5433"
networks:
- backend
app:
depends_on:
- db1
- db2
networks:
- backend
networks:
backend:
Docker Volumeを使用してデータベースを永続化する
コンテナが破棄されてもデータベースデータを保持するには、Docker Volumeを使用する必要があります。ボリュームは、コンテナとは独立してデータを保存する永続的なストレージです。
version: "3"
services:
db:
build: ./db
ports:
- "5432:5432"
volumes:
- dbdata:/var/lib/postgresql/data
volumes:
dbdata:
環境変数を使用してデータベース設定を構成する
データベース設定をDocker Composeの環境変数を使用して渡すことができます。これにより、Dockerfileを編集せずにデータベース構成を簡単に変更できます。
version: "3"
services:
db:
build: ./db
ports:
- "5432:5432"
environment:
POSTGRES_PASSWORD: mypassword
POSTGRES_DATABASE: mydatabase
カスタムDocker Compose構成ファイルを使用する
特定のニーズに合わせてDocker Compose構成をカスタマイズするには、カスタム構成ファイルを作成できます。
# docker-compose.override.yml
version: "3.8"
services:
db:
restart: unless-stopped
このファイルは、メインのdocker-compose.ymlファイルとともに使用できます。
Docker Composeには、デプロイメント、スケーリング、監視などのタスクを自動化するために使用できる拡張機能が多数あります。
docker-compose拡張機能をインストール:
docker-compose拡張機能のリストを表示:
docker-compose拡張機能を有効にする:
これらの方法は、DockerとDocker Composeを使用して複数のデータベースを管理するためのオプションの一部です。最適な方法は、特定の要件によって異なります。
postgresql docker docker-compose