ボリュームとは
ボリュームは、ログやMySQLサーバーのデータなどをコンテナ終了後も消したくないときに利用します。コンテナの任意のディレクトリにマウントすることで、コンテナのファイルをコンテナ外に保存できます。マウントの具体的な処理はDockerがやってくれるので、マウント先を決めるだけですぐに利用できます。
コンテナ削除後にも利用したいデータはボリュームに保存し、別のコンテナを起動したときに同じボリュームをマウントすれば、新しいコンテナでデータを継続して利用できます。
バインドマウントとは
ホストマシンの任意のディレクトリをコンテナにマウントします。バインドマウントでマウントしたディレクトリは、ホストマシン側とコンテナ側どちらからでも参照できます。
ボリュームとバインドマウントの違い
ボリュームはコンテナのデータをコンテナ外に保存するための仕組みでしたが、ボリュームの管理はDocker Engineに任せます。
一方で、バインドマウントはホストマシンのディレクトリをコンテナにマウントしています。コンテナ内でマウント先のディレクトリを破損させてしまった場合、ボリュームはDocker Engine内で済みますが、バインドマウントはホストマシンにまで影響を及ぼします。
ボリュームをマウントする
ボリュームの作成
試しにmy-volumeを作成してみます。
docker volume create --name my-volume
lsで確認するとmy-volumeを確認できます。
% docker volume ls
DRIVER VOLUME NAME
~ 省略 ~
local my-volume
作成したボリュームをマウントする
作成したボリュームをUbuntuコンテナにマウントしてみます。
% docker container run --name ubuntu1 --rm --interactive --tty --mount type=volume,source=my-volume,destin
ation=/my-work ubuntu:22.04
そして、以下のようにmy-workディレクトリが作られていることを確認できました。
root@f19ae1b369e2:/# ls
bin boot dev etc home lib media mnt my-work opt proc root run sbin srv sys tmp usr var
ここで、my-workディレクトリ内に新たにファイルを作成してみます。
root@f19ae1b369e2:/# echo 'This is test' > /my-work/test.txt
root@f19ae1b369e2:/# ls my-work/
test.txt
ubuntu1を削除し、新たにubuntu2コンテナを起動します。ubuntu1でマウントしたmy-volumeを同じようにマウントしてみます。
% docker container run --name ubuntu2 --rm --interactive --tty --mount type=volume,source=my-volume,destin
ation=/my-work ubuntu:22.04
すると、以下のようにubuntu2でもubuntu1で作成したtest.txtを確認できます。
root@211c6f447ab1:/# ls my-work/
test.txt
コンテナにバインドマウントする
Pythonコンテナにホストマシンで作成したファイルをバインドマウントして起動し、実行してみます。まずは、コンテナを起動する前に任意の場所でディレクトリを作成し、月のhello.pyファイルを作成してみます。
print('Hello World')
次にこのファイルをバインドマウントしてPythonコンテナを実行します。
% docker container run --name python --rm --interactive --tty --mount type=bind,source="$(pwd)",target=/my-work python:3.13.0 bash
すると、以下のようにmy-work内にhello.pyがあるので実行してみます。
root@e35e3d0ad205:/# ls my-work/
hello.py
root@e35e3d0ad205:/# python my-work/hello.py
Hello World
文字列を出力することができましたね。
ここでコンテナ内でhello.pyを削除するとどうなるでしょうか。
root@e35e3d0ad205:/# rm my-work/hello.py
root@e35e3d0ad205:/# exit
exit
% ls
%
コンテナでhello.pyを削除すると、自分の環境内からも消えました。
このようにバインドマウントはコンテナの操作がホストマシンに影響するので、利用には注意が必要です。
ボリュームとバインドマウントの使い分け
以上のことから、ボリュームは
- コンテナのデータを永続的に残したい
- 運用の環境を残したい(DBなど)
などの場合に向いています。
対してバインドマウントは
- 開発でホストマシンにあるファイルが必要な場合
に使えると思います。
ただ、先程見たようにバインドマウントはホストマシンに影響を与えるので、基本的にはボリュームを使うようにしましょう。