HTTPie で Docker Remote API にアクセスする方法

Docker のアーキテクチャ

Docker はクライアントサーバモデルも採用しており、サーバ側の API 仕様は Docker Remote API として公開されています。つまり、 Docker クライアント (Docker コマンド) はこの Remote API を叩いて Docker サーバ (Docker デーモン) に操作を依頼しているのであり、設定をすれば普通の HTTP 経由でも API へアクセスすることが可能になっています。

Docker デーモンはデフォルトでは Unix ソケットの unix:///var/run/docker.sock を listen しますが、 Windows や OS X で Boot2Docker や Docker Machine を使っている場合には、 TCP ソケット (2376 番ポート) を listen するように設定されています。また、接続は TLS で暗号化されています。この辺りのことをクライアントからのアクセスの際に指定するために、以下の環境変数の設定が必要となるわけです。

1
2
3
4
5
6
7
8
9
10
# Docker Machine の場合
$ docker-machine env dev
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/Users/skatsuta/.docker/machine/machines/dev"
export DOCKER_MACHINE_NAME="dev"
# Run this command to configure your shell:
# eval "$(docker-machine env dev)"

# Boot2Docker なら `boot2docker shellinit`

HTTPie で Docker Remote API にアクセスする

たとえばイメージ一覧を取得してみます。現状のイメージ一覧は以下のようになっているとしましょう。

1
2
3
4
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
golang latest 124e2127157f 4 weeks ago 517.3 MB
centos latest 7322fbe74aa5 8 weeks ago 172.2 MB

では Docker Remote API に直接アクセスしてみます。 wget を使った方法はこちらの記事で紹介されていますが、僕は HTTPie を愛用しているので、今回はそちらを使ってやってみたいと思います。

結論から言えば、以下のようにオプションを指定して API にアクセスします。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 簡略化のため、あらかじめホスト VM の IP アドレスを取得しておく
$ export DOCKER_IP=`docker-machine ip dev`

# HTTPie で TLS 接続でイメージ一覧を取得する
$ http --verify=no --cert=$DOCKER_CERT_PATH/cert.pem --cert-key=$DOCKER_CERT_PATH/key.pem https://$DOCKER_IP:2376/images/json
HTTP/1.1 200 OK
Content-Length: 533
Content-Type: application/json
Date: Mon, 17 Aug 2015 06:23:18 GMT
Server: Docker/1.8.1 (linux)

[
{
"Created": 1436855204,
"Id": "124e2127157f398735e5888601e8b02cf832e037ef951317bc0a4f6256723d7b",
"Labels": {},
"ParentId": "69c177f0c117c1ea8c4593b4fbfa7affb4096f7abc751c9d818721bfdea087bb",
"RepoDigests": [],
"RepoTags": [
"golang:latest"
],
"Size": 2481,
"VirtualSize": 517283915
},
{
"Created": 1434648509,
"Id": "7322fbe74aa5632b33a400959867c8ac4290e9c5112877a7754be70cfe5d66e9",
"Labels": {},
"ParentId": "c852f6d61e65cddf1e8af1f6cd7db78543bfb83cdcd36845541cf6d9dfef20a0",
"RepoDigests": [],
"RepoTags": [
"centos:latest"
],
"Size": 0,
"VirtualSize": 172237380
}
]

詳細なイメージ情報が JSON で取得できました。この API 情報を使うことで、サードパーティでもさまざまな Docker 用ツールが開発できそうです。