docker(-compose)でMySQL

目的

  • 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

MySQLを起動する

$ 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