Docker入門 第5回 ボリュームの基本 ボリュームマウント、バインドマウントの仕組みと設定方法

Docker基礎

コンテナが破棄されると、コンテナ内のデータも破棄されます。
データを残したい場合は、コンテナのデータをボリュームに保存できるようにマウントします。

このページで学ぶこと
・コンテナのデータ永続化の仕組み
・ボリュームの作成方法
・2種類のマウントの特徴
・マウントの方法

ボリュームとは

ボリュームとはストレージのある領域を区切ってもので、データを永続化するため場所のこと。
ハードディスクの領域を一部区切った領域と思ってください。

この「ボリューム」がコンテナのデータを保存する場所となります。
ボリュームはコンテナと別で管理されるため、コンテナが削除されてもボリュームは残ります。

マウントとは

マウントとは「ある対象」を接続して、OSやアプリケーションが操作できる状態にすること。
例えば、パソコンにマウスを接続することも、マウスをマウントしています。

Dokcerの場合では、
「ボリューム」をコンテナから操作できるように「マウント」します。
このことを「ボリュームのマウント」と言います。

マウント方法は2つある

マウントの方法は2つあります。
①ボリュームマウント
「ボリューム」をコンテナにマウントする。
②バインドマウント
「ホストマシン上のファイル、またはフォルダ」をコンテナにマウントする。

考え方、やり方が異なる点があるので、見ていきましょう。

ボリュームマウント

ボリュームをコンテナにマウントする仕組み。
「ボリューム」はDocker Engineが管理していて、実態はホストマシンから見えません。

そのため、特定のファイルを編集するなど、ボリュームの中を直接操作することはできません。
直接操作は出来ない一方で、メリットしてはボリュームを誤って削除してもホストマシンへの影響はありません。

ボリュームの作り方

ボリュームをマウントする場合、事前にボリュームを作成する必要があります。
docker volume create」コマンドで作成します。
バインドマウントをする場合は、ボリュームの作成は不要です。

docker volume create [ボリューム]

ボリュームマウントの設定方法

ボリュームマウントは「docker container run」コマンドの「-v」オプションで行います。

docker run -v [ボリューム]:[マウント先] [イメージ名]

ボリュームマウント設定例

例として、MySQLコンテナにボリュームをマウントします。
MySQLコンテナにデータを登録して、コンテナを削除してもデータが残っていることを確認します。

①ボリュームの作成
ホストPCのターミナル : “vol-01″というボリュームを作成
% docker volume create vol-01
ボリュームが作成されたことを確認します。
% docker volume ls
DRIVER   VOLUME NAME
local        vol-01
②MySQLコンテナの起動とボリュームのマウント

–volumeオプションで、先ほど作成したボリューム”vol-01″をマウントします。
※MySQLの環境変数は任意の設定。”¥”は改行コード

ホストPCのターミナル
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にログインして、テーブルにデータを追加します。
ホストPCのターミナル
MySQLコンテナへ接続
docker container exec -it mysql-01 bash
MySQLへログイン。ここでパスワード”1234″を入力
mysql -u root -p
以降はMySQLのプロンプト操作
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コンテナを削除します。

※コンテナを削除しても、ボリュームは削除されないことを確認

ホストPCのターミナル : MySQLコンテナを削除
docker container stop mysql-01
docker container rm mysql-01
⑤再度、MySQLコンテナを作成します。

“①”で作成したボリューム「vol-01」を再びマウントします。
※MySQLコンテナの名前は”mysql-02″とします。

ホストPCのターミナル : MySQLコンテナ起動とマウント
% 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にログインして、テーブルのデータが残っていることを確認します。
ホストPCのターミナル
MySQLコンテナへ接続
docker container exec -it mysql-02 bash
MySQLへログイン。ここでパスワード”1234″を入力
mysql -u root -p
以降はMySQLのプロンプト操作
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ファイル:マウント先]の形式で指定します。

ホストPCのターミナル
mkdir nginx_dir
nginxコンテナの起動とマウント
docker container run -v ./nginx_dir:/usr/share/nginx/html nginx
タイトルとURLをコピーしました