※ Docker Composeによる開発が前提になっています。
※ ここではMySQLを利用しています。
はじめに
データベースだけ別でホストに用意して、ポートを開いて繋げる方法でも悪くはないのです。
しかし環境的なまとまりが悪いので、普段はDocker Composeを利用しています。
探しても意外と欲しい情報が見つからず、かなり調べながら作った経緯がありますので、備忘録を兼ねて共有しておきます。
手順
1. 任意の docker-compose.yml
を用意する。
docker-compose.yml
version: "3"
services:
my_app:
build: ./app
ports:
- 5000:5000
volumes:
- ./app:/app
tty: true
この段階では、データベース以外の環境は揃っているものとします。
2. docker-compose.yml
にデータベース用の設定を追記する。
ここでは、MySQLとphpMyAdminを入れています。
MySQLの準備ができる前にphpMyAdminが立ち上がると正常に動作しないため、healthcheckをさせています。
docker-compose.yml
version: "3"
services:
app:
build: ./app
depends_on:
- mysql
ports:
- 5000:5000
volumes:
- ./app:/app
tty: true
mysql:
image: mysql:5.7
environment:
- MYSQL_ROOT_PASSWORD=password
- MYSQL_USER=user
- MYSQL_PASSWORD=password
- TZ=Asia/Tokyo
volumes:
- ./db/data:/var/lib/mysql
- ./db/initdb.d:/docker-entrypoint-initdb.d
ports:
- 3306
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
healthcheck:
test: /etc/init.d/mysql status
start_period: 10s
interval: 1s
retries: 120
phpmyadmin:
image: phpmyadmin/phpmyadmin:5.1.1
depends_on:
mysql:
condition: service_healthy
environment:
- PMA_ARBITRARY=1
- PMA_HOST=mysql
- PMA_USER=root
- PMA_PASSWORD=password
ports:
- 8080:80
volumes:
- ./db/phpmyadmin/sessions:/sessions
3. ./db/initdb.d/1_init.sql
を作成し、初回に実行したいSQL文を記述する。
1_init.sql
CREATE DATABASE `sample_db`;
USE `sample_db`;
CREATE TABLE `sample_data` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,
`value` varchar(600) COLLATE utf8mb4_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO `sample_data` (`id`, `name`, `value`) VALUES
(1, "name_1", "This is value1."),
(2, "名前2", "これは名前2です。");
4. docker-compose up
する。
データベースの初期化にはいくらか時間がかかるため、 http://localhost:8080
でphpMyAdminが表示されるまで少し待ちます。
あまりに遅い場合、 1_init.sql
に構文エラーがある可能性があります。
その場合、一旦 down
して再度 up
することで、phpMyAdminにアクセスできる場合があります。
すべての準備が完了したら、下記の接続情報を利用できます。
.env
host="mysql"
port=3306
user="user"
password="password"
db="sample_db"
参考
その他多数