boot2dockerをMacで使うと、boot2dockerの仮想マシンとMacのディレクトリのマウントは、VirtualBoxの共有ディレクトリ機能を使って行われる。この機能により、Macのローカルディレクトリを-vでマウントできるように思えるが、書き込み権限がうまく割り当てられず、結局使えないことになってしまう。
この共有ディレクトリでのマウントを止めて、NFSで仮想マシンからマウントするようにする。なお、仮想マシンにはCentOS7を利用する。
VirtualBoxでホストオンリーネットワークを構築する
VirutalBoxの環境設定→ネットワーク→ホストオンリーネットワーク にて、例えば以下の様な設定を行っておく。
CentOSをインストールする
VirtualBoxで新規仮想マシンを作る。この時、ネットワークを以下のようにする。
- アダプター1
- 割り当て:ブリッジアダプター or NAT
- アダプター2
- 割り当て:ホストオンリーアダプター
アダプター1はインターネットアクセス用、アダプター2はNFS共有用になる。
CentOSをインストール後、ネットワークの設定をする。最近はnmtuiコマンドが便利である。 アダプター2に相当する方で、固定IPを割り振る。ここでは、192.168.56.10とする。
MacでNFSサーバを立てる
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
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/に置く。
sudo cp ca.pem /var/docker/ sudo cp key.pem /var/docker/ sudo cp cert.pem /var/docker/
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