Dockerのbind mountを使用してMySQLデータを永続化する

## bind mount
バインド マウントはホスト マシン上のファイルまたはディレクトリがコンテナにマウントされます。ファイルまたはディレクトリは、ホスト マシン上の絶対パスによって参照されます。対照的に、ボリュームを使用する場合、ホスト マシン上の Docker のストレージ ディレクトリ内に新しいディレクトリが作成され、Docker がそのディレクトリの内容を管理します。
## Dockerのbind mountを使用してMySQLデータを永続化する
Dockerのbind mountを使用してMySQLのコンテナを作成する
```shell-session
$ pwd
/home/dxrdxr/data
$ docker container run --name your-mysql -e MYSQL_ROOT_PASSWORD=admin -d -p 3306:3306 -v /home/dxrdxr/data:/var/lib/mysql mysql
a0cb29730448c71b424ba1c3e6478adcde5f570ba9e9ebf2350de7930db7cc64
$ docker container ls -a
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS
                            NAMES
a0cb29730448   mysql     "docker-entrypoint.s…"   35 seconds ago   Up 33 seconds   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   your-mysql
```
データベースを作成する
```shell-session
$ docker container exec -it your-mysql sh
sh-4.4# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.3.0 MySQL Community Server - GPL

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

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> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.01 sec)

mysql> CREATE DATABASE your_db_01 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
]Query OK, 1 row affected, 2 warnings (0.02 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| your_db_01         |
+--------------------+
5 rows in set (0.00 sec)

mysql>
```
mountのディレクトリを確認する
```shell-session
$ pwd
/home/dxrdxr/data
$ ll
total 100724
-rw-r-----  1    999 docker   196608 Feb 24 21:57 '#ib_16384_0.dblwr'
-rw-r-----  1    999 docker  8585216 Feb 24 21:51 '#ib_16384_1.dblwr'
drwxr-x---  2    999 docker     4096 Feb 24 21:51 '#innodb_redo'/
drwxr-x---  2    999 docker     4096 Feb 24 21:51 '#innodb_temp'/
drwxr-xr-x  8    999 dxrdxr     4096 Feb 24 21:57  ./
drwxr-x--- 14 dxrdxr dxrdxr     4096 Feb 24 21:48  ../
-rw-r-----  1    999 docker       56 Feb 24 21:51  auto.cnf
-rw-r-----  1    999 docker  3040246 Feb 24 21:51  binlog.000001
-rw-r-----  1    999 docker      414 Feb 24 21:57  binlog.000002
-rw-r-----  1    999 docker       32 Feb 24 21:51  binlog.index
-rw-------  1    999 docker     1680 Feb 24 21:51  ca-key.pem
-rw-r--r--  1    999 docker     1108 Feb 24 21:51  ca.pem
-rw-r--r--  1    999 docker     1108 Feb 24 21:51  client-cert.pem
-rw-------  1    999 docker     1680 Feb 24 21:51  client-key.pem
-rw-r-----  1    999 docker     5746 Feb 24 21:51  ib_buffer_pool
-rw-r-----  1    999 docker 12582912 Feb 24 21:57  ibdata1
-rw-r-----  1    999 docker 12582912 Feb 24 21:51  ibtmp1
drwxr-x---  2    999 docker     4096 Feb 24 21:51  mysql/
-rw-r-----  1    999 docker 32505856 Feb 24 21:57  mysql.ibd
lrwxrwxrwx  1    999 docker       27 Feb 24 21:51  mysql.sock -> /var/run/mysqld/mysqld.sock
drwxr-x---  2    999 docker     4096 Feb 24 21:51  performance_schema/
-rw-------  1    999 docker     1680 Feb 24 21:51  private_key.pem
-rw-r--r--  1    999 docker      452 Feb 24 21:51  public_key.pem
-rw-r--r--  1    999 docker     1108 Feb 24 21:51  server-cert.pem
-rw-------  1    999 docker     1676 Feb 24 21:51  server-key.pem
drwxr-x---  2    999 docker     4096 Feb 24 21:51  sys/
-rw-r-----  1    999 docker 16777216 Feb 24 21:57  undo_001
-rw-r-----  1    999 docker 16777216 Feb 24 21:53  undo_002
drwxr-x---  2    999 docker     4096 Feb 24 21:57  your_db_01/
```
MySQLのコンテナを削除する
```shell-session
$ docker container ls -a
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS
                            NAMES
a0cb29730448   mysql     "docker-entrypoint.s…"   16 minutes ago   Up 16 minutes   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   your-mysql
$ docker container stop your-mysql
your-mysql
$ docker container ls -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
```
Dockerのbind mountを使用してMySQLのコンテナを再作成する
```shell-session
$ docker container run --name your-mysql -e MYSQL_ROOT_PASSWORD=admin -d -p 3306:3306 -v /home/dxrdxr/data:/var/lib/mysql mysql
bf35b36c27c281d619a44fc035172bdd4f0c69014808c9b369fece88f8e9290f
$ docker container ls
CONTAINER ID   IMAGE     COMMAND                  CREATED              STATUS              PORTS
                                    NAMES
bf35b36c27c2   mysql     "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   your-mysql
```
MySQLのデータベースを確認する
```shell-session
$ docker container exec -it your-mysql sh
sh-4.4# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.3.0 MySQL Community Server - GPL

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

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> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| *your_db_01*        |
+--------------------+
5 rows in set (0.00 sec)
```