dockerとmysqlでデータ永続化

docker-composeでmysqlを起動する方法。

version: '3'
services:
    db:
        image: mysql:5.7
        ports:
            - "3306:3306"
        volumes:
            - ./db/data:/var/lib/mysql
        environment:
            MYSQL_DATABASE: test_database
            MYSQL_ROOT_PASSWORD: root
            MYSQL_USER: test
            MYSQL_PASSWORD: test

こんな感じで作るとホスト側の./db/dataディレクトリがコンテナの/var/lib/mysqlにマウントされる。(マウントという言葉の使い方あっているか?)
のでコンテナを削除してからまた起動してもデータが消えていない。
コンテナのmysqlに入る

docker container exec -it 2019_01_09_db_1 mysql -utest -ptest test_database;

テーブル作成

 CREATE TABLE user( id int PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci;

データ投入

INSERT INTO user (name) VALUES('name01'),('name02'),('name03');

コンテナ削除

docker rm -f 2019_01_09_db_1 

データ有る

mysql> select * from user;
+----+--------+
| id | name   |
+----+--------+
|  1 | name01 |
|  2 | name02 |
|  3 | name03 |
+----+--------+

マウントしないでやってみると

version: '3'
services:
    db:
        image: mysql:5.7
        ports:
            - "3306:3306"
        environment:
            MYSQL_DATABASE: test_database
            MYSQL_ROOT_PASSWORD: root
            MYSQL_USER: test
            MYSQL_PASSWORD: test
mysql> show tables;
Empty set (0.00 sec)

となり、たしかにテーブルが消えていた。




おまけ

マウントした状態で、テーブル名などにタイポがあったので直して、コンテナを削除して再起動してもテーブル名が変わっていなくてつまづいた。
当然のことながら、マウントされている状態ではデータがホスト側に残っているので、その状態でコンテナを起動するとテーブルやその中のデータも保存されている。
一度ホスト側のマウントされているディレクトリを空にする必要が有る。