コンテナが破棄されると、コンテナ内のデータも破棄されます。
データを残したい場合は、コンテナのデータをボリュームに保存できるようにマウントします。
・コンテナのデータ永続化の仕組み
・ボリュームの作成方法
・2種類のマウントの特徴
・マウントの方法
ボリュームとは
ボリュームとはストレージのある領域を区切ってもので、データを永続化するため場所のこと。
ハードディスクの領域を一部区切った領域と思ってください。
この「ボリューム」がコンテナのデータを保存する場所となります。
ボリュームはコンテナと別で管理されるため、コンテナが削除されてもボリュームは残ります。
マウントとは
マウントとは「ある対象」を接続して、OSやアプリケーションが操作できる状態にすること。
例えば、パソコンにマウスを接続することも、マウスをマウントしています。
Dokcerの場合では、
「ボリューム」をコンテナから操作できるように「マウント」します。
このことを「ボリュームのマウント」と言います。
マウント方法は2つある
マウントの方法は2つあります。
①ボリュームマウント
「ボリューム」をコンテナにマウントする。
②バインドマウント
「ホストマシン上のファイル、またはフォルダ」をコンテナにマウントする。
考え方、やり方が異なる点があるので、見ていきましょう。
ボリュームマウント
ボリュームをコンテナにマウントする仕組み。
「ボリューム」はDocker Engineが管理していて、実態はホストマシンから見えません。
そのため、特定のファイルを編集するなど、ボリュームの中を直接操作することはできません。
直接操作は出来ない一方で、メリットしてはボリュームを誤って削除してもホストマシンへの影響はありません。
ボリュームの作り方
ボリュームをマウントする場合、事前にボリュームを作成する必要があります。
「docker volume create」コマンドで作成します。
バインドマウントをする場合は、ボリュームの作成は不要です。
docker volume create [ボリューム]
ボリュームマウントの設定方法
ボリュームマウントは「docker container run」コマンドの「-v」オプションで行います。
docker run -v [ボリューム]:[マウント先] [イメージ名]
ボリュームマウント設定例
例として、MySQLコンテナにボリュームをマウントします。
MySQLコンテナにデータを登録して、コンテナを削除してもデータが残っていることを確認します。
①ボリュームの作成
% docker volume create vol-01
ボリュームが作成されたことを確認します。
% docker volume ls
DRIVER VOLUME NAME
local vol-01
②MySQLコンテナの起動とボリュームのマウント
–volumeオプションで、先ほど作成したボリューム”vol-01″をマウントします。
※MySQLの環境変数は任意の設定。”¥”は改行コード
MySQLコンテナ起動とマウント
% docker container run –name mysql-01 -d ¥
–env MYSQL_ROOT_PASSWORD=1234 ¥
–env MYSQL_USER=myuser ¥
–env MYSQL_PASSWORD=1234 ¥
–env MYSQL_DATABASE=testdb ¥
–volume vol-01:/var/lib/mysql ¥
mysql
③MySQLにログインして、テーブルにデータを追加します。
MySQLコンテナへ接続
docker container exec -it mysql-01 bash
MySQLへログイン。ここでパスワード”1234″を入力
mysql -u root -p
MySQLのテーブルに適当なデータを追加していきます。
mysql > use testdb;
mysql > create table users (id int, name varchar(255));
mysql -> insert into users (id, name) VALUES(1, ‘tanaka’);
mysql -> insert into users (id, name) VALUES(2, ‘yamada’);
データが追加されたことを確認
mysql -> select * from users;
+——-+———+
| id | name |
| 1 | tanaka |
| 2 | yamada |
+——-+———+
2 rows in set (0.00 sec)
MySQLを出ます
mysql -> exit
Bye
MySQLコンテナから出ます
exit
④MySQLコンテナを削除します。
※コンテナを削除しても、ボリュームは削除されないことを確認
docker container stop mysql-01
docker container rm mysql-01
⑤再度、MySQLコンテナを作成します。
“①”で作成したボリューム「vol-01」を再びマウントします。
※MySQLコンテナの名前は”mysql-02″とします。
% docker container run –name mysql-02 -d ¥
–env MYSQL_ROOT_PASSWORD=1234 ¥
–env MYSQL_USER=myuser ¥
–env MYSQL_PASSWORD=1234 ¥
–env MYSQL_DATABASE=testdb ¥
–volume vol-01:/var/lib/mysql ¥
mysql
⑦再度MySQLにログインして、テーブルのデータが残っていることを確認します。
MySQLコンテナへ接続
docker container exec -it mysql-02 bash
MySQLへログイン。ここでパスワード”1234″を入力
mysql -u root -p
mysql > use testdb;
手順3で作成したデータが残っていることを確認
mysql -> select * from users;
+——-+———+
| id | name |
| 1 | tanaka |
| 2 | yamada |
+——-+———+
2 rows in set (0.00 sec)
MySQLを出ます
mysql -> exit
Bye
MySQLコンテナから出ます
exit
バインドマウント
バインドマウントは「ホストマシン上のファイルやフォルダ」をコンテナにマウントします。
簡単に言うと、ホストマシン上のファイルやフォルダをDockerEngineと共有します。
バインドマウントの設定方法
マウント先にホストマシンのファイルやフォルダを指定するだけです。
例)「.nginx_dir」というフォルダを、nginxコンテナの/usr/share/nginx/htmlフォルダへマウントする
[ -v ホストマシンのフォルダorファイル:マウント先]の形式で指定します。
mkdir nginx_dir
nginxコンテナの起動とマウント
docker container run -v ./nginx_dir:/usr/share/nginx/html nginx