Netshare Pluginを使うとDockerコンテナにNFSボリュームをマウントすることができます。このプラグインを使えると様々な用途(特にDocker Swarm上)で活用できそうなので、以下に手順を残しておきます。
Vagrantでテスト用の環境を作る
vagrant init ubuntu/trusty64
sed -i -e "s/.*192.168.33.10.*/ config.vm.network \"private_network\", ip: \"192.168.33.10\"/" Vagrantfile
vagrant up
vagrant ssh
NOTE: この例では192.168.33.10というアドレスを使ってNFSボリュームをシェアする環境を作ります。また、手順を短くするためにNFSサーバーもDockerも同じVMにインストールすることにします。
Docker EngineとNFSサーバーをインストールする
# Dockerをインストールします
curl -fsSL https://get.docker.com/ | sh
# NFSサーバーをインストールして/exportsというディレクトリをシェアする設定を加えます
sudo -i
aptitude install nfs-server
mkdir /exports
echo "/exports 192.168.33.0/24(rw,sync,no_subtree_check,no_root_squash)" >> /etc/exports
/etc/init.d/nfs-kernel-server start
Netshare PluginをインストールしてコンテナにNFSボリュームをマウントする
# Netshare Pluginをインストールします
wget https://github.com/gondor/docker-volume-netshare/releases/download/v0.16/docker-volume-netshare_0.16_amd64.deb
dpkg -i docker-volume-netshare_0.16_amd64.deb
service docker-volume-netshare start
# コンテナを作ってNFSボリュームをマウントします
docker run --rm --volume-driver=nfs -v 192.168.33.10/exports:/mount -it ubuntu
# 確認します
root@934060cad02a:/# touch /mount/file1
root@934060cad02a:/# touch /mount/file2
root@934060cad02a:/# exit
ls /exports
file1 file2
NOTE:
touch /mount/file1
がハングする場合はVMをreboot
してからもう一度試してみてください。その場合はservice docker-volume-netshare start
をお忘れなく。。。
また、もちろんのことですが、下記のようにサブディレクトリをマウントすることもできます。
mkdir /exports/server1
docker run --rm --volume-driver=nfs -v 192.168.33.10/exports/server1:/mount -it ubuntu
root@72ac425831d1:/# touch /mount/test1
root@72ac425831d1:/# exit
root@vagrant-ubuntu-trusty-64:~# ls /exports/server1
test1
また、Netshare PluginはAWS EFSやCIFSもマウントできるようなので、ご興味のある方は下記リンクへどうぞ。