SchemaSpyの環境をdocker-composeで構築

# はじめに
ER図作成ツールであるSchemaSpyをdocker環境で構築してみます。
SchemaSpyは以下の点が良さそうです。
1. 既存のDBからリバースできる
2. CUIで実行できる
3. 複数の環境で動作する（Windows / Mac / Unix系OS ）

**githubからクローンしたい方は[こちら](https://github.com/Akira-Demizu/schemaspy)**

# 環境
以下の環境で検証はしています。

- macOS Mojave 10.14.5
- Docker version 18.09.2, build 6247962
- docker-compose version 1.23.2, build 1110ad01

# 構成
今回は以下のような構成になります。

```
.
├── README.md
├── docker
│   ├── mysql
│   │   ├── data
│   │   ├── my.cnf
│   │   └── sql
│   │       └── 001-create-tables.sql
│   ├── nginx
│   │   └── default.conf
│   └── schemaspy
│       ├── Dockerfile
│       └── config
│           └── schemaspy.properties
├── docker-compose.yml
└── schemaspy
    └── (HTMLやJSファイルが自動で作成されます)
```

# 手順
## 1. docker-compose.yml作成
まずは、docker-compose.ymlを作成します。

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

services:
  nginx:
    image: nginx:1.13.9-alpine
    container_name: schemaspy_nginx
    volumes:
      - ./schemaspy:/var/www/html:ro
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
    ports:
      - "8081:80"
    environment:
      - LANG=ja_JP.UTF-8
      - TZ=Asia/Tokyo
    command: "nginx -g 'daemon off;'"

  schemaspy:
    build: ./docker/schemaspy
    image: treetips/schemaspy-mysql
    container_name: schemaspy
    volumes:
      - ./schemaspy:/app/html:rw
      - ./docker/schemaspy/config/schemaspy.properties:/app/schemaspy.properties:ro
    environment:
      - LANG=ja_JP.UTF-8
      - TZ=Asia/Tokyo
    working_dir: "/app"
    command: "java -jar schemaspy.jar"

  mysql:
    image: mysql:5.7
    container_name: mysql_host
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: test_database
      MYSQL_USER: docker
      MYSQL_PASSWORD: docker
      TZ: 'Asia/Tokyo'
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    volumes:
      - ./docker/mysql/data:/var/lib/mysql
      - ./docker/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
      - ./docker/mysql/sql:/docker-entrypoint-initdb.d
    ports:
      - 3306:3306
```

## 2. nginxコンテナ作成
nginxの設定ファイルを作成します。

```conf:default.conf
server {
    listen                80 default;
    server_name           localhost;

    root                  /var/www/html;
    charset               utf-8;
    disable_symlinks      off;
    index                 index.html;

    access_log            off;
    error_log             off;

    sendfile              on;
    tcp_nodelay           on;
    tcp_nopush            on;
    keepalive_timeout     120s;

    gzip                  on;
    gzip_http_version     1.0;
    gzip_disable          “MSIE [1-6].(?!.*SV1)”;
    gzip_comp_level       1;
    gzip_proxied          any;
    gzip_vary             on;
    gzip_buffers          4 8k;
    gzip_min_length       1100;
    gzip_types            text/plain
                          text/xml
                          text/css
                          application/xml
                          application/xhtml+xml
                          application/rss+xml
                          application/atom_xml
                          application/json
                          application/javascript
                          application/x-javascript
                          application/x-httpd-php;
}
```

## 3. SchemaSpyコンテナ作成
Schemaspyコンテナを作成します。コンテナ用のDockerfileとDB接続情報などを記載したconfigファイルを用意します。

```dockerfile:Dockerfile
FROM openjdk:8u121-jdk-alpine

ENV DRIVER_URL http://central.maven.org/maven2/mysql/mysql-connector-java/5.1.45/mysql-connector-java-5.1.45.jar
ENV APP_URL https://github.com/schemaspy/schemaspy/releases/download/v6.0.0-rc2/schemaspy-6.0.0-rc2.jar

WORKDIR /app

RUN apk --update add graphviz ttf-dejavu && \
    apk --update add --virtual .builddep tzdata wget libressl && \
    cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \
    wget -O mysql-connector-java.jar ${DRIVER_URL} && \
    wget -O schemaspy.jar ${APP_URL} && \
    apk del .builddep && \
    rm -rf /var/cache/apk/*
```

```properties:schemaspy.properties
# type of database. Run with -dbhelp for details
schemaspy.t=mysql
# optional path to alternative jdbc drivers.
schemaspy.dp=/app/mysql-connector-java.jar
# database properties: host, port number, name user, password
schemaspy.host=mysql_host
schemaspy.port=3306
schemaspy.db=test_database
schemaspy.u=docker
schemaspy.p=docker
# output dir to save generated files
schemaspy.o=/app/html
# db scheme for which generate diagrams
schemaspy.s=work
```

## 4. MySql
MySqlの環境設定ファイルを用意します。

```cnf:my.cnf
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

[client]
default-character-set=utf8mb4
```

こちらはDocker起動時にサンプルテーブルを作成するsqlを用意します。
ER図でリレーションが確認できるように外部キーをつけるのをお忘れなく。

```sql:001-create-tables.sql
DROP TABLE IF EXISTS `groups`;
CREATE TABLE IF NOT EXISTS `groups` (
  `id`                         INT(11)      NOT NULL DEFAULT 0 AUTO_INCREMENT      COMMENT 'ID',
  `created_at`                 DATETIME     NULL     DEFAULT NULL                  COMMENT '登録日時',
  `updated_at`                 DATETIME     NULL     DEFAULT NULL                  COMMENT '更新日時',
  `deleted_at`                 DATETIME     NULL     DEFAULT NULL                  COMMENT '削除日時',
  `name`                       VARCHAR(255)	NOT NULL DEFAULT ''                    COMMENT '名前',
  PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

DROP TABLE IF EXISTS `users`;
CREATE TABLE IF NOT EXISTS `users` (
  `id`         INT(11)      NOT NULL DEFAULT 0      AUTO_INCREMENT COMMENT 'ID',
  `created_at` DATETIME     NULL     DEFAULT NULL                  COMMENT '登録日時',
  `updated_at` DATETIME     NULL     DEFAULT NULL                  COMMENT '更新日時',
  `deleted_at` DATETIME     NULL     DEFAULT NULL                  COMMENT '削除日時',
  `group_id`   INT(11)      NOT NULL DEFAULT 0                     COMMENT '組織ID',
  `name`       VARCHAR(255)	NOT NULL DEFAULT ''                    COMMENT '名前',
  PRIMARY KEY (`id`),
  FOREIGN KEY (`group_id`)
    REFERENCES `groups` (`id`)
) DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

```

# 起動
### ビルド

```bash
docker-compose build
```

## 起動

```bash
docker-compose up -d
```

## 停止

```bash
docker-compose down
```

# 確認
http://localhost:8081 にアクセスすると確認できます。
以下のような画面が表示されていれば成功です。

<img width="1415" alt="スクリーンショット 2019-05-27 1.24.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290840/498d77bb-54fc-6c36-7ad4-ec6a724561be.png">

# 最後に
今回は構築のみご紹介させていただきました。
私もこれから使用してみて、仕事効率化に繋がるか判断したいと思います。
同じようにdocker環境で触ってみたい人の参考になれば幸いです。

# 参考
https://github.com/treetips/schemaspy-mysql