Posted at

SchemaSpyの環境をdocker-composeで構築


はじめに

ER図作成ツールであるSchemaSpyをdocker環境で構築してみます。

SchemaSpyは以下の点が良さそうです。

1. 既存のDBからリバースできる

2. CUIで実行できる

3. 複数の環境で動作する(Windows / Mac / Unix系OS )

githubからクローンしたい方はこちら


環境

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


  • 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-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の設定ファイルを作成します。


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_disableMSIE [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

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/*



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の環境設定ファイルを用意します。


my.cnf

[mysqld]

character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

[client]
default-character-set=utf8mb4


こちらはDocker起動時にサンプルテーブルを作成するsqlを用意します。

ER図でリレーションが確認できるように外部キーをつけるのをお忘れなく。


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;



起動


ビルド

docker-compose build


起動

docker-compose up -d


停止

docker-compose down


確認

http://localhost:8081 にアクセスすると確認できます。

以下のような画面が表示されていれば成功です。


最後に

今回は構築のみご紹介させていただきました。

私もこれから使用してみて、仕事効率化に繋がるか判断したいと思います。

同じようにdocker環境で触ってみたい人の参考になれば幸いです。


参考

https://github.com/treetips/schemaspy-mysql