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

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

[adlogix/docker-machine-nfs: Activates NFS on docker-machine](https://github.com/adlogix/docker-machine-nfs)のREADMEの通りにインストールします。

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

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

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

## 以下は調査メモ

### dinghy試してみた
[OSXでDockerを超高速化するdinghy - Qiita](http://qiita.com/masuidrive/items/d71ee1881fffb6ad098f#comment-c4e287188bfd3bff360e)を読んで試してみたのですが、個人的にはあまり好きになれませんでした。

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

### docker-machine-nfsを発見

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

### 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行目](https://github.com/adlogix/docker-machine-nfs/blob/d0291e9c087e1d108e480022bec1c17bb60e9041/docker-machine-nfs.sh#L329-L341) で `/etc/exports` を編集して `nfsd` を再起動しています。 `sudo` を使用しているのでパスワード入力のプロンプトが表示されたらパスワードを入力してください。

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

私は[Vagrant](https://www.vagrantup.com/)でも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行目](https://github.com/adlogix/docker-machine-nfs/blob/d0291e9c087e1d108e480022bec1c17bb60e9041/docker-machine-nfs.sh#L358-L382)でマウントするためのシェルスクリプト `/var/lib/boot2docker/bootlocal.sh` を生成しています。

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

```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行目](https://github.com/adlogix/docker-machine-nfs/blob/d0291e9c087e1d108e480022bec1c17bb60e9041/docker-machine-nfs.sh#L358-L382)のあたりとコマンドライン引数を受け取るあたりを改修する必要があります。

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

### 参考: 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
```