まめぞうの技術メモ

IT関連で勉強したことをメモします

Docker Volume で MySQL のデータ保存領域をコンテナ外に設定する方法

コンテナで MySQL を起動している場合、コンテナ内にデータを保存していると、コンテナ停止時にデータが消えてしまいます。

データを Docker Volume に保存することで、データの永続化が可能です。

コンテナで MySQL のデータを保存したい
コンテナ利用時にも MySQL のデータを保存したい

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 については、以下の記事でも解説しております。

tech.mamezou00000.com

また、以下の mysql ボリュームの DokerHub 公式ページを参考に記事を作成しております。 https://hub.docker.com/_/mysql