コンテナでデータを永続化する方法はおもに3つあります。
バインドマウントと名前付きボリュームの例を見ます。
例としてMysql 5.7.38イメージを使用します^mount-sample。
version: "3"
services:
db:
image: mysql:5.7.38
command: --default-authentication-plugin=mysql_native_password
restart: always
volumes:
- mysql-5.7-store:/var/lib/mysql # 名前付きボリューム
- ./logs:/var/log/mysql # バインドマウント
environment:
MYSQL_ROOT_PASSWORD: example
volumes:
mysql-5.7-store:
Docker Composeを実行します。
$ docker-compose up -d
名前付きボリュームはdocker volume ls
で確認できます^volume_name。
$ docker volume ls
DRIVER VOLUME NAME
local mysql-5.7-store:
コンテナにログインしてexample
データベースを作成します。
コンテナを確認します。
docker ps --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f1104a347bac mysql:5.7.38 "docker-entrypoint.s…" 25 seconds ago Up 24 seconds 3306/tcp, 33060/tcp mysql57_db_1
コンテナに入ってexample
データベースを作成します。
$ docker exec -it f1104a347bac /bin/bash
# mysql -uroot -pexample
> create database example;
ボリユームを残してコンテナ及びネットワークを削除します。
$ docker-compose down
ボリュームを確認します。
$ docker volume ls
DRIVER VOLUME NAME
local mysql-5.7-store
mysql-5.7-store
ボリュームを指定してコンテナを起動します[^compose-up]。
[^compose-up]:docker-compose up -d
でも同様ですが、今回はdocker run
で起動してみます。
$ docker run -v mysql-5.7-store:/var/lib/mysql --name mysql-sample -d mysql:5.7.38
mysql-storageが接続されていることを確認します。
$ docker exec -it mysql-sample /bin/bash
root@4654047770fe:/# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.38 MySQL Community Server (GPL)
Copyright (c) 2000, 2022, 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 |
| example |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.01 sec)
先程追加したexample
データベースが存在します。
volumeの情報を確認します。
$ docker volume inspect mysql-5.7-store
[
{
"CreatedAt": "2022-05-28T07:13:21Z",
"Driver": "local",
"Labels": {
"com.docker.compose.project": "mysql57",
"com.docker.compose.version": "2.5.1",
"com.docker.compose.volume": "mysql-storagee"
},
"Mountpoint": "/var/lib/docker/volumesmysql-storagee/_data", // ホスト側ディレクトリ
"Name": "mysql-5.7-store",
"Options": null,
"Scope": "local"
}
]
Macでは/var/lib/docker/volumes/mysql-storage/_data
は存在しません。
理由は以下サイトで詳しく解説されています。
[Docker for Mac] Docker Volumeの実態がどこにあるのか、探してみた