自由気ままに書いちゃおう

好きなことをつらつらと・・・

【Docker】バインドマウントとボリュームマウントについて

前回、前々回でDockerホストのディレクトリをコンテナからマウントする記事を書きました。 

www.guri2o1667.work


上記はDocker用語でバインドマウントと呼ばれます。
今回はボリュームマウントについてです。

■ボリュームマウントについて

Dockerホストに事前に作成したボリュームと呼ばれる領域を、
コンテナ側でマウントして使います。

■ボリュームマウントとバインドマウントの違い(大雑把)

Dokcerホストからマウント位置を操作できるかどうかが大きな違いです。

ボリュームマウント: Dockerホストからマウント箇所を操作できない。
バインドマウント: Dockerホストからマウント箇所を操作できる。

■ボリュームマウントを実際に使ってみる

MySQLコンテナを利用し、ボリュームマウントの動作を確認してみます。
※MySQLは5.7を利用します。(イメージがpull済みだったので)

1.DockerHubでMySQL5.7のDockerfileを確認し、VOLUME設定を確認します。

mysql/Dockerfile.debian at b11f06b0d202e7b0f97b000e158fc4fc869d2194 · docker-library/mysql · GitHub

f:id:guri2o1667:20210521143148p:plain

上記の通り、/var/lib/mysqlがボリュームとして指定されていることが確認できました。
※VOLUME設定は、ここで指定された名前でマウントポイントを生成します。

2.Dockerホスト上にマウントボリュームを作成します。
ボリューム名は「mysqlvolume1」としました。

docker volume create mysqlvolume1

f:id:guri2o1667:20210521143758p:plain


3.作成されたボリュームが存在することを確認します。

docker volume ls

f:id:guri2o1667:20210521143904p:plain

※「DRIVER」列が「local」のものは、Dockerホスト上にボリュームが存在することを意味しています。

4.当該ボリュームを利用し、mysqlコンテナを起動します。
rootユーザのパスワード(MYSQL_ROT_PASSWORD環境変数)は指定必須のため、
ここでは「password」としております。
mysqlコンテナ名は「mysql1」です。

docker run -itd --name mysql1 -v mysqlvolume1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=password mysql:5.7

f:id:guri2o1667:20210521144321p:plain

f:id:guri2o1667:20210521144425p:plain

5.mysqlコンテナにログインします。

docker exec -it mysql1 /bin/bash

f:id:guri2o1667:20210521144705p:plain

6.mysqlにログインします。
mysqlコンテナには手順5でログイン済みです。ここではmysqlデータベースにログインします。

mysql -p

f:id:guri2o1667:20210521145004p:plain

7.データベースを作成します。
データベース名は「db1」としました。

f:id:guri2o1667:20210521145122p:plain

8.テーブルを作成します。
テーブル名は「table1」としました。

create table table1(id int not null auto_increment, name varchar(20),primary key(id));


f:id:guri2o1667:20210521145532p:plain

9.テストデータを挿入し、内容確認後、mysqlからログアウトします。
ここでは、「test1」というユーザ名を挿入しました。

 insert into table1 (name) values ("test1");

f:id:guri2o1667:20210521154239p:plain

10.mysql1コンテナからもログアウトします。

f:id:guri2o1667:20210521154310p:plain

11.mysql1コンテナを削除します。

f:id:guri2o1667:20210521154429p:plain

12.新しいmysqlコンテナを作成し、mysqlデータベースの情報が残っていることを確認します。

コンテナ名は「mysql2」にしました。

f:id:guri2o1667:20210521155701p:plain


以上です。