DockerfileのVOLUMEについて

Dockerfile

Dockerfileに記述するVOLUMEについての理解があいまいだったので備忘録を残します。

VOLUMEの記述については以下を例に確認していきます。

FROM mysql:8.0.32
ENV MYSQL_ROOT_PASSWORD=test
VOLUME /vol

VOLUME /volの記述の意味はmysqlコンテナの/volディレクトリにマウントするという意味になります。

Dockerfileからbuild

実際に検証してみます。

Dockerfileでbuildをします。

docker image build -t mysql:8.0.32 .

Dockerを起動

コンテナを起動します。

docker container run -d --name db mysql:8.0.32

volumeの確認

ボリュームが作れているか確認します。

docker volume ls

DRIVER    VOLUME NAME
local     7f315dc653740e460ee5406a9c7b6ba876dd17dc769dc0c658989dbc3d3811cc
local     13fbb1114a64034fdfad4281e78b5baeb51ddd4a4ae5a128d025d80c8f6a365c
local     cfa75ead406e7413d6101de76aaa4d9705a0fd8915412d5f1151c8c2b9108670

ボリュームは作られてはいるが、ハッシュ化されていて、どのボリュームかがわからない

ここはボリューム名を新たに指定して作成する方法を後述します。

/volディレクトリが作成されていることを確認

docker container exec -it db bash

# /volディレクトリが作成されていることを確認
bash-4.4# ls -l | grep vol
drwxr-xr-x   2 root root 4096 Apr  5 22:51 vol

# /volがマウントされているか確認
bash-4.4# df | grep vol
/dev/sde       1055762868 8324920 993734476   1% /vol

名前付きボリュームを作成する

先ほどのdocker container runコマンドだと無名ボリュームが作成され、ハッシュ化された状態のボリュームとなってしまうためわかりづらかったかと思います。

docker container run -d --name db mysql:8.0.32

これをボリュームに明示的に名前を付けて作成するには以下のコマンドを使用します。

docker container run -d --rm -v db_vol:/vol --name db mysql:8.0.32

オプションに-v [ボリューム名] : [コンテナのディレクトリ]とすることで、dbコンテナの/volディレクトリからdb_volボリュームに対してマウントすることができます。(コンテナ停止後にコンテナを削除したいため--rmを指定しています)

ボリュームが作成されているかを確認します。

docker volume ls

DRIVER    VOLUME NAME
local     2b307ad13b97f6d4efd2f22c167689a62dae02082e8f0dce11b3fdfc6d659807
local     7f315dc653740e460ee5406a9c7b6ba876dd17dc769dc0c658989dbc3d3811cc
local     db_vol

db_volというボリュームが作成されていることが確認できます。

コンテナ内に/volディレクトリを確認します。

docker container exec -it db bash

bash-4.4# ls -l | grep vol 
drwxr-xr-x   2 root root 4096 Apr  5 23:59 vol

/volディレクトリが存在することが確認できました。

ボリュームにデータが永続化されるか確認

/volディレクトリに適当なファイルを作ります。

bash-4.4# touch test.txt

bash-4.4# ls -l
total 0
-rw-r--r-- 1 root root 0 Apr  6 00:16 test.txt

bash-4.4# exit

exit後もボリュームが存在することを確認します。

docker volume ls
DRIVER    VOLUME NAME
local     7f315dc653740e460ee5406a9c7b6ba876dd17dc769dc0c658989dbc3d3811cc
local     db_vol

dbコンテナを停止し、コンテナ削除を確認します。

docker container stop db
# 以下コマンドでdbコンテナが表示されなけば削除されています
docker container ls -a

再度docker container runでコンテナ名を変えて全く別のコンテナを起動してみます。

別コンテナからマウントしていることが明示的にわかるようにコンテナ名をdb_2としています。

docker container run -d --rm -v db_vol:/vol --name db_2 mysql:8.0.32

db_2の起動を確認します。

docker container ls
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                 NAMES
1f62551c4c37   mysql:8.0.32   "docker-entrypoint.s…"   7 seconds ago   Up 6 seconds   3306/tcp, 33060/tcp   db_2

コンテナ内に入り、/volディレクトリにtest.txtが存在するかを確認します。

docker container exec -it db_2 bash 
bash-4.4# ls -l /vol/ 
total 0
-rw-r--r-- 1 root root 0 Apr  6 00:16 test.txt

test.txtが存在することが確認できました!

Docker学習におすすめの本

Dockerに関しては以下の本が非常に勉強なるのでおすすめです!

Docker/Kubernetes実践コンテナ開発入門 改訂新版

Amazonで山田 明憲のDocker/Kubernetes実践コンテナ開発入門 改訂新版。アマゾンならポイント還元本が多数。山田 明憲作品ほか、お急ぎ便対象商品は当日お届けも可能。またDocker/Kubernetes実践コンテナ開発入門 改訂新版もアマゾン配送商品なら通常配送無料。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です