Docker ボリュームマウントしてDBデータを永続化してみる
今回は MySQL コンテナでボリュームマウントについて試してみます。ちなみに、前回はバインドマウントをやってみました。
ボリュームマウントとは
Docker ホストで確保した領域を利用することで、前回試したバインドマウントはDocker ホストとは関係なしにホスト上のディレクトリをマウントする方法でした。
ボリュームマウントを使うメリットは、Docker で管理するので特にパスなどを考える必要がないということです。
自分のようにすぐにパスを忘れてしまうようなら、ボリュームマウントの方が必須かもですね。というより、どちらも利用ケースはあるにせよ、全体的にこっちの方が使いやすいのかな。
けど、Docker ホストのある場所でファイルやデータを格納してやりとりしたいときは、バインドマウントの方がわかりやすいかも。
なので使い分けは、
- 単純にコンテナのデータを保存 → ボリュームマウント
- データのやり取り、保存データをホストで編集 → バインドマウント
ですかね。
ボリューム関連のコマンド
コマンド | 内容 | サンプル |
---|---|---|
cretae | ボリュームを作成 | docker volume create samplevol |
inspect | ボリューム情報を確認 | docker volume inspect samplevol |
ls | ボリュームリスト表示 | docker volume ls |
prune | マウントされてないボリュームを削除 | docker volume prune |
rm | ボリューム削除 | docker volume create samplevol |
ボリュームマウントでコンテナを起動
まずはボリュームを作成します。
[ec2-user@~]$ docker volume create samplevol samplevol [ec2-user@~]$ docker volume ls DRIVER VOLUME NAME local samplevol [ec2-user@~]$
今回は MySQL コンテナを使ってデータ登録などを行い、その後コンテナを入れ替えてもデータが永続化されてるか確認します。
ではボリュームマウントで MySQL コンテナを起動します。
[ec2-user@~]$ docker run --name mysqldb -dit -p 3306:3306 -v samplevol:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=pwsswd mysql:5.7 d90f630bca70b3a53834584434ffba3a4033c90bac4be37cb5beb906bd4998d1 [ec2-user@~]$
MySQL コンテナに入ってデータを登録
コンテナ起動時に -p で3306 でパブリッシュしてるので MySQL WorkBench からアクセスすることができます。※EC2 のセキュリティインバウンドルールにポート3306 は追加しておく必要はあります。
適当にスキーマとテーブルを作成
もし、teraterm で直で MySQL コンテナに入る場合は docker exec コマンドを使います。
[ec2-user@~]$ docker exec -it mysqldb /bin/bash root@d90f630bca70:/# root@d90f630bca70:/# root@d90f630bca70:/# mysql -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 5 Server version: 5.7.32 MySQL Community Server (GPL) Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
コンテナ再作成
ではコンテナを削除→新規作成しても、先ほど作成したデータが表示されるか確認します。
まずはコンテナを削除
[ec2-user@~]$ docker stop mysqldb mysqldb [ec2-user@~]$ docker rm mysqldb mysqldb [ec2-user@~]$ [ec2-user@~]$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d256c64c0371 httpd:2.4 "httpd-foreground" 24 hours ago Exited (0) 24 hours ago webapp2 [ec2-user@~]$
さっき作成したボリュームをマウントして mysqldb2 という名前で MySQL コンテナを起動してみます。
[ec2-user@~]$ docker run --name mysqldb2 -dit -p 3306:3306 -v samplevol:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=pwsswd mysql:5.7 3e442b1084df59a740b96c11218fc2a773133ad587ce90a62b68169b1f1cc6cc [ec2-user@~]$
MySQL Workbench でアクセスしてみると、先ほど作成したテーブルやレコードが表示されました!