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

f:id:j74th:20150717223924p:plain

CentOSをインストールする

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

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

f:id:j74th:20150717223530p:plain

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

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

f:id:j74th:20150717224003p:plain

MacNFSサーバを立てる

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

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

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

sudo vi /etc/exports
/Volumes/HDD/docker -mapall=501:20 192.168.56.10

501:20は、NFSで接続した時に書き込むユーザIDとグループID。192.168.56.10は接続を許可するIPアドレスになる。 設定を反映させる。

sudo nfsd update

CentOSMacNFSをマウントする

まず、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