I'm a cloud engineer at foot of the small mountain

クラウド・ETL/ELT・Nocode・BigQuery などを中心に書ければね。最近触ったサービス・フレームワークなどのメモ

Docker ボリュームマウントしてDBデータを永続化してみる

今回は MySQL コンテナでボリュームマウントについて試してみます。ちなみに、前回はバインドマウントをやってみました。

miyamon44.hatenablog.jp

ボリュームマウントとは

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 は追加しておく必要はあります。
f:id:sennanvolar44:20210111071003p:plain

適当にスキーマとテーブルを作成
f:id:sennanvolar44:20210111071448p:plain

もし、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 でアクセスしてみると、先ほど作成したテーブルやレコードが表示されました!
f:id:sennanvolar44:20210111072238p:plain