LoginSignup
0
1

More than 1 year has passed since last update.

Docker の Volumes と Bind mounts

Last updated at Posted at 2021-09-16

Docker の Volumes と Bind mounts について、何度読んでも意味が分からないのでまとめる。

docker run コマンドの -v (--volume) オプション

リファレンス: https://docs.docker.com/engine/reference/run/#volume-shared-filesystems

-v, --volume=[host-src:]container-dest[:]

The host-src can either be an absolute path or a name value. If you supply an absolute path for the host-src, Docker bind-mounts to the path you specify. If you supply a name, Docker creates a named volume by that name.

Docker 内のファイルを共有するには、Volumes と Bind mounts という二つの方法があるが、ややこしいことに、同じオプションで Volumes と Bind mounts という異なる機能を設定する。

A name value must start with an alphanumeric character, followed by a-z0-9, _ (underscore), . (period) or - (hyphen). An absolute path starts with a / (forward slash).

  • host-src が英数文字から始まる時: Volumes
  • host-src が / から始まる時: Bind mounts

Volumes https://docs.docker.com/storage/volumes/

Volume を作る

$ docker volume create my-vol

Volume のリスト。いつの間にか出来ているボリュームの最後に先程作った物が出る。

$ docker volume ls
DRIVER    VOLUME NAME
local     0ac8a1264245c3d065e045e06f5509691df967bba733deb49052548a04c39c5e
...
local     my-vol

Volume の情報を見る。

$ docker volume inspect my-vol
[
    {
        "CreatedAt": "2021-09-16T01:41:33Z",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
        "Name": "my-vol",
        "Options": {},
        "Scope": "local"
    }
]

これを見ると /var/lib/docker/volumes/my-vol/_data に実体がありそうだが、ホストが Mac だと見えない。この Volume をマウントして cont1 と名付けたコンテナを動かし、hello ファイルを作る。

$ docker run --name cont1 -v my-vol:/my-vol ubuntu \
  bash -c 'echo "Hello, world!" > /my-vol/hello'

Volume を別の cont2 と名付けたコンテナにマウントして中を見る。

$ docker run --name cont2 -v my-vol:/my-vol ubuntu \
  cat /my-vol/hello
Hello, world!

ちゃんと共有されている。

Bind mounts https://docs.docker.com/storage/bind-mounts/

Volumes を使うとホストのどこにファイルが保存されるか分からない。ホスト側の位置を指定したい時は Bind mounts を使う。

例えば cont1 で先程作った ファイルをホストにバックアップする時はこうする。

$ mkdir backup
$ docker run --rm --volumes-from cont1 -v $PWD/backup:/backup ubuntu \
  tar cvf /backup/backup.tar /my-vol
tar: Removing leading `/' from member names
/my-vol/
/my-vol/hello

次の事が起こる。

  • --volumes-from cont1: cont1 コンテナに使われた Volumes を全部マウントする。
  • -v $PWD/backup:/backup: ホストの $PWD/backup をコンテナの /backup に bind mounts する。
  • tar cvf /backup/backup.tar /my-vol: コンテナの /my-vol を /backup/backup.tar にバックアップする。
  • コンテナの /backup/backup.tar の実体はホストの $PWD/backup:/backup/backup.tar なので、コマンドが終わるとホストに backup.tar が残る。

確認

$ tar tf backup/backup.tar
my-vol/
my-vol/hello

後片付け

$ docker container rm cont1 cont2
$ docker volume prune
0
1
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
1