コンテナで MySQL を起動している場合、コンテナ内にデータを保存していると、コンテナ停止時にデータが消えてしまいます。
データを Docker Volume に保存することで、データの永続化が可能です。
Volume をマウントして MySQL コンテナを起動してみる
現時点で最新版だった、8.0.27 のイメージを pull します。
docker pull mysql:8.0.27
Volume を作ります。今回は、test という名前で volume 作成します。
docker volume create test
-v
で volume を指定します。ボリューム名:マウント先のパス
になります。
-e で MySQL のルートパスワードを指定しています。-d はバックグラウンドで起動というオプションですね。
docker run --name test-mysql -v test:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=Password1 -d mysql:8.0.27
MySQL コンテナに入ってテストデータを投入
mysql クライアントが PC に入っていなかったので、コンテナに入って SQL を実行します。
docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3789679c292f mysql:8.0.27 "docker-entrypoint.s…" 12 minutes ago Up 12 minutes 3306/tcp, 33060/tcp test-mysql
3789679c292f をメモ。
docker exec コマンドでコンテナに入ります。
docker exec -it 3789679c292f bash
mysql クライアントで MySQL に接続します。パスワードを聞かれたら、コンテナ起動時に設定した Password1 を入力します。
mysql -p
その後、データベースを作り、テーブルを作り、データを挿入します。
create database test; use test; create table test(id int, name varchar(10)); insert into test(id, name) values (0,"mame"); commit;
念の為、SELECT 文で確認します。
select * from test; +------+------+ | id | name | +------+------+ | 0 | mame | +------+------+
はい、OK です。
コンテナを停止して、別のコンテナで起動時に Volume をマウントします。
exit
コマンドでコンテナを抜けます。
MySQL コンテナを停止します。
docker stop 3789679c292f
3789679c292f
新しいコンテナを Volume をマウントして起動します。名前は test-mysql2
にしました。
docker run --name test-mysql2 -v test:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=Password1 -d mysql:8.0.27
コンテナに入って確認します。
docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 688e67a87289 mysql:8.0.27 "docker-entrypoint.s…" 19 seconds ago Up 30 seconds 3306/tcp, 33060/tcp test-mysql2 docker exec -it 688e67a87289 bash
SQL コマンドでデータの永続性を確認します。
mysql -p
select * from test.test; +------+------+ | id | name | +------+------+ | 0 | mame | +------+------+ 1 row in set (0.00 sec)
コンテナが停止されても、ちゃんとデータが残っていることが確認できました。
補足
Docker の Volume については、以下の記事でも解説しております。
また、以下の mysql ボリュームの DokerHub 公式ページを参考に記事を作成しております。 https://hub.docker.com/_/mysql