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