これまで、Dockerイメージのダウンロードや元のイメージを変更し、それを保存して利用するなどの方法を説明しましたが、今回は、Dockerコンテナからのディレクトリのアクセスやボリュームの共有について解説します。
ホストOSのディレクトリをDockerコンテナ内で利用する
Dockerでは、ホストOSが提供するディレクトリをコンテナに見せることが可能です。これは、ホストOSが提供するデータをコンテナに配布し、利用する場合に有用です。以下は、ホストOSが提供する/hostdir0001ディレクトリをDockerコンテナ内で利用する例です。まず、ホストOS側で、コンテナに提供するディレクトリを作成します。今回は、/hostdir0001ディレクトリをコンテナに提供するとします。
ホストOSの/hostdir0001に、なにか適当なファイルを作成します。
1 | # echo "Hello Docker" > /hostdir0001/testfile0001.txt |
ホストOSの/hostdir0001をコンテナに提供します。以下は、ホストOSの/hostdir0001をコンテナ内の/root/ctdir0001として利用する設定例です。
1 | # docker run -v /hostdir0001:/root/ctdir0001 -i -t centos:c66docker0001 /bin/bash |
コンテナ内の/root/ctdir0001ディレクトリにホストOSが提供するファイルが存在するかどうかを確認します。
1 | [root@95cbf518b30e /]# ls /root/ctdir0001/ |
3 | [root@95cbf518b30e /]# cat /root/ctdir0001/testfile0001.txt |
コンテナ内で、ファイルを削除してみます。
1 | [root@95cbf518b30e ctdir0001]# pwd |
3 | [root@95cbf518b30e ctdir0001]# rm -rf testfile0001.txt |
別の端末で、ホストOS上の/hostdir0001ディレクトリ内のファイルが削除されているかを確認します。
ホストOSのディレクトリを書き込み不可でコンテナに見せる
ホストOSが提供する/hostdir0001を、コンテナに読み込みのみを許可し、書き込み不可の状態で提供するには、-vオプションで指定するコンテナのディレクトリ名の後に、「:ro」を付与します。
ホストOS上で動作テスト用のファイルを作成しておきます。
1 | # echo "Hello Docker" > /hostdir0001/testfile0002.txt |
ホストOSが提供する/hostdir0001を書き込み不可の状態で、コンテナc0001上の/root/ctdir0001として見せます。
1 | # docker run -v /hostdir0001:/root/ctdir0001:ro --name c0001 -i -t centos:c66docker0001 /bin/bash |
コンテナc0001上で、/root/ctdir0001ディレクトリに見えるtestfile0002.txtが読み込みのみ許可されており、書き込み不可になっているかどうかを確認します。
1 | [root@92aacd9af75f /]# ls /root/ctdir0001/ |
4 | [root@92aacd9af75f /]# rm -rf /root/ctdir0001/testfile0002.txt |
5 | rm: cannot remove `/root/ctdir0001/testfile0002.txt': Read-only file system |
7 | [root@92aacd9af75f /]# echo "Hello Docker Docker" >> /root/ctdir0001/testfile0002.txt |
8 | bash: /root/ctdir0001/testfile0002.txt: Read-only file system |
上記より、ホストOSで提供される/hostdir0001がコンテナc0001内で/root/ctdir0001として見えていますが、削除も書き込みもできないことがわかります。
1 | [root@92aacd9af75f /]# cat /root/ctdir0001/testfile0002.txt |
コンテナがホストOSのどのディレクトリを利用できるのかを確認するには、ホストOS上でdockerコマンドにinspectを付与し、コンテナ名を指定します。出力結果の中の「Volumes」に利用可能なボリュームが出力されています。以下は、現在稼働中のコンテナc0001が利用可能なホストOSのボリュームを表示した例です。
ホストOS上の/hostdir0001ディレクトリが、コンテナc0001上の/root/ctdir0001ディレクトリとして、書き込み不可で利用可能であることがわかります。
01 | # docker inspect c0001 |less |
05 | "/hostdir0001:/root/ctdir0001:ro" |
10 | "Source": "/hostdir0001", |
11 | "Destination": "/root/ctdir0001", |
複数のコンテナで単一のデータ用ボリュームを共有する
複数のコンテナ間で一つのデータ用ボリュームを共有したい場合があります。以下では、コンテナc0001で作成した/data/vol0001ディレクトリにファイルを保存し、そのファイルを別のコンテナc0002からアクセスする例です。まず、Dockerイメージcentos:centos7.1.1503から、コンテナc0001を生成し、コンテナ上の共有ボリュームとなる/data/vol0001ディレクトリをコンテナc0001上で利用可能にします。
1 | # docker run -i -t -v /data/vol0001 --name c0001 centos:centos7.1.1503 /bin/bash |
別の端末で、コンテナc0001が提供するボリューム/data/vol0001を共有するコンテナc0002を生成します。
1 | # docker run -i -t --volumes-from c0001 --name c0002 centos:centos7.1.1503 /bin/bash |
コンテナc0001あるいはc0002の共有ボリューム/data/vol0001にファイルを作成し両方のコンテナからアクセスできるかを確認します。
1 | [root@5e93d327df12 /]# echo "Hello Docker shared volume" > /data/vol0001/data0001.txt |
コンテナc0001で共有ボリューム/data/vol0001上のファイルdata0001.txtの中身を確認しておきます。
1 | [root@5e93d327df12 ~]# cat /data/vol0001/data0001.txt |
2 | Hello Docker shared volume |
コンテナc0002でも同様に、data0001.txtの中身を確認します。
1 | [root@95113b896ec9 ~]# cat /data/vol0001/data0001.txt |
2 | Hello Docker shared volume |
共有可能なボリュームのファイルを書き込み不可で共有する場合は、「--volumes-from コンテナ名」の後に「:ro」を付与します。
1 | # docker run -i -t --volumes-from c0001:ro --name c0002 centos:centos7.1.1503 /bin/bash |
2 | [root@631fd6032fd4 vol0001]# ls -l /data/vol0001/data0001.txt |
3 | -rw-r--r--. 1 root root 27 May 24 01:18 /data/vol0001/data0001.txt |
4 | [root@631fd6032fd4 vol0001]# rm -rf data0001.txt |
5 | rm: cannot remove 'data0001.txt': Read-only file system |
6 | [root@631fd6032fd4 vol0001]# |
コンテナc0002からは書き込み不可になっていることがわかります。ただし、ボリュームを提供する側のコンテナc0001は、共有ボリュームのファイルへの更新や削除ができることに注意してください。