なおすけの落書き帳

毎日がエブリデイ。

Docker HTTP API (Remote API)を有効にするために

DockerホストマシンにHTTPでリクエスト飛ばして色々としたかったのですが、デフォルトだとUnix domain socketしか有効になっていないっぽい。

どうすればいいんかと調べたら、systemdの起動スクリプトにオプションを追加すればいいっぽい。

参考文献を参考に、/lib/systemd/system/docker.serviceに以下のような変更をしました。

:(略)
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
### ここの行を
ExecStart=/usr/bin/dockerd
### こうじゃ
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 
ExecReload=/bin/kill -s HUP $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
:(略)

で、systemctl daemon-reloadsystemctl restart docker.service で再起動。
確認するには curl localhost:2375/version を叩けばいいです。

f:id:naosuke2dx:20171117010440p:plain:w300

こんな風に結果が返ってきます。

そこで「できた〜」となって実際に使おうとしたのですが、ホストマシンでdockerコマンドを使うとこんな感じに。

f:id:naosuke2dx:20171117010553p:plain:w300

[vagrant@localhost ~]$ docker ps
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

で、色々調べると、dockerコマンドはデフォルトではunix domain socketを使って通信をするっぽく、起動時の-Hオプションを与えたらsocketファイルがなくなるっぽい。*1
なので、こんな感じで起動スクリプトを修正。

:(略)
### ここの行を
ExecStart=/usr/bin/dockerd
### こうじゃ
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375  -H unix:///var/run/docker.sock
:(略)

で同じようにdaemon-reloadしてrestart dockerすればうまくいくようになりました。


参考文献

d.hatena.ne.jp

*1:環境変数DOCKER_HOSTにipアドレスを指定すれば問題ないっぽい