Debian jessie 導入したdocker daemon へ Macのdocker-machieからアクセスする

やってみたら、ダラダラ面倒だったので、メモ

デフォルトで導入したままだと、unix socketでしかlistenしていないのでtcpでもlistenするようにする.
tcpでlistenする際、sslでの認証が必要になるので、ssl証明書やら、キーも作成する.
(といっても公式やらに書いていることやるだけ)

SSL証明書やらの作成

認証局の秘密キーと公開キーを作成

[認証局秘密キー ca-key.pem]
$openssl genrsa -aes256 -out ca-key.pem 4096
(パスフレーズの問い合わせがあるので、入力)
[認証局公開キー(証明書) ca.pem]
$openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
(認証局秘密キーのパスフレーズ入力)
(Common Name の入力で、ホストのFQDNを入力)

サーバ鍵と証明書署名要求の作成

[サーバ鍵 server-key.pem]
$openssl genrsa -out server-key.pem 4096
[証明書署名要求 server.csr]
$openssl req -subj "/CN=$HOST" -sha256 -new -key server-key.pem -out server.csr
($HOSTは、対象のFQDN)
[証明書の追加情報 extfile.cnf]
$echo subjectAltName = IP:www.xxx.yyy.zzz,IP:127.0.0.1 > extfile.cnf
(www.xxx.yyy.zzzは対象のIPアドレス)

サーバ証明書の作成

[認証局署名付きサーバ証明書 server-cert.pem]
$openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem ¥
  -CAcreateserial -out server-cert.pem -extfile extfile.cnf
(出力メッセージのsubject=/CN=FQDN が証明書署名要求で使ったFQDNになっていることを確認)
(認証局秘密キーのパスフレーズの問い合わせがあるので入力)

クライアント鍵と証明書署名要求の作成(docker-machine側で使用)

[クライアント鍵 key.pem]
$openssl genrsa -out key.pem 4096
[証明書署名要求 client.csr]
$openssl req -subj '/CN=client' -new -key key.pem -out client.csr
[クライアント認証用の追加設定ファイル extfile.cnf]
$echo extendedKeyUsage = clientAuth > extfile.cnf

認証局署名付きクライアント証明書の作成

[認証局署名付きクライアント証明書 cert.pem]
$openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem ¥
  -CAcreateserial -out cert.pem -extfile extfile.cnf
(認証局秘密キーのパスフレーズの問い合わせがあるので入力)

証明書署名要求ファイルは必要なくなったので、削除。

$rm -v client.csr server.csr extfile.cnf

鍵を本人しか触れないようにパーミッション変更

$chmod -v 400 ca-key.pem key.pem server-key.pem

証明書は変更できないように書き込み権限を落としておく

$chmod -v 0444 ca.pem server-cert.pem cert.pem

Debian(Docker-engine)側の設定変更

作成したサーバ鍵、証明書、認証局証明書を/etc/docker以下に移動

$mv ca.pem server-cert.pem server-key.pem /etc/docker/

dockerデーモンの起動設定はsystemdで制御されているので,デフォルト設定ファイル/lib/systemd/system/docker.serviceを/etc/systemd/system/以下にコピーしてから編集

$cp /lib/systemd/system/docker.service /etc/systemd/system/
[変更前]
ExecStart=/usr/bin/dockerd -H fd://
[変更後]
ExecStart=/usr/bin/dockerd ¥
 --tlsverify ¥
 --tlscacert=/etc/docker/ca.pem ¥
 --tlscert=/etc/docker/server-cert.pem ¥
 --tlskey=/etc/docker/server-key.pem ¥
 -H fd:// ¥
 -H tcp://0.0.0.0:2376
[変更前]
ExecStart=/usr/bin/docker -H fd://
[変更後]
ExecStart=/usr/bin/docker ¥
  --tlsverify ¥
  --tlscacert=/etc/docker/ca.pem ¥
  --tlscert=/etc/docker/server-cert.pem ¥
  --tlskey=/etc/docker/server-key.pem ¥
  -H fd://

/etc/systemd/system/docker-tcp.socket を以下の内容で作成

[Unit]
Description=Docker Soccer for the API

[Socket]
ListenStream=2376
BindIPv6Only=both
Service=docker.service

[Install]
WantedBy=socket.target

(2017.02.06 更新)

systemdに設定の変更を教え込んで、デーモン再起動

$systemctl daemon-reload
$systemctl stop docker
$systemctl enable docker-tcp.socket
$systemctl start docker-tcp.socket
$systemctl start docker

Debian側、これにて終了。続いてMac(Docker-machine)側

Mac(Docker-machine)側の設定

docker-machineに新規マシン登録

$docker-machine create -d "none" --url tcp://www.xxx.yyy.zzz:2376 DOCKER_HOST
 (www.xxx.yyy.zzzはdebianのIPアドレス)
 ($DOCKER_HOSTはdocker-machineに登録する名前)

~/.docker/machine/machines/以下にDOCKER_HOSTなディレクトリが作成され、設定ファイル config.jsonが生成されているので、とりまディレクトリに移動

$cd ~/.docker/machine/machines/DOCKER_HOST

先に生成したクライアント秘密キー, 証明書,認証局証明書(key.pem, cert.pem, ca.pem)を何とかして、ここにコピー

docker-machineがコピーしたファイルを見るようにconfig.jsonを変更

"AuthOptions": {
  "CertDir": "/Users/hogehoge/.docker/machine/certs",
  "CaCertPath": "/Users/hogehoge/.docker/machine/machines/DOCKER_HOST/ca.pem",
  "CaPrivateKeyPath": "",
  "CaCertRemotePath": "",
  "SeverCertPath": "",
  "ServerKeyPath": "",
  "ServerCertRemotePath": "",
  "ServerKeyRemotePath": "",
  "ServerCertSANS": [],
  "ClientKeyPath": "/Users/hogehoge/.docker/machine/machines/DOCKER_HOST/key.pem",
  "ClientCertPath": "/Users/hogehoge/.docker/machine/machines/DOCKER_HOST/cert.pem",
  "StorePath": "/Users/hogehoge/.docker/machine/machines/DOCKER_HOST"
}

docker-machine ls とかして、接続できているか、確認

$docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
DOCKER_HOST - none Running tcp://www.xxx.yyy.zzz:2376 v1.13.0

バージョンが表示されていれば、とりま動作しているかと思われる。
そして、息切れ。以上。