ys memos

Blog

dockerで複数Databaseでmysqlやpostgresを起動する方法


docker

2022/04/10


私は開発において利用する DB にはローカルの Docker を使っている.その上で,postgresql/ mysql等の DB とadminerを併用することでデータの可視化およびデータの管理を行うことが多い.

DB コンテナに渡す環境変数によってコンテナ起動時に Database を自動生成することができるのだが,複数の Database を作るのに,adminer を介して行っていたのだが,これだと開発者体験がよろしくない.

一人での開発であれば「面倒だなぁ」で済むのだが,複数人開発となると手間の掛かり具合が一気に跳ね上がる.

その背景から,複数の Database をコンテナ起動時に自動生成する方法をまとめ,記しておく.


前項で記したとおり,コンテナ起動時に複数 Database を自動生成したい.

ここでは,test1test2を自動作成することにした.

MySQL および Postgres に分け,各設定を記載する.

続く設定を施した後, docker-compose upによって,コンテナを設定できる.(バックグラウンド実行するためには,docker-compose up -dとするとよい)


実は,MySQL に対する設定はキレイにまとまっているページがあり,そこから学習した.


.
├── docker-compose.yml # コンテナの設定を記述
└── mysql-init         # DB初期化用のSQLを格納するディレクトリ
    └── 01.sql         # コンテナ起動時に実行されるSQL

./docker-compose.yml
version: '3'

services:
  db:
    image: mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root
    volumes:
      - ./mysql-init:/docker-entrypoint-initdb.d
    ports:
      - 3306:3306
  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080

DB のみ起動されればよい場合はadminer項は削除してしまっても構わない.

また,この設定では,adminer(http:/localhost:8080)を開いてログインする際は,MySQL/db/root/rootで入れる.

MySQL のコンテナにおいては,環境変数MYSQL_DATABASEによって Database を生成できるのだが,SQL 実行によって Database を作成するため,こちらには書かず,DB 設定の方でどちらも作成することにした.


./mysql-init/01.sql
CREATE DATABASE IF NOT EXISTS `test1`;
CREATE DATABASE IF NOT EXISTS `test2`;

この SQL は,コンテナ起動時に実行される(docker-compose.ymlにそう設定されている).そのため,シンプルにテーブルを作成する文である.


MySQL に対する方法を拡張し,Postgres に対応してみた.

大枠は変えずに,Postgres への適用を行った.


.
├── docker-compose.yml # コンテナの設定を記述
└── postgres-init      # DB初期化用のSQLを格納するディレクトリ
    └── 01.sql         # コンテナ起動時に実行されるSQL

./docker-compose.yml
version: '3'

services:
  db:
    image: postgres
    restart: always
    environment:
      POSTGRES_USER: root
      POSTGRES_PASSWORD: root
    volumes:
      - ./postgres-init:/docker-entrypoint-initdb.d
    ports:
      - 5432:5432
  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080

この設定では,adminer(http:/localhost:8080)を開いてログインする際は,PostgreSQL/db/root/rootで入れる.

Postgres のコンテナにおいては,環境変数POSTGRES_DBによって Database を生成できるのだが,MySQL と同様の理由で値を入れない事にした.


MyQL で Database 作成したコマンドのままでは Postgres で同じことが出来ないので,Postgres において Database を作成するコマンドに書き換えた.

./postgres-init/01.sql
CREATE DATABASE test1;
CREATE DATABASE test2;

多くの情報を参考ページからもらいました.是非そちらを主軸として本記事の内容を活用してみてください!


関連タグを探す