Dockerfileに記述するVOLUMEについての理解があいまいだったので備忘録を残します。
VOLUMEの記述については以下を例に確認していきます。
FROM mysql:8.0.32
ENV MYSQL_ROOT_PASSWORD=test
VOLUME /vol
VOLUME /vol
の記述の意味はmysqlコンテナの/vol
ディレクトリにマウントするという意味になります。
Table of Contents
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に関しては以下の本が非常に勉強なるのでおすすめです!