前回は、独自のネットワークを作成し利用する方法を見てきました。今回は、ボリュームについて紹介したいと思います。以下の方法について紹介します。

  • bind mountによる方法
  • volumeを使う方法

bind mountによるディレクトリ提供方法について

Dockerエンジンが稼働するホストOS上の任意のデバイスファイルやディレクトリを公開してコンテナに見せることができます。下記例は、$(pwd)/testmount/をコンテナから活用する例です。先にマウントするディレクトリを作成します。

$ mkdir testmount 
$ echo "Hello World" > testmount/hello.txt

上記ディレクトリをマウントするには、下記のようにします。

$docker container run -it --name mounttest01 -h mounttest01 --mount type=bind,src=$(pwd)/testmount,dst=/root/chdir0001 centos:centos7 /bin/bash

下記コマンドを実行してみるとマウントが出来ていることが確認できます。

$ [root@mounttest01 /]# ls -al /root/chdir0001/
total 8
drwxr-xr-x 3 root root   96 Sep 13 23:04 .
dr-xr-x--- 1 root root 4096 Sep 13 23:03 ..
-rw-r--r-- 1 root root   12 Sep 13 22:52 hello.txt

コンテナ内では読み込み専用としてマウントする

上の方法では、コンテナ上でもファイルの編集、削除が出来る設定になっています。コンテナ側では、読み込みのみできるように設定する方法を確認しておきましょう。

$ docker container run -it --name mounttest02 -h mounttest02 --mount type=bind,src=(pwd)/testmount,dst=/root/chdir0001,readonly centos:ce
ntos7 /bin/bash

先程のコマンドのコンテナ側のディレクトリに対して’readonly’を不要する形になります。hello.txtが存在するか確認してみます。

$ [root@mounttest02 /]# ls -al /root/chdir0001/
total 8
drwxr-xr-x 3 root root   96 Sep 13 23:04 .
dr-xr-x--- 1 root root 4096 Sep 13 23:21 ..
-rw-r--r-- 1 root root   12 Sep 13 22:52 hello.txt

ファイルシステムが読み込みでマウントできれば、ファイルの読み込みが出来ないはずなので、ファイルを作成できないことを確認してみます。

$ [root@mounttest02 /]# touch /root/chdir0001/message.txt
touch: cannot touch '/root/chdir0001/message.txt': Read-only file system

念の為、hello.txtが削除できないことも確認してみます。

$ [root@mounttest02 /]# rm -rf /root/chdir0001/hello.txt
rm: cannot remove '/root/chdir0001/hello.txt': Read-only file system

マウントの状況を確認するには、docker container inspectを利用します。Mountsというキーの項目に記載されます。

$ docker container inspect mounttest02
[
・・・
    {
        "HostConfig": {
            "AutoRemove": false,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "Mounts": [
                {
                    "Type": "bind",
                    "Source": "/Users/kawashima/work/app-swing-by/tech_blogs/docker/volumes/testmount",
                    "Target": "/root/chdir0001",
                    "ReadOnly": true
                }
            ]
        },
    }
・・・
]

volumeを提供する

ホストOSのボリュームをコンテナに提供します。下記例は、起動時にmouttest03というボリュームを作成しています。

$  docker container run -it --name mounttest03 -h mounttest03 --mount type=volume,src=mounttest03,dst=/root/chdir0003 centos:centos7 /bin/
bash

ボリュームについて確認します。下記のようにmounttest03が生成されていることがわかります。

$ docker volume ls
DRIVER              VOLUME NAME
local               mounttest03

このボリュームはどこに作成されているのかを調べるには、以下のコマンドを利用します。※ Dokcer for Macでもこちらのパスが表示されますが、実態は、別の場所に保存されています。こちらについては、docker for macが仮想化環境で動作しているため、このような状況になります。説明が長くなりそうなので、別の機会に記事を作成してようと思います。

$ docker volume inspect mounttest03 |
[
    {
        "CreatedAt": "2020-09-13T23:40:45Z",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/mounttest03/_data",
        "Name": "mounttest03",
        "Options": null,
        "Scope": "local"
    }
]

ファイルを作ってみます。下記操作は、コンテナから実行しています。

#  echo "hello" >  /root/chdir0003/greet.txt
# ls -al /root/chdir0003
total 12
drwxr-xr-x 2 root root 4096 Sep 13 23:51 .
dr-xr-x--- 1 root root 4096 Sep 13 23:40 ..
-rw-r--r-- 1 root root    6 Sep 13 23:51 greet.txt

おわりに

今回は、永続化ボリュームについて見てきました。Dockerホストのディレクトリ、volumeを使うことで、コンテナで作成したデータを共有できることがわかりました。Dockerを初心者が利用する際に躓きそうさなポイントをアーキテクチャ、よく使うコマンド、ネットワーク、ボリュームの観点で見てきました。まだ紹介できていない箇所もありますが、Dockerトピック形式などもう少し実践的な内容も紹介できればと思っています。