電気ひつじ牧場

技術メモ

DBだけDockerを使ってISUCON9の環境構築した

今更ですが一人ISUCONをしたくなったので環境作りします.

やる事

ホストのDBを汚すのは嫌なので,公式のローカル環境でISUCON9予選の問題を動かす を見つつ,DBだけDockerを使ってアプリケーションから利用する.

isucon9-qualify/webapp/sqlディレクトリ構成は次の通り.

.
├── conf
│   └── my.cnf
├── datadir
├── setupdb.sh
└── sqlfiles
    ├── 00_create_database.sql
    ├── 01_schema.sql
    ├── 02_categories.sql
    └── 03_initial.sql

sqlfiles

コンテナ作成時に走らせるSQLファイルを格納する.このディレクトリをコンテナの/docker-entrypoint-initdb.dにマウントすれば中にある.shや.sqlや.sql.gzといったファイルがアルファベット順に実行される.

conf

mysqlのコンフィグを置く.中身はとりあえずこんな感じ.詳細な設定項目は https://dev.mysql.com/doc/refman/8.0/en/server-system-variable-reference.html に一覧がある.

[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
secure-file-priv= NULL
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

slow_query_log = 1
long_query_time = 5


[client]
default-character-set = utf8mb4


# Custom config should go here
!includedir /etc/mysql/conf.d/

datadir

DBデータを格納する領域.これをコンテナ内部にマウントする事でデータに永続性を持たせる.

setupdb.sh

docker runコマンドを保存したスクリプト.しかるべきディレクトリをコンテナ内にマウントし,ポート転送をする事でホストから透過的にコンテナ内DBを利用できるようにしている.

#!/bin/bash

docker container run --rm --name isudb -d -v `pwd`/conf:/etc/mysql/conf.d -v `pwd`/sqlfiles:/docker-entrypoint-initdb.d -v `pwd`/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=secret -p 3306:3306 mysql:8.0