Dockerコンテナからのディレクトリアクセスやボリューム共有

2015年9月15日(火)
古賀 政純

これまで、Dockerイメージのダウンロードや元のイメージを変更し、それを保存して利用するなどの方法を説明しましたが、今回は、Dockerコンテナからのディレクトリのアクセスやボリュームの共有について解説します。

ホストOSのディレクトリをDockerコンテナ内で利用する

Dockerでは、ホストOSが提供するディレクトリをコンテナに見せることが可能です。これは、ホストOSが提供するデータをコンテナに配布し、利用する場合に有用です。以下は、ホストOSが提供する/hostdir0001ディレクトリをDockerコンテナ内で利用する例です。まず、ホストOS側で、コンテナに提供するディレクトリを作成します。今回は、/hostdir0001ディレクトリをコンテナに提供するとします。

# mkdir /hostdir0001

ホストOSの/hostdir0001に、なにか適当なファイルを作成します。

# echo "Hello Docker" > /hostdir0001/testfile0001.txt

ホストOSの/hostdir0001をコンテナに提供します。以下は、ホストOSの/hostdir0001をコンテナ内の/root/ctdir0001として利用する設定例です。

# docker run -v /hostdir0001:/root/ctdir0001 -i -t centos:c66docker0001  /bin/bash

コンテナ内の/root/ctdir0001ディレクトリにホストOSが提供するファイルが存在するかどうかを確認します。

[root@95cbf518b30e /]# ls /root/ctdir0001/
testfile0001.txt
[root@95cbf518b30e /]# cat /root/ctdir0001/testfile0001.txt
Hello Docker
[root@95cbf518b30e /]#

コンテナ内で、ファイルを削除してみます。

[root@95cbf518b30e ctdir0001]# pwd
/root/ctdir0001
[root@95cbf518b30e ctdir0001]# rm -rf testfile0001.txt

別の端末で、ホストOS上の/hostdir0001ディレクトリ内のファイルが削除されているかを確認します。

# ls /hostdir0001/
#

ホストOSのディレクトリを書き込み不可でコンテナに見せる

ホストOSが提供する/hostdir0001を、コンテナに読み込みのみを許可し、書き込み不可の状態で提供するには、-vオプションで指定するコンテナのディレクトリ名の後に、「:ro」を付与します。

ホストOS上で動作テスト用のファイルを作成しておきます。

# echo "Hello Docker" > /hostdir0001/testfile0002.txt

ホストOSが提供する/hostdir0001を書き込み不可の状態で、コンテナc0001上の/root/ctdir0001として見せます。

# docker run  -v /hostdir0001:/root/ctdir0001:ro --name c0001 -i -t centos:c66docker0001 /bin/bash
[root@92aacd9af75f /]#

コンテナc0001上で、/root/ctdir0001ディレクトリに見えるtestfile0002.txtが読み込みのみ許可されており、書き込み不可になっているかどうかを確認します。

[root@92aacd9af75f /]# ls /root/ctdir0001/
testfile0002.txt

[root@92aacd9af75f /]# rm -rf /root/ctdir0001/testfile0002.txt
rm: cannot remove `/root/ctdir0001/testfile0002.txt': Read-only file system

[root@92aacd9af75f /]# echo "Hello Docker Docker" >> /root/ctdir0001/testfile0002.txt
bash: /root/ctdir0001/testfile0002.txt: Read-only file system
[root@92aacd9af75f /]#

上記より、ホストOSで提供される/hostdir0001がコンテナc0001内で/root/ctdir0001として見えていますが、削除も書き込みもできないことがわかります。

[root@92aacd9af75f /]# cat /root/ctdir0001/testfile0002.txt
Hello Docker
[root@92aacd9af75f /]#

コンテナがホストOSのどのディレクトリを利用できるのかを確認するには、ホストOS上でdockerコマンドにinspectを付与し、コンテナ名を指定します。出力結果の中の「Volumes」に利用可能なボリュームが出力されています。以下は、現在稼働中のコンテナc0001が利用可能なホストOSのボリュームを表示した例です。

ホストOS上の/hostdir0001ディレクトリが、コンテナc0001上の/root/ctdir0001ディレクトリとして、書き込み不可で利用可能であることがわかります。

# docker inspect c0001 |less
...
    "HostConfig": {
        "Binds": [
            "/hostdir0001:/root/ctdir0001:ro"
        ],
...
    "Mounts": [
        {
            "Source": "/hostdir0001",
            "Destination": "/root/ctdir0001",
            "Mode": "ro",
            "RW": false
        }
    ],
...

複数のコンテナで単一のデータ用ボリュームを共有する

複数のコンテナ間で一つのデータ用ボリュームを共有したい場合があります。以下では、コンテナc0001で作成した/data/vol0001ディレクトリにファイルを保存し、そのファイルを別のコンテナc0002からアクセスする例です。まず、Dockerイメージcentos:centos7.1.1503から、コンテナc0001を生成し、コンテナ上の共有ボリュームとなる/data/vol0001ディレクトリをコンテナc0001上で利用可能にします。

# docker run -i -t -v /data/vol0001 --name c0001 centos:centos7.1.1503 /bin/bash
[root@5e93d327df12 /]#

別の端末で、コンテナc0001が提供するボリューム/data/vol0001を共有するコンテナc0002を生成します。

# docker run -i -t --volumes-from c0001 --name c0002 centos:centos7.1.1503 /bin/bash
[root@95113b896ec9 /]#

コンテナc0001あるいはc0002の共有ボリューム/data/vol0001にファイルを作成し両方のコンテナからアクセスできるかを確認します。

[root@5e93d327df12 /]# echo "Hello Docker shared volume" > /data/vol0001/data0001.txt

コンテナc0001で共有ボリューム/data/vol0001上のファイルdata0001.txtの中身を確認しておきます。

[root@5e93d327df12 ~]# cat /data/vol0001/data0001.txt
Hello Docker shared volume
[root@5e93d327df12 ~]#

コンテナc0002でも同様に、data0001.txtの中身を確認します。

[root@95113b896ec9 ~]# cat /data/vol0001/data0001.txt
Hello Docker shared volume
[root@95113b896ec9 ~]#

共有可能なボリュームのファイルを書き込み不可で共有する場合は、「--volumes-from コンテナ名」の後に「:ro」を付与します。

# docker run -i -t --volumes-from c0001:ro --name c0002 centos:centos7.1.1503 /bin/bash
[root@631fd6032fd4 vol0001]# ls -l /data/vol0001/data0001.txt
-rw-r--r--. 1 root root 27 May 24 01:18 /data/vol0001/data0001.txt
[root@631fd6032fd4 vol0001]# rm -rf data0001.txt
rm: cannot remove 'data0001.txt': Read-only file system
[root@631fd6032fd4 vol0001]#

コンテナc0002からは書き込み不可になっていることがわかります。ただし、ボリュームを提供する側のコンテナc0001は、共有ボリュームのファイルへの更新や削除ができることに注意してください。

日本ヒューレット・パッカード株式会社 プリセールス統括本部 ソリューションセンター OSS・Linux担当 シニアITスペシャリスト

兵庫県伊丹市出身。1996年頃からオープンソースに携わる。2000年よりUNIXサーバーのSE及びスーパーコンピューターの並列計算プログラミング講師を担当。科学技術計算サーバーのSI経験も持つ。2005年、大手製造業向けLinuxサーバー提案で日本HP社長賞受賞。2006年、米国HPからLinux技術の伝道師に与えられる「OpenSource and Linux Ambassador Hall of Fame」を2年連続受賞。日本HPプリセールスMVPを4度受賞。現在は、Linux、FreeBSD、Hadoop等のOSSを駆使したスケールアウト型サーバー基盤のプリセールスSE、技術検証、技術文書執筆を担当。日本HPのオープンソース・Linuxテクノロジーエバンジェリストとして講演活動も行っている。Red Hat Certified Engineer、Red Hat Certified Virtualization Administrator、Novell Certified Linux Professional、EXIN Cloud Computing Foundation Certificate、HP Accredited Systems Engineer Cloud Architect、Red Hat Certified System Administrator in Red Hat OpenStack、Cloudera Certified Administrator for Apache Hadoop認定技術者。HP公式ブログ執筆者。趣味はレーシングカートとビリヤード

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています