175
149

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2018-11-29

概要

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
  • ./db/mysql_confディレクトリを作成し、そのディレクトリにdefault_authentication.cnfファイルを作成します。内容は下記。
default_authentication.cnf
[mysqld]
default_authentication_plugin=mysql_native_password
  • MySQL8.0以降では接続時の認証方式が変更になっているため、このファイルが必要になるようです。この事実や、対策方法はいろいろなところで紹介されていますが、一応ここでも載せておきます。

MySQLのEOLについて

  • MySQL5.7は2020年にEOLを迎えており、LTSである8.0のEOLも2025年に迫りつつあります。なので、これから長期運用を考えるならば別のRDBの選択肢を取るのがベターと考えます。
  • MySQLの代替としてMariaDBが選択されるケースが多いようなので、同様の記事をMariaDBで近々かけたらいいなと思ってます。
    • と思っていたらMySQL8.1というものがリリースされたではないか。RDBの明日はどっちだ。
  • ともあれ、お仕事ではEOLを迎えたスタックだらけのシステムの運用保守を担当することも少なくないはず。この記事を残しておくことでそんな方々の一助になれれば幸甚です。
175
149
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
175
149

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?