0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Dockerのボリュームとバインドマウントの違い

Posted at

ボリュームとは

 ボリュームは、ログや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など)

などの場合に向いています。

対してバインドマウントは

  • 開発でホストマシンにあるファイルが必要な場合

に使えると思います。
ただ、先程見たようにバインドマウントはホストマシンに影響を与えるので、基本的にはボリュームを使うようにしましょう。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?