VagrantでDockerのボリュームを試してみる

VagrantでCentOS7にDockerの環境を作ってみる
https://yk5656.hatenablog.com/entry/20201118/1605625200
の続き

ボリューム

コンテナ内でファイルを作成して終了し、

$ docker run -it --rm ubuntu

# touch hoge.txt
# ls hoge.txt
hoge.txt

# exit

コンテナが削除された場合、

$ docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

再度コンテナを作成して起動しても、 当然のことながら作成したファイルは存在しない。

$ docker run -it --rm ubuntu

# ls hoge.txt
ls: cannot access 'hoge.txt': No such file or directory

# exit

ボリュームを作成し、

$ docker volume create my-vol

$ docker volume ls
DRIVER    VOLUME NAME
local     my-vol

ボリュームを指定して、コンテナを作成し、

$ docker run -it --rm -v my-vol:/my_dir ubuntu

作成したボリューム上でファイルを作成すると、

# cd my_dir
# touch hoge.txt
# ls
hoge.txt

# exit

再度、コンテナを作成して起動しても、ファイルが存在する。

$ docker run -it --rm -v my-vol:/my_dir ubuntu

# ls my_dir
hoge.txt

# exit

ちなみに、ボリュームの実態は、ホスト側の「/var/lib/docker/volumes」にある。

$ sudo yum install -y tree
$ sudo tree /var/lib/docker/volumes
/var/lib/docker/volumes
├── backingFsBlockDev
├── metadata.db
└── my-vol
    └── _data
        └── hoge.txt

作成したボリュームはrmコマンドで削除できる。

$ docker volume rm my-vol

$ docker volume ls
DRIVER    VOLUME NAME

匿名ボリューム

ボリューム名を指定しない場合、

$ docker run -it --name my-con --rm -v /mydir ubuntu
# (Ctrl+p Ctrl+q)

ランダムな名前でボリュームが作成される。

$ docker volume ls
DRIVER    VOLUME NAME
local     b7090cbe7c89d796ed8b42563cbf3d25b49b1697c1fcb35f517cf041859d6c9f

一旦接続して終了し、コンテナを削除。

$ docker attach my-con
# exit
$ docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

runコマンドで「--rm」をつけている場合、コンテナが削除される時に、 匿名ボリュームも自動的に削除される。

$ docker volume ls
DRIVER    VOLUME NAME

ホスト側のディレクトリをマウント

ボリューム名ではなく、絶対パスでホスト側のディレクトリを指定した場合、

$ docker run -it --name my-con --rm -v /home/vagrant/host_dir:/my_dir ubuntu

ボリュームにファイルを作成すると、

# cd my_dir
# touch hoge.txt
# ls
hoge.txt

# exit

ホスト側のディレクトリで参照できる。

$ ls host_dir
hoge.txt

DockerfileにVOLUMEを指定した場合

DockerfileにVOLUMEを指定して、

$ vi Dockerfile
FROM ubuntu

VOLUME /my_dir

イメージを作成。

$ docker build -t my-img .

$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
my-img       latest    6a3ae3cb1abf   8 seconds ago   72.9MB
ubuntu       latest    f643c72bc252   4 weeks ago     72.9MB

コンテナを起動して、一旦抜けると、

$ docker run -it --name my-con --rm my-img
# (Ctrl+p Ctrl+q)

匿名のボリュームが作成されているのが確認できる。

$ docker volume ls
DRIVER    VOLUME NAME
local     269f9a3a48f6ff76274fa7d4fd675af17927fd79d966a9499c8a1bc01dccb3ec

もう一度接続して終了し、コンテナを削除すると、

$ docker attach my-con
# exit

匿名ボリュームの場合と同様に自動的に削除される。

$ docker volume ls
DRIVER    VOLUME NAME

ボリュームの共有

ちなみに、ボリュームは複数のコンテナで共有することができる。

とりあえず、共有するボリュームを作成。

$ docker volume create my-vol
$ docker volume ls
DRIVER    VOLUME NAME
local     my-vol

1つ目のコンテナを起動し、

$ docker run -it --name my-con1 --rm -v my-vol:/my_dir ubuntu

ボリュームにファイルを作成。

# cd my_dir
# touch hoge1.txt
# ls
hoge1.txt
# (Ctrl+p Ctrl+q)

2つ目のコンテナを起動し、

$ docker run -it --name my-con2 --rm -v my-vol:/my_dir ubuntu

ボリュームにファイルを作成。

# cd my_dir
# touch hoge2.txt
# ls
hoge1.txt  hoge2.txt
# (Ctrl+p Ctrl+q)

1つ目のボリュームに戻ると、2つ目のコンテナで作成したファイルが確認できる。

$ docker attach my-con1
# ls
hoge1.txt  hoge2.txt