boot2dockerを止めて、Macでも-vでまともに使えるようにする

boot2dockerをMacで使うと、boot2dockerの仮想マシンとMacのディレクトリのマウントは、VirtualBoxの共有ディレクトリ機能を使って行われる。この機能により、Macのローカルディレクトリを-vでマウントできるように思えるが、書き込み権限がうまく割り当てられず、結局使えないことになってしまう。

この共有ディレクトリでのマウントを止めて、NFSで仮想マシンからマウントするようにする。なお、仮想マシンにはCentOS7を利用する。

### VirtualBoxでホストオンリーネットワークを構築する

VirutalBoxの環境設定→ネットワーク→ホストオンリーネットワーク にて、例えば以下の様な設定を行っておく。

* IPv4アドレス:192.168.56.1
* IPv4ネットマスク:255.255.255.0
* IPv6アドレス:
* IPv6ネットマスク長:0

![スクリーンショット 2015-07-17 22.38.56.png](https://qiita-image-store.s3.amazonaws.com/0/3413/48a8c004-73c3-fc60-f01c-630d95b280db.png)


### CentOSをインストールする

VirtualBoxで新規仮想マシンを作る。この時、ネットワークを以下のようにする。

* アダプター1
  * 割り当て:ブリッジアダプター or NAT
* アダプター2
  * 割り当て:ホストオンリーアダプター

![スクリーンショット 2015-07-12 18.10.36.png](https://qiita-image-store.s3.amazonaws.com/0/3413/da0687b8-752d-5f3d-233e-6297cc2f1db0.png)

アダプター1はインターネットアクセス用、アダプター2はNFS共有用になる。

CentOSをインストール後、ネットワークの設定をする。最近はnmtuiコマンドが便利である。
アダプター2に相当する方で、固定IPを割り振る。ここでは、192.168.56.10とする。

![スクリーンショット 2015-07-12 18.11.57.png](https://qiita-image-store.s3.amazonaws.com/0/3413/96b5c3c0-1c59-7396-14cf-68a54771af61.png)


### MacでNFSサーバを立てる

OSの機能でNFSサーバを立てる機能がある。

https://support.apple.com/ja-jp/HT202243

例えば、/Volumes/HDD/docker をマウントさせる場合には、/etc/exportsに以下のように記述する。

```
sudo vi /etc/exports
/Volumes/HDD/docker -maproot=0:0 192.168.56.10
```

root権限与えちゃうけど、ローカルなのでよしとする。192.168.56.10は接続を許可するIPアドレスになる。
設定を反映させる。

```
sudo nfsd update
```

### CentOSでMacのNFSをマウントする

まず、NFSをインストールする

```
sudo yum install -y nfs-utils
sudo systemctl start rpcbind 
sudo systemctl enable rpcbind 
```

fstabに、マウントする設定を追加する。マウント先は/var/dockerとする。

```
sudo vi /etc/fstab
192.168.56.1:/Volumes/HDD/docker /var/docker nfs defaults 0 0
```

再起動を行って、自動的にマウントできているか確認する。

```
sudo reboot
```

```
sudo df
ファイルシス                     1K-ブロック      使用    使用可 使用% マウント位置
/dev/mapper/centos-root              8869888   2479184   6390704   28% /
devtmpfs                              933048         0    933048    0% /dev
tmpfs                                 942244         0    942244    0% /dev/shm
tmpfs                                 942244      8604    933640    1% /run
tmpfs                                 942244         0    942244    0% /sys/fs/cgroup
/dev/sda1                             508588    163692    344896   33% /boot
192.168.56.1:/Volumes/HDD/docker   476899584 153891776 323007808   33% /var/docker
```

### dockerのインストール

公式の設定に従い、dockerをインストールする。

https://docs.docker.com/installation/centos/

```
sudo yum update
curl -O -sSL https://get.docker.com/rpm/1.7.1/centos-6/RPMS/x86_64/docker-engine-1.7.1-1.el6.x86_64.rpm
sudo yum localinstall --nogpgcheck docker-engine-1.7.1-1.el6.x86_64.rpm
```

### dockerをSSL認証に変更する

通常のdockerのインストールでは、pid経由のアクセスになるため、逐一CentOSにログインしなければならなくなる。これをSSL認証を使った方法に変更する。

docker公式に書いてあるように実施する。

https://docs.docker.com/articles/https/

CAの秘密鍵と、証明書を作る。

```
mkdir dockercert
openssl genrsa -aes256 -out ca-key.pem 2048
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
```

dockerサーバの秘密鍵を作り、それをCAに証明書を発行させる。

```
openssl genrsa -out server-key.pem 2048
openssl req -subj "/CN=dockerserver" -new -key server-key.pem
echo subjectAltName = IP:192.168.56.10,IP:127.0.0.1 > extfile.cnf
openssl x509 -req -days 365 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf
```

クライアントの秘密鍵を作り、それをCAに証明書を発行させる。

```
openssl genrsa -out key.pem 2048
openssl req -subj '/CN=client' -new -key key.pem -out client.csr
echo extendedKeyUsage = clientAuth > extfile.cnf
openssl x509 -req -days 365 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf
```

dockerサーバで必要なものを移動する。

```
sudo cp ca.pem /etc/docker/
sudo cp server-key.pem /etc/docker/
sudo cp server-cert.pem /etc/docker/
```

dockerサービスの起動引数を変更する。

```
sudo vi /etc/sysconfig/docker
other_args=" --tlsverify --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/server-cert.pem --tlskey=/etc/docker/server-key.pem -H=tcp://0.0.0.0:2376"
```

dockerサービスを起動する。

```
sudo systemctl start docker
```

一応、CentOS内でdockerコマンドが使えるか確認する。

```
mkdir ~/.docker
cp ca.pem ~/.docker/
cp key.pem ~/.docker/
cp cert.pem ~/.docker/
export DOCKER_HOST=tcp://127.0.0.1:2376
export DOCKER_TLS_VERIFY=1
```

```
docker version
Client version: 1.7.0
Client API version: 1.19
Go version (client): go1.4.2
Git commit (client): 0baf609
OS/Arch (client): linux/amd64
Server version: 1.7.0
Server API version: 1.19
Go version (server): go1.4.2
Git commit (server): 0baf609
OS/Arch (server): linux/amd64
```

### Macでdockerコマンドが使えるか確認する。

CentOS内で、~/.docker/内に格納したものを、Macに持ってきて、Macの~/.docker/に置く。

CentOS
```
sudo cp ca.pem /var/docker/
sudo cp key.pem /var/docker/
sudo cp cert.pem /var/docker/
```

MacOS
```
mkdir ~/.docker
cp /Volumes/HDD/docker/ca.pem ~/.docker/
cp /Volumes/HDD/docker/key.pem ~/.docker/
cp /Volumes/HDD/docker/cert.pem ~/.docker/
export DOCKER_HOST=tcp://192.168.56.10:2376
export DOCKER_TLS_VERIFY=1
```

```
docker version
Client version: 1.7.0
Client API version: 1.19
Go version (client): go1.4.2
Git commit (client): 0baf609
OS/Arch (client): darwin/amd64
Server version: 1.7.0
Server API version: 1.19
Go version (server): go1.4.2
Git commit (server): 0baf609
OS/Arch (server): linux/amd64
```

### 試しにjenkinsでも起動してみる

```
mkdir /Volumes/HDD/docker/jenkins
docker run -p 8080:8080 -v /var/docker/jenkins:/var/jenkins_home jenkins
```

### dockerコンテナ内でインターネットに接続できない時

dockerコンテナ内で、ネットワークに接続できない時、dockerの内部ネットワークのgatewayがNFS用の内部ネットワークになっている可能性がある。

```
nmtui
```

で、docker0というネットワークの設定を変更し、gatewayをNFSではないネットワークの方にする。