Docker環境で立てたデータベースのER図を自動生成する(MySQL)

schemaspyのER図 Docker

この記事では、データベースのER図を自動生成する手順を解説する。

やりたいこと

  • ローカル環境で、Docker Composeを使ってAPIやMySQLを立てている状態
  • 既存のプロダクトコードやCI/CDに影響がないようにER図を自動生成したい
  • 最終的に、GitHub PagesでER図をいつでも見れるようにしたい
  • Docker Composeを使ってローカル環境起動中に、コマンドを実行することでスキーマ情報を解析し、ER図を自動出力する

※今回はMySQLで解説するが、SchemaSpyを使うため、他のデータベースでも可

ディレクトリ構成

ディレクトリ構成は以下の通りだ。

  • schemaspy
  • docker-compose-schemaspy.yml
  • docs

が今回新しく作るところである。

.
├── apps
│   ├── be # BEのAPIに関するディレクトリ
│   ├── db # MySQLに関するディレクトリ
│   └── schemaspy # 今回追加するもの
├── docker-compose-schemaspy.yml # 今回追加するもの
├── docker-compose.yml
├── docs # GitHub Pagesに公開するためのディレクトリ(ここに出力される)
└── sample.code-workspace

ER図生成に使うツール

ER図生成では、SchemaSpyというものを利用する。

SchemaSpy • Database Documentation Built Easy.

普通に使う場合はJavaの環境構築が必要になる。

ただし専用のDockerイメージが提供されているため、これを使うことでローカル端末にJavaの環境を構築する手間を省くことができる。

既存のdocker-compose.yml

このリポジトリは、BEとDBの構成になっており、
BEのAPIからDBにアクセスできるようにしてある。

ホットリロード設定やデータベースの永続化など細かいところを行っているが
今回ポイントになるところはDBの exposeを指定している箇所だ。

このexpose設定により、同じDocker Composeのネットワークに存在するコンテナから
このDBに対して3306ポートで通信を行うことができる。

services:
  be:
    container_name: be
    build:
      context: ./apps/be
      dockerfile: Dockerfile
      target: development
    depends_on:
      - db
    # ホストマシンから直接アクセスできるように設定
    ports:
      - "3020:3020"
    # ホットリロードのための設定
    develop:
      watch:
        - action: sync
          path: ./apps/be/src # ホストマシンのディレクトリ
          target: /usr/workspace/src # コンテナのディレクトリ
          ignore:
            - node_modules/
        - action: rebuild
          path: ./apps/be/package.json

  db:
    container_name: db
    build:
      context: ./apps/db
      dockerfile: Dockerfile
      target: development
    expose:
      - 3306  # BEからアクセスするためにポートを開放
    # ホストマシンから直接アクセスできるように設定
    ports:
      - "3306:3306"
    # データベースの内容を永続化する
    volumes:
      - sample-db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=Password!
      - MYSQL_DATABASE=sample
      - MYSQL_USER=user
      - MYSQL_PASSWORD=Password!

volumes:
  sample-db:

SchemaSpyの設定ファイルを作成する

apps/schemaspyディレクトリに、schemaspy.propertiesファイルを作成し、
以下の内容を記載する。

ポイントは、ホスト名にdocker-compose.ymlで指定しているMySQLのサービス名を記載することだ。

# type of database. Run with -dbhelp for details
# if mssql doesn't work: try mssql08 in combination with sqljdbc_7.2, this combination has been tested
schemaspy.t=mysql
# MySQLの場合はドライバの明示指定不要
# schemaspy.dp=path/to/drivers
# docker-composeのサービス名を指定する
schemaspy.host=db
# MySQLがexposeで開放しているポート
schemaspy.port=3306
schemaspy.db=sample
schemaspy.u=user
schemaspy.p=Password!
# output dir to save generated files
schemaspy.o=/output
# db scheme for which generate diagrams
schemaspy.s=sample

データベースをMySQL以外にしたい場合や、詳細を知りたい場合は以下を参照すると良い。

Get Started — SchemaSpy 6.0.0 documentation

Dockerfile作成

schemaspy.propertiesを読み込めるようにDockerfileを作成する。

apps/schemaspyディレクトリに配置する。

FROM schemaspy/schemaspy:6.2.4

# 先ほど作成した設定ファイルをDockerコンテナに渡す
COPY ./schemaspy.properties /schemaspy.properties

docker-compose-schemaspy.yml作成

作成した

  • apps/schemaspy/Dockerfile
  • apps/schemaspy/schemaspy.properties

を使って新しいcomposeファイルを作成する。

services:
  schemaspy:
    container_name: schemaspy
    build:
      context: ./apps/schemaspy
      dockerfile: Dockerfile
    platform: linux/amd64 # M1 Macで使うための設定
    # GitHub Pagesで公開することを想定し、docsディレクトリに出力する
    volumes:
      - ./docs:/output
    # docker-compose.ymlで作成したネットワークに接続する
    networks:
      - sample-repository_default

networks:
  sample-repository_default:
    external: true

ポイントは2つある。

  1. networksの設定
  2. volumesの設定

①networksの設定

通常、docker-compose.ymldocker-compose-schemaspy.ymlは別のcomposeなので
ここの間でのネットワーク通信は行うことができない。

ただし、今回はDocker Compose同士のネットワーク通信ができるような設定を明示的に記載してある。

docker-compose.ymlによって作成される独自ネットワークは、
デフォルトで「<プロジェクト名>_default」という名前で構成される。

SchemaSpyを立てるcomposeからは、そのネットワークに対してexternal: trueを指定することで疎通を可能にしている。

これにより、SchamaSpyが別のDocker Composeに存在するMySQLに対して通信ができるようになる。

②volumesの設定

SchemaSpyが出力したファイルをdocsディレクトリに格納したいので、
volumes設定を使ってローカルのdocsディレクトリとSchemaSpyコンテナの/outputディレクトリが同期されるように設定している。

実行

ここまでできれば準備は完了している。

まずはプロダクトコードのDocker Composeを立ち上げる。

$ docker compose -p sample-repository up -d

次に、SchemaSpyのDocker Composeを立ち上げる。

$ docker compose -f ./docker-compose-schemaspy.yml up

実行が完了すると、ローカルのdocsディレクトリにファイルが出力されていることが確認できる。

最後に掃除をしておく。

$ docker compose -f ./docker-compose-schemaspy.yml down -v --rmi all

GitHub Pagesの設定

最後に、GitHubのリポジトリ設定画面から
ブランチ名の指定と/docsディレクトリをGitHub Pagesとして公開するような設定を行えばOK。

「https://<アカウント名>.github.io/リポジトリ名/」でER図にアクセスできるようになる。

タイトルとURLをコピーしました