目的
- dockerでMySQLを起動する
- データはdata volumeに格納する
- my.cnfを指定する
- コンテナ生成時にデータベース、ユーザーなどを作成する
- データ(volume)をバックアップできるようにする
- データ(volume)をリストアできるようにする
環境
$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.12.6
BuildVersion: 16G29
$ docker -v
Docker version 17.06.1-ce, build 874a737
$ docker-compose -v
docker-compose version 1.14.0, build c7bdf9e
結果
$ tree -a
.
├── .env
├── backup.yml
├── backup_files
├── docker-compose.yml
├── mysql
│ ├── conf.d
│ │ └── my.cnf
│ └── docker-entrypoint-initdb.d
│ └── 001_create_db_and_user.sh
└── restore.yml
$ cat docker-compose.yml
version: "3.2"
volumes:
mysql:
driver: local
services:
mysql:
image: mysql:5.7
volumes:
- ./mysql/conf.d:/etc/mysql/conf.d
- ./mysql/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
- mysql:/var/lib/mysql
ports:
- "13306:3306"
env_file: .env
$ cat mysql/docker-entrypoint-initdb.d/001_create_db_and_user.sh
DB_NAME=任意のデータベース名
TMP_SQL_PATH=/tmp/setting.sql
/bin/cat <<_MYSQL_SETTING_ > ${TMP_SQL_PATH}
CREATE DATABASE ${DB_NAME}_development default character set utf8;
CREATE DATABASE ${DB_NAME}_production default character set utf8;
CREATE DATABASE ${DB_NAME}_test default character set utf8;
GRANT ALL PRIVILEGES ON ${DB_NAME}_development.* to '${MYSQL_USER}'@'%' identified by '${MYSQL_PASSWORD}';
GRANT ALL PRIVILEGES ON ${DB_NAME}_production.* to '${MYSQL_USER}'@'%' identified by '${MYSQL_PASSWORD}';
GRANT ALL PRIVILEGES ON ${DB_NAME}_test.* to '${MYSQL_USER}'@'%' identified by '${MYSQL_PASSWORD}';
_MYSQL_SETTING_
mysql -uroot -p${MYSQL_ROOT_PASSWORD} < ${TMP_SQL_PATH}
$ cat .env
MYSQL_ROOT_PASSWORD=
MYSQL_USER=
MYSQL_PASSWORD=
$ docker-compose up -d
バックアップする
$ cat backup.yml
version: "3.2"
volumes:
data:
external:
name: ${TARGET_VOLUME}
services:
backup:
image: busybox:latest
volumes:
- data:/target
- ./backup_files:/dst
command: "/bin/tar -C /target -zcvf /dst/${TARGET_VOLUME}.tar.gz ./"
environment:
TARGET_VOLUME: mysql
docker-compose stop mysql
docker-compose -f backup.yml run --rm backup
docker-compose start mysql
リストアする
$ cat restore.yml
version: "3.2"
volumes:
data:
external:
name: ${TARGET_VOLUME}
services:
restore:
image: busybox:latest
volumes:
- data:/target
- ./:/src
command: /bin/sh -c "/bin/rm -rf /target/* && /bin/tar -C /target -zxvf /src/backup_files"
environment:
TARGET_VOLUME: mysql
docker-compose stop mysql
docker-compose -f restore.yml run --rm restore
docker-compose start mysql
関連コマンド
$ docker-compose stop
$ docker-compose start
$ docker-compose down
$ docker volume rm mysql