Docker上 で samba を動かしてファイル共有する

[続き](http://qiita.com/flny/items/7b55acc571a5fe129db1)

# Docker上で samba を動かす
ZFSのファイルシステムは NFS または SMB(CIFS)で共有することができます。ただし、on Linux では別途 nfs-kernel-serverやsambaをインストールする必要があるため[^1] 今回はZFSを通じて共有するのではなく、Docker上でsambaを動かしてSMB共有してみます。

## Docker をインストールする
最初に[公式ドキュメント](http://docs.docker.com/v1.8/installation/ubuntulinux/)に従ってDockerをインストールします。14.04なので前準備(Prerequisites)は不要だそうです。

```
$ curl -sSL https://get.docker.com/ | sh
apparmor is enabled in the kernel and apparmor utils were already installed
+ sudo -E sh -c apt-key adv --keyserver ...
(略)
+ sudo -E sh -c docker version
Client:
 Version:      1.9.0
 API version:  1.21
 Go version:   go1.4.2
 Git commit:   76d6bc9
 Built:        Tue Nov  3 17:43:42 UTC 2015
 OS/Arch:      linux/amd64

Server:
 Version:      1.9.0
 API version:  1.21
 Go version:   go1.4.2
 Git commit:   76d6bc9
 Built:        Tue Nov  3 17:43:42 UTC 2015
 OS/Arch:      linux/amd64

If you would like to use Docker as a non-root user, you should now consider
adding your user to the "docker" group with something like:

  sudo usermod -aG docker hoge

Remember that you will have to log out and back in for this to take effect!
```
てっきり1.8がインストールされると思っていたら1.9でした。
テスト実行してみます。

```
$ sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b901d36b6f2f: Pull complete
0a6ba66e537a: Pull complete
Digest: sha256:8be990ef2aeb16dbcb9271ddfe2610fa6658d13f6dfb8bc72074cc1ca36966a7
Status: Downloaded newer image for hello-world:latest

Hello from Docker.
This message shows that your installation appears to be working correctly.
...
(略)
```
インストールできているようです。簡単で助かる！
次に 自身のユーザアカウントを dockerグループに加えることで、sudoなしでdockerを実行できるようにします。

```
$ sudo usermod -aG docker hoge
```
hogeがユーザ名です。このとき -aG でなく -G としてしまうと[大変なことになる](http://tyru.hatenablog.com/entry/20110726/usermod)そうなので注意します。

ログアウト、再ログイン後に 今度はsudoなしで動作確認します

```
$ docker run hello-world

Hello from Docker.
This message shows that your installation appears to be working correctly.
(略)
```
問題ないようです。

## Dockerイメージを探す
Dockerイメージを自分で構成するのは sambaでない他のサービスを動かすときに試すこととして、今回は公式の[Docker Hub](https://hub.docker.com/)で既存イメージを探して、それを利用してみます。

1. 右上の検索ボックスでsambaを[検索](https://hub.docker.com/search/?q=samba&page=1&isAutomated=0&isOfficial=0&starCount=0&pullCount=0)
![クリップボード.png](https://qiita-image-store.s3.amazonaws.com/0/87156/f5d8a3f7-4f16-7a32-c694-387400970379.png)

2. Starsを選択：Starが多い順に検索結果を[表示](https://hub.docker.com/search/?q=samba&page=1&isAutomated=0&isOfficial=0&pullCount=0&starCount=1)
3. 上から順にいくつか見ていき、Full Description の記述がわかりやすかった[dperson/samba](https://hub.docker.com/r/dperson/samba/) に決定！

## 共有用のファイルシステムを作成する
前準備として、共有用のファイルシステムtank/pubを作成し、/mnt/pub にマウントします。また、dperson/samba から書き込み可能にするため /mnt/pubの所有者をdockerを実行するユーザに変えます。

```
$ sudo zfs create tank/pub
$ sudo zfs set atime=off tank/pub
$ sudo zfs set mountpoint=/mnt/pub tank/pub
$ sudo chown hoge /mnt/pub
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        94G  1.5G   92G   2% /
(略)
tank/home       1.3T  128K  1.3T   1% /home
tank/pub        1.3T  128K  1.3T   1% /mnt/pub
$ ll /mnt
total 16
drwxr-xr-x  3 root    root   16 Nov 12 01:14 ./
drwxr-xr-x 21 root    root 4096 Nov 13 19:33 ../
drwxr-xr-x  2 hoge    root    6 Nov 13 20:56 pub/
```

## dperson/samba を起動する
いよいよDockerで dperson/samba を起動します。docker run のオプションは[こちら](http://qiita.com/voluntas/items/68c1fd04dd3d507d4083)を参考にさせて頂きました。
パラメータ中の dperson/samba より後のオプション -s と -u については dperson/samba の[Configuration](https://hub.docker.com/r/dperson/samba/)に説明があります。普段ならsmb.confに記述する内容を、-s と -u で指定する感じです。

```
$ docker run --name samba -p 139:139 -p 445:445 -v /mnt/pub:/mnt/pub -d dperson/samba -s "pub;/mnt/pub;no;no;no;foo" -u "foo;bar"
Unable to find image 'dperson/samba:latest' locally
latest: Pulling from dperson/samba
a719479f5894: Pull complete
91bac885982d: Pull complete
69865d53ad81: Pull complete
52390241cd86: Pull complete
c7005920b097: Pull complete
26ee48a2628d: Pull complete
ffc195f7d642: Pull complete
bf2b48e20c44: Pull complete
Digest: sha256:19aeb4df3ee0a81095c5f2006b916af08abcc143540f9cd595f3839b3d77343a
Status: Downloaded newer image for dperson/samba:latest
0cf58b5f4d1ba117b94a0533c43cca55c9f40b90f8f5523633bb90d23b15a07c
```
dperson/sambaはローカルにないのでpull(ダウンロード)が始まります。10秒程度待ったら起動した(ように見える)のですが 本当にうまくいったのか…?

別の環境から共有してみます。192.168.0.10は、Docker/sambaを動かしている環境のIPアドレスです。

```
$ sudo mount -t cifs -o username=foo,password=bar,iocharset=utf8 //192.168.0.10/pub /media/nas
```
あっさりマウントできた！
今度はファイルを置いてみます。

```
$ echo aaa > /media/nas/test.txt
$ cat /media/nas/test.txt
aaa
```
置けました！pull含めて10秒程度で本当に立ち上がるとはびっくりです。

## dperson/samba を停止・削除する
起動がうまくいったので コンテナを停止・削除してみます。

```
$ docker stop samba && docker rm samba
samba
samba
```

コンテナは消えましたが、先ほど置いたファイル(test.txt)は /mnt/pub/ に残っているはずなので、確認します。

```
$ ll /mnt/pub
(略)
-rw-rw-r-- 1 hoge     users  4 Nov 13 22:24 test.txt
```

夢じゃなかったようです。

[続く]()

[^1]: 本家Solaris版ではZFS単体で共有ができるようです