ホストOSのディレクトリをDockerコンテナと共有する

アプリ基盤って一度構築するとそれをドキュメントにしないと忘れてしまうのを何とかしたいと思いつつ、今回も昔まとめた手順をUPします。

ホストOSのディレクトリをコンテナと共有する方法です。

今回簡単にコマンド検証するためにVagrantにCentOS7を入れてDcokerをインストールしている環境を前提にしています。
ホストOSはvagrantユーザで実行している前提とします。

ホストOSで共有するディレクトリを作成

rootにスイッチしてディレクトリを作成する。パスワードは変更していなければvagrantと同じだが変更している場合、変更後のパスワードでsuすること。


su -
cd /
mkdir -p /data/docshare
cd /data
chown vagrant:wheel docshare
exit

共有するディレクトリに適当にファイルを作成


cd /data/docshare
echo "Hello World" > hello.txt
ls -l

OSのディレクトリをコンテナと共有

コンテナ起動時に-vオプションでホストOSのディレクトリとコンテナ側のマウントポイントを設定します。今回はあえて--hostnameでホスト名も指定していますがディレクトリ共有にこの設定は必要はありません。


docker run -it -d -v /data/docshare:/docshare --name testsrv --hostname testsrv centos:centos7 /bin/bash
docker attach testsrv
ls -l /
bin dev docshare etc ...
cd docshare
cat hello.txt

コンテナ上でファイルに書き込みを行ったりするとホストOS側でも変更を確認できると思います。
ちなみに書き込み不可にする場合は、コンテナ側のマウントポイントの後に:roと指定すればいいです。


docker run -it -d -v /data/docshare:/docshare:ro --name testsrv --hostname testsrv centos:centos7 /bin/bash

余談

少し話がそれますがコンテナ間でボリュームの共有をしたい場合もあると思います。
そういった場合、まずコンテナAを起動するときに/data/shareというボリュームを設定します。


docker run -it -d -v /data/share --name test01 centos:centos7 /bin/bash

コンテナBでは共有したいボリュームを設定しているコンテナ名を--volumes-fromオプションで指定すれば共有できます。


docker run -it -d --volumes-from test01 --name test02 centos:centos7 /bin/bash

コンテナB側で読み込み専用にしたい場合はコンテナ名の後に:roを指定すればOKです。