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