Help us understand the problem. What is going on with this article?

docker-compose+MySQL5.7(8.0も)+初期化+永続化

概要

dockerは業務経験あったけどdocker-compose使ったことないし(当時)MySQLの環境構築も慣れてなかったのでやってみました。
で、どうせなら初期データもあったほうがいいよね!といった感じです。
こうすればできる!というところを目指してやった備忘録として残します。

環境

  • Mac OSX(HighSierra〜Catalina)
  • docker
    • version 18.09.0, build 4d60db4
  • docker-compose
    • version 1.23.1, build b02f1306
  • docker, docker-composeについてはメジャーバージョンが変わらなければ基本大丈夫かと思います。多分・・・

解説すること、しないこと

  • すること
    • 表題のことをする手順
  • しないこと
    • MySQL/docker/docker-compose環境構築の方法や仕組みなど

手順

  • 環境構築します。以下について、事前に行なってください。
    • docker、docker-composeコマンドを使用できる状態にする
    • mysql:5.7のdockerイメージをpull
  • docker-composeを実行するディレクトリを作成し、docker-compose.ymlを作ります
docker-compose.yml
version: '3.7' # 修正時点で最新のversionを記載しています。1.xは動きませんのでご注意を。
services:
    db:
        image: mysql:5.7
        ports:
            - "3306:3306"
        volumes:
            # 初期データを投入するSQLが格納されているdir
            - ./db/mysql_init:/docker-entrypoint-initdb.d
            # 永続化するときにマウントするdir
            - ./db/mysql_data:/var/lib/mysql
        environment:
            MYSQL_ROOT_PASSWORD: root
            MYSQL_USER: test
            MYSQL_PASSWORD: test
  • volumesでマウントするディレクトリを、docker-compose.ymlのレイヤー下に作成します。こんな構造のディレクトリになると思います。
(docker-compose実行dir)
┗ docker-compose.yml
┗ db/
  ┗ mysql_init/
  ┗ mysql_data/
  • 作成した mysql_init にSQLファイルを作成します。
    • とりあえず動かしたいという方は以下ファイルを中身ごとコピペしていただければ良いと思います。
1_create.sql
CREATE DATABASE sample;
use sample;

CREATE TABLE users (
    id INT(11) AUTO_INCREMENT NOT NULL,
    name VARCHAR(64) NOT NULL,
    PRIMARY KEY (id));
);
  • docker-compose up -d で起動しましょう。接続できるようになっていますので、mysqlのcliなりworkbenchなりで確認してみてください。
    • -dオプションをつけることで、バックグラウンドで実行してくれます。詳細はこちらを

解説

volumes の役割を理解することが今回の鍵とみています。
今回はdockerコンテナ内の二つのディレクトリを、ローカルのディレクトリにマウントさせることで初期化と永続化を実現しています。

  • /docker-entrypoint-initdb.d
    • dockerコンテナとして起動したときに、ここにあるSQL文を実行してくれるようです。
    • 今回はやりませんでしたが、shファイルの実行もしてくれます。
  • /var/lib/mysql
    • 名前で察していただけると思いますが、コンテナのmysqlのシステムファイルがここに詰まっています。
    • これをvolumesでローカルのディレクトリからバインドすることで、同じ構成のファイルがローカルにも作成されます
    • 今回の構成では、./db/mysql_dataが該当します。

さいごに

  • 今回は当時開発していたシステムのローカルDB環境を作る目的でやったのでMySQL5.7でやりましたがMySQL8.xにも近々向き合わねばなるまい・・・

おまけ

  • ・・・ということでMySQL8.0でも同じことをやってみました。
  • まずdocker-compose.ymlimageをMySQL8.0のものに直し、volumesに次の行を追加します。
docker-compose.yml
            - ./db/mysql_conf/:/etc/mysql/conf.d
  • 次に、追加したvolumesに対応するローカルディレクトリ(上記例では、./db/mysql_confが該当します)に次のファイル置きます。
default_authentication.cnf
[mysqld]
default_authentication_plugin=mysql_native_password
  • MySQL8.0以降では接続時の認証方式が変更になっているため、このファイルが必要になるようです。この事実や、対策方法はいろいろなところで紹介されていますが、一応ここでも載せておきます。
juhn
Webエンジニアとして頑張りたいです。頑張ります。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした