docker-machine-nfsでOSXのディレクトリをマウントする

  • 31
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

インストールと使い方のまとめ

adlogix/docker-machine-nfs: Activates NFS on docker-machineのREADMEの通りにインストールします。

まず、docker-machineが再起動されてもよいように適宜準備します。
次に、OSX上にマウントしたいディレクトリを作成して、以下のように実行します。内部でsudoを使っているのでパスワードプロンプトが表示されたらパスワードを入力してください。

docker-machine-nfs default --shared-folder=マウントしたいディレクトリ

これでdocker-machine上にも同じディレクトリ名のところにマウントされます。docker-machineを再起動してもマウントされるようになっています。

以下は調査メモ

dinghy試してみた

OSXでDockerを超高速化するdinghy - Qiitaを読んで試してみたのですが、個人的にはあまり好きになれませんでした。

  • dnghyをインストールするとHomebrewでUNFS3とdnsmasqがインストールされる。
    • システムのNFSサーバ使ってくれればいいのに。
  • docker-machineコマンドではなくdinghyコマンドを使う必要があってコマンド体系が違う。
    • 独自のコマンド覚えたり、それに慣れてしまうのは避けたい。

docker-machine-nfsを発見

私はオールインワン的なツールより単機能のツールのほうが好きなので、NFSマウントだけできるのが欲しいなあと思って nfs share / guest to host · Issue #64 · boot2docker/boot2docker を見ていたら、adlogix/docker-machine-nfs: Activates NFS on docker-machineというのが紹介されていました。

docker-machine-nfsの使い方

インストールはREADMEに書いてあるコマンドを実行すればOKです。インストールと言ってもシェルスクリプトをダウンロードして実行権限をつけるだけです。

マウントの設定は以下のような感じで実行します。実行するとdocker machineが再起動されますので、再起動しても大丈夫なときに実行するようにしてください。

docker-machine-nfs default --shared-folder=/Users/hnakamur/www

Docker Toolboxを使っているとdocker machineの名前は default なのでそれを docker-machine-nfs の後に指定しています。

マウントしたいOSX上のディレクトリを --shared-folder で指定します。ディレクトリは予め作成しておく必要があります。 --shared-folder を省略すると /Users が使われます。

docker-machine-nfsの329〜341行目/etc/exports を編集して nfsd を再起動しています。 sudo を使用しているのでパスワード入力のプロンプトが表示されたらパスワードを入力してください。

注意: マウントするディレクトリは他と重ならないようにする必要があります

私はVagrantでもNFSを使っていたので、 /etc/exports に既にエントリがありました。その状態で最初 docker-machine-nfs default を試したら以下のようなエラーが出ました。

exports:8: /Users conflicts with existing export /Users/hnakamur/ghq/github.com/trafficserver-doc-ja/trafficserver

既に /etc/exports に書かれていた /Users/hnakamur/ghq/github.com/trafficserver-doc-ja/trafficserver/Users が重なっているのが問題でした。

そこで、重ならないような /Users/hnakamur/www というディレクトリを作成して docker-machine-nfs default --shared-folder=/Users/hnakamur/www のようにすると今度は成功しました。

実行後の /etc/exports を見ると以下のようになっていました。Vagrantで追加されたエントリの後に docker-machine-nfs で追加されたエントリがあります。

# VAGRANT-BEGIN: 501 682cdb7f-68fb-41ea-9743-be140901401c
"/Users/hnakamur/ghq/github.com/trafficserver-doc-ja/trafficserver" 192.168.100.23 -alldirs -mapall=501:20
# VAGRANT-END: 501 682cdb7f-68fb-41ea-9743-be140901401c
# VAGRANT-BEGIN: 501 68f51887-2015-4f49-9676-7c58a7d5d07e
"/Users/hnakamur/ghq/github.com/hnakamur/trafficserver" 192.168.100.23 -alldirs -mapall=501:20
# VAGRANT-END: 501 68f51887-2015-4f49-9676-7c58a7d5d07e

/Users/hnakamur/www 192.168.99.100 -alldirs -mapall=501:20

docker-machine側に生成された設定を確認

docker-machine ssh

で docker-machine に入って df -h を実行してみました。

docker@default:~$ df -h
Filesystem                Size      Used Available Use% Mounted on
tmpfs                     1.8G    129.4M      1.6G   7% /
tmpfs                  1001.3M         0   1001.3M   0% /dev/shm
/dev/sda1                18.2G      4.0G     13.3G  23% /mnt/sda1
cgroup                 1001.3M         0   1001.3M   0% /sys/fs/cgroup
/dev/sda1                18.2G      4.0G     13.3G  23% /mnt/sda1/var/lib/docker/aufs
192.168.99.1:/Users/hnakamur/www
                        391.2G    156.9G    234.1G  40% /Users/hnakamur/www

OSXの /Users/hnakamur/www が docker-machine の /Users/hnakamur/www にマウントされています。

docker-machine-nfs.shの358〜382行目でマウントするためのシェルスクリプト /var/lib/boot2docker/bootlocal.sh を生成しています。

実際に生成されたスクリプトは以下のようになっていました。

/var/lib/boot2docker/bootlocal.sh
#!/bin/sh
  sudo umount /Users
    sudo mkdir -p /Users/hnakamur/www
  sudo /usr/local/etc/init.d/nfs-client start
    sudo mount -t nfs -o noacl,async 192.168.99.1:/Users/hnakamur/www /Users/hnakamur/www

もしdocker-machine側では違うディレクトリにしたい場合はdocker-machine-nfs.shの358〜382行目のあたりとコマンドライン引数を受け取るあたりを改修する必要があります。

とりあえずは改修せずにそのまま使ってみようかなと思いました。

参考: dinghyのファイル変更検知はfsevents_to_vmというrubygemを使っていた

dinghy create --provider virtualbox を実行した時の出力を見ると、dinghyのファイル変更検知はfsevents_to_vmというrubygemを使っていました。

$ dinghy create --provider virtualbox
Creating the dinghy VM...
Stopping "dinghy"...
Machine "dinghy" was stopped.
Starting NFS daemon, this will require sudo
Password:
Waiting for NFS daemon...
Mounting NFS /Users/hnakamur
Installing fsevents_to_vm, this will require sudo
Fetching: rb-fsevent-0.9.7.gem (100%)
Successfully installed rb-fsevent-0.9.7
Fetching: thor-0.19.1.gem (100%)
Successfully installed thor-0.19.1
Fetching: net-ssh-2.9.4.gem (100%)
Successfully installed net-ssh-2.9.4
Fetching: fsevents_to_vm-1.1.1.gem (100%)
Successfully installed fsevents_to_vm-1.1.1
4 gems installed
Starting the FsEvents daemon
setting up DNS resolution, this will require sudo
Starting the DNS daemon
Starting the HTTP proxy