Friday, November 14, 2014

Docker remote API

とある事情からDockerデーモン内で発生したイベントをストリームで取得したいと思ったら、remote APIとかいう便利なものがあったので触ってみた。

ホストはOSXでboot2dockerを使っている。

いつからか分からないが、最新版のboot2dockerだとゲストマシンで起動するdockerデーモンがremote APIを受け付けるオプション付きで動いている模様。

 1055 root     /usr/local/bin/docker -d -D -g /var/lib/docker -H unix:// -H tcp://0.0.0.0:2376 --tlsverify --tlscacert=/var/lib/boot2docker/tls/ca.pem --tlscert=/var/lib/boot2docker/tls/server.pem --tlskey=/var/lib/boot2docker/tls/serverkey.pem

curlを使ってアクセスできるようなので、ホストマシン側からテストがてらGET images/jsonを叩いてみる。

yukaarybox:~ yukaary$ curl --insecure --cert $DOCKER_CERT_PATH/cert.pem --key $DOCKER_CERT_PATH/key.pem https://192.168.59.103:2376/images/json
curl: (35) Unknown SSL protocol error in connection to 192.168.59.103:-9825

なんと…。繋がらないので色々調べてたらOSX版curlのバグじゃない?って話題が上がっている。Certificate Authentication Fails

ちなみにboot2docker sshして同じ意味のコマンドを打つと、結果が返ってくる。

docker@boot2docker:~$ curl --insecure --cert ~/.docker/cert.pem --key ~/.docker/
key.pem https://boot2docker:2376/images/json
[{"Created":1414247260,"Id":"806930947ad909768835b8311a061e630ee95e7cb0d3420ec2c815abd21182f1","ParentId":"4271258c1b3fc4f96e8d7ddbf2893ff7f9dfbfcf5d97b5dcae25685930c8645a","RepoTags":["dockerfile/redis:latest"],"Size":0,"VirtualSize":434170370}

解決方法が泣けるけど、セキュリティリスクを承知でTLSオプション無しでdockerd起動すればいいじゃない!というもの。ゲストマシンにTLSオプションを無効にする設定を書く。

docker@boot2docker:~$ cat /var/lib/boot2docker/profile 
DOCKER_TLS=no
docker@boot2docker:~$ sudo /etc/init.d/docker restart

ホストマシンからremote APIを叩いてみる。

yukaarybox:boot2docker-vm yukaary$ curl http://192.168.59.103:2375/images/json
[{"Created":1414247260,"Id":"806930947ad909768835b8311a061e630ee95e7cb0d3420ec2c815abd21182f1","ParentId":"4271258c1b3fc4f96e8d7ddbf2893ff7f9dfbfcf5d97b5dcae25685930c8645a","RepoTags":["dockerfile/redis:latest"],"Size":0,"VirtualSize":434170370}

イメージの一覧は取れた。が、ストリーム関係はだめぽ…。OSXのcurlが駄目なんじゃないかって気がしてきた。

yukaary$ curl -N http://192.168.59.103:2375/events?since1415972290
シーン...

ゲストマシンからだとストリームAPIも正常に動作する。

docker@boot2docker:~$ curl http://boot2docker:2375/events?since=1415972290
{"status":"die","id":"688f24305b55bb8587635e5392e664e1ec50591c5d13be66e5040a6d6a36d2de","from":"dockerfile/redis:latest","time":1415972323}{"status":"stop","id":"688f24305b55bb8587635e5392e664e1ec50591c5d13be66e5040a6d6a36d2de","from":"dockerfile/redis:latest","time":1415972323}{"status":"die","id":"1811fbe97840253a797c0fac6a33d84bf74eeac084793c3d68f157a36e892199","from":"dockerfile/redis:latest","time":1415972339}{"status":"stop","id":"1811fbe97840253a797c0fac6a33d84bf74eeac084793c3d68f157a36e892199","from":"dockerfile/redis:latest","time":1415972339}{"status":"destroy","id":"688f24305b55bb8587635e5392e
...

追記

mac側に入れていたファイアウォールソフトが全力で邪魔していたっぽい。

yukaarybox:CoreServices yukaary$ curl -N http://192.168.59.103:2375/images/json
[{"Created":1414247260,"Id":"806930947ad909768835b8311a061e630ee95e7cb0d3420ec2c815abd21182f1","ParentId":"4271258c1b3fc4f96e8d7ddbf2893ff7f9dfbfcf5d97b5dcae25685930c8645a","RepoTags":["dockerfile/redis:latest"],"Size":0,"VirtualSize":434170370}
yukaarybox:CoreServices yukaary$ curl -N http://192.168.59.103:2375/events?since=1415972290
{"status":"create","id":"d0d362d2d7b9a1fb61aec059007b7aa902148cb67796ffb01e98840cdf7ba7f5","from":"dockerfile/redis:latest","time":1415975558}{"status":"start","id":"d0d362d2d7b9a1fb61aec059007b7aa902148cb67796ffb01e98840cdf7ba7f5","from":"dockerfile/redis:latest","time":1415975558}

繋がったからよしとしよう…。

No comments:

Post a Comment