
開発環境構築時にデータベースをDocker Composeを使って手軽に構築する方法を紹介します。
はじめに
開発環境構築はDockerで構築するのがもっと簡単です。そして、アプリケーションの開発のためにはローカル環境にデータベースを迅速に準備する必要があります。今回は、Docker Composeを使って、MySQL、PostgreSQL、MongoDBのデータベースを対象に、データベースを構築し、シードを準備する方法を紹介します。
前提条件
以下の準備が事前に完了している必要があります。
- Dockerがインストールされていること
詳しくは「環境」を参照してください。
MySQLのDocker Composeによる設定とシードの追加
まずは、MySQLの設定方法です。
ベースの作成
必要なフォルダとファイルを作成します。
$ touch docker-compose.yml
$ mkdir -p mysql/initdb
$ touch mysql/initdb/1_create_tables.sql
$ touch mysql/initdb/2_insert_seed.sql
Docker Composeの設定ファイルとシード用SQLの作成
Docker Composeの設定ファイルとシードを入れいる簡単なSQLを作成します。
docker-compose.yml
version: '3'
services:
mysql:
image: mysql:8.0
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
TZ: "Asia/Tokyo"
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: test_db
MYSQL_USER: test
MYSQL_PASSWORD: test
ports:
- 3306:3306
volumes:
- mysql:/var/lib/mysql
- ./mysql/initdb:/docker-entrypoint-initdb.d
phpmyadmin:
image: phpmyadmin/phpmyadmin
restart: always
ports:
- 8080:80
environment:
PMA_ARBITRARY: 1
PMA_HOST: mysql
PMA_USER: root
PMA_PASSWORD: root
depends_on:
- mysql
volumes:
mysql:
1_create_tables.sql
create table users
(
id serial primary key,
username varchar(50) unique not null,
password varchar(50) not null,
email varchar(255) unique not null
);
2_insert_seed.sql
insert into users (username, password, email) values ('keid', 'keidpass', 'keid@developer.com');
insert into users (username, password, email) values ('jobs', 'jobspass', 'jobs@developer.com');
insert into users (username, password, email) values ('mask', 'maskpass', 'mask@developer.com');
動作確認
それでは、Docker上でMySQLを起動してみましょう。
$ docker-compose up -d
$ docker-compose ps
Name Command State Ports
-----------------------------------------------------------------------------------------------------
local-mysql_mysql_1 docker-entrypoint.sh --def ... Up 0.0.0.0:3306->3306/tcp, 33060/tcp
local-mysql_phpmyadmin_1 /docker-entrypoint.sh apac ... Up 0.0.0.0:8080->80/tcp
$ mysql -h 0.0.0.0 -P 3306 -u test -p
Enter password:
...
mysql> use test_db
...
mysql> select * from users;
+----+----------+----------+--------------------+
| id | username | password | email |
+----+----------+----------+--------------------+
| 1 | keid | keidpass | keid@developer.com |
| 2 | jobs | jobspass | jobs@developer.com |
| 3 | mask | maskpass | mask@developer.com |
+----+----------+----------+--------------------+
3 rows in set (0.01 sec)
mysql> exit
Bye
OKですね。
次に「http://localhost:8080/」にアクセスしてPhpMyAdminが動いていることも確認してみましょう。
ばっちりですね。
PostgreSQLのDocker Composeによる設定とシードの追加
次に、PostgreSQLの設定方法です。
ベースの作成
必要なフォルダとファイルを作成します。
$ touch docker-compose.yml
$ mkdir -p postgres/initdb
$ touch postgres/initdb/1_create_tables.sql
$ touch postgres/initdb/2_insert_seed.sql
Docker Composeの設定ファイルとシード用SQLの作成
Docker Composeの設定ファイルとシードを入れいる簡単なSQLを作成します。
docker-compose.yml
version: '3'
services:
postgres:
image: postgres:11.4-alpine
restart: always
environment:
TZ: "Asia/Tokyo"
POSTGRES_USER: test
POSTGRES_PASSWORD: test
POSTGRES_DB: test_db
ports:
- 5432:5432
volumes:
- postgres:/var/lib/postgresql/data
- ./postgres/initdb:/docker-entrypoint-initdb.d
pgadmin:
image: dpage/pgadmin4
restart: always
ports:
- 8080:80
environment:
PGADMIN_DEFAULT_EMAIL: admin@example.com
PGADMIN_DEFAULT_PASSWORD: admin
volumes:
- pgadmin:/var/lib/pgadmin
depends_on:
- postgres
volumes:
postgres:
pgadmin:
1_create_tables.sql
create table users
(
id serial primary key,
username varchar(50) unique not null,
password varchar(50) not null,
email varchar(255) unique not null
);
2_insert_seed.sql
insert into users (username, password, email) values ('keid', 'keidpass', 'keid@developer.com');
insert into users (username, password, email) values ('jobs', 'jobspass', 'jobs@developer.com');
insert into users (username, password, email) values ('mask', 'maskpass', 'mask@developer.com');
動作確認
それでは、Docker上でPostgreSQLを起動してみましょう。
$ docker-compose up -d
$ docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------------------------------
local-postgres_pgadmin_1 /entrypoint.sh Up 443/tcp, 0.0.0.0:8080->80/tcp
local-postgres_postgres_1 docker-entrypoint.sh postgres Up 0.0.0.0:5432->5432/tcp
$ psql -h 0.0.0.0 -p 5432 -d test_db -U test
Password for user test:
...
test_db=# select * from users;
id | username | password | email
----+----------+----------+--------------------
1 | keid | keidpass | keid@developer.com
2 | jobs | jobspass | jobs@developer.com
3 | mask | maskpass | mask@developer.com
(3 rows)
test_db=# \q
大丈夫ですね。
次に「http://localhost:8080/」にアクセスしてpgAdminが動いていることも確認してみましょう。
起動は問題なかったので、「新しいサーバを追加」からデータベースに接続します。
ホスト名、ポート番号、ユーザ名、パスワードを入力して、「保存」をクリックします。
データベースを選択して、ユーザを表示してみます。
シードもちゃんと入っていますね。
なお、今回はpgAdminのデータもボリュームに保存しているので、一旦接続情報を入力しておけば、Dockerを停止しても接続情報は保持されます。
MongoDBのDocker Composeによる設定とシードの追加
最後に、MongoDBの設定方法です。
ベースの作成
必要なフォルダとファイルを作成します。
$ touch docker-compose.yml
$ mkdir -p mongo/seed
$ touch mongo/seed/users.json
Docker Composeの設定ファイルとシード用JSONファイルの作成
Docker Composeの設定ファイルとシードとなるJSONファイルを作成します。
docker-compose.yml
version: '3'
services:
mongo:
image: mongo:4.0
restart: always
ports:
- 27017:27017
volumes:
- mongo:/data/db
mongo-seed:
image: mongo:4.0
command: mongoimport --host mongo:27017 --db test_db --collection users --type json --file /seed/users.json --jsonArray
volumes:
- ./mongo/seed:/seed
depends_on:
- mongo
mongo-express:
image: mongo-express
restart: always
ports:
- 8081:8081
environment:
ME_CONFIG_MONGODB_SERVER: mongo
ME_CONFIG_MONGODB_PORT: 27017
depends_on:
- mongo
volumes:
mongo:
users.json
[
{
"username": "keid",
"password": "keidpass",
"email": "keid@developer.com"
},
{
"username": "jobs",
"password": "jobspass",
"email": "jobs@developer.com"
},
{
"username": "mask",
"password": "maskpass",
"email": "mask@developer.com"
}
]
動作確認
それでは、Docker上でMongoDBを起動してみましょう。
$ docker-compose up -d
$ docker-compose ps
Name Command State Ports
--------------------------------------------------------------------------------------------------
local-mongodb_mongo-express_1 tini -- /docker-entrypoint ... Up 0.0.0.0:8081->8081/tcp
local-mongodb_mongo-seed_1 docker-entrypoint.sh mongo ... Exit 0
local-mongodb_mongo_1 docker-entrypoint.sh mongod Up 0.0.0.0:27017->27017/tcp
$ mongo --port 27017
...
> use test_db
switched to db test_db
> db
test_db
> show collections
users
> db.users.find()
{ "_id" : ObjectId("5d317fda80a257d9f5c44379"), "username" : "keid", "password" : "keidpass", "email" : "keid@developer.com" }
{ "_id" : ObjectId("5d317fda80a257d9f5c4437a"), "username" : "mask", "password" : "maskpass", "email" : "mask@developer.com" }
{ "_id" : ObjectId("5d317fda80a257d9f5c4437b"), "username" : "jobs", "password" : "jobspass", "email" : "jobs@developer.com" }
> exit
bye
次に「http://localhost:8081/」にアクセスしてMongo Expressが動いていることも確認してみましょう。
OKです。データも入っていますね。
おまけ(PrismaのDocker Composeの自動生成とシードの追加)
ベースの作成
Prismaの場合はコマンドラインからDocker Composeの設定を自動生成できます。
$ npm i -g prisma
$ prisma init prisma
? Set up a new Prisma server or deploy to an existing server? Create new database
? What kind of database do you want to deploy to? MySQL
? Select the programming language for the generated Prisma client Prisma JavaScript Client
...
$ cd prisma/
$ touch seed.graphql
$ tree
.
├── datamodel.prisma
├── docker-compose.yml
├── generated
│ └── prisma-client
│ ├── index.d.ts
│ ├── index.js
│ └── prisma-schema.js
├── prisma.yml
└── seed.graphql
Docker Composeの設定ファイルGraphQLファイルの作成
Docker Composeの設定ファイルとスキーマとシードのGraphQLファイルを作成します。
docker-compose.yml
version: '3'
services:
prisma:
image: prismagraphql/prisma:1.34
restart: always
ports:
- "4466:4466"
environment:
PRISMA_CONFIG: |
port: 4466
databases:
default:
connector: mysql
host: mysql
user: root
password: prisma
rawAccess: false
port: 3306
migrations: false
mysql:
image: mysql:5.7
restart: always
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: prisma
volumes:
- mysql:/var/lib/mysql
volumes:
mysql:
「rawAccess」と「migrations」をfalseにするのと、MySQLのポートの開放をします。
prisma.yml
endpoint: http://localhost:4466
datamodel: datamodel.prisma
generate:
- generator: javascript-client
output: ./generated/prisma-client/
seed:
import: seed.graphql
hooks:
post-deploy:
- prisma generate
datamodel.prisma
type User {
id: ID! @id
username: String!
password: String!
email: String!
}
seed.graphql
mutation {
user1: createUser(
data: {
username: "keid"
password: "keidpass"
email: "keid@developer.com"
}
) {
id
}
user2: createUser(
data: {
username: "jobs"
password: "jobspass"
email: "jobs@developer.com"
}
) {
id
}
use3: createUser(
data: {
username: "mask"
password: "maskpass"
email: "mask@developer.com"
}
) {
id
}
}
動作確認
それでは、Docker上でPrismaを起動してみましょう。
$ docker-compose up -d
$ docker-compose ps
Name Command State Ports
-----------------------------------------------------------------------------------------
prisma_mysql_1 docker-entrypoint.sh mysqld Up 0.0.0.0:3306->3306/tcp, 33060/tcp
prisma_prisma_1 /bin/sh -c /app/start.sh Up 0.0.0.0:4466->4466/tcp
$ prisma deploy
$ mysql -h 0.0.0.0 -P 3306 -u root -p
Enter password:
...
mysql> use default@defaut;
...
mysql> show tables;
+---------------------------+
| Tables_in_default@default |
+---------------------------+
| User |
+---------------------------+
1 row in set (0.00 sec)
mysql> select * from User;
+---------------------------+----------+----------+--------------------+
| id | username | password | email |
+---------------------------+----------+----------+--------------------+
| cjy9vplln000k07357qmb4lkn | keid | keidpass | keid@developer.com |
| cjy9vplny000o0735ua7ab9w5 | jobs | jobspass | jobs@developer.com |
| cjy9vploa000s0735xt18lpmu | mask | maskpass | mask@developer.com |
+---------------------------+----------+----------+--------------------+
3 rows in set (0.00 sec)
mysql> exit
Bye
次に「http://localhost:4466/」にアクセスしてGraphQLで確認してみましょう。
OKですね。
さらに「prisma admin」を実行するか、または「http://localhost:4466/_admin」にアクセスしてAdminページで確認してみましょう。
こちらも問題ないですね。
最後に
いかがでしたか?これで、Docker Composeでローカルに開発用のデータベースを簡単に構築できるようになったことでしょう。それでは。
環境
- Docker: 18.09.2
- Docker Compose: 1.23.2
- NPM: 6.10.0
- Prisma: 1.34.1