📝

DockerのAPIをTCPで待受させる

2021/08/11に公開

動機

家に数台の Docker を走らせる VM が存在している。それをまとめて Web で監視する為に、Portainer を導入した。

Portainer は、リモートの Docker を管理する事ができるが、デフォルトでは dockerd は TCP 経由の API アクセスができない。

これを変更する方法をメモする。

環境

  • Ubuntu 18.04.2 LTS
  • Docker version 18.09.5, build e8ff056 (docker 公式ページの apt リポジトリ使用インストール)

解決方法

解決方法は二つある。 どちらか片方を選択すること(両方やってはいけない)
なお、失敗すると、dockerd が起動しなくなる。

方法その 1

systemd の定義を変更して、 dockerd コマンドラインを変更する(直接指定)

`# systemctl edit dockerd.service

<エディタが開くので以下の内容で上書き>
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375

方法その 2

systemd の定義を変更して、 dockerd コマンドラインを変更し、JSON の内容を反映可能にする

`# systemctl edit dockerd.service

<エディタが開くので以下の内容で上書き>
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd

/etc/docker/daemon.json を以下の内容で作成する。 ディレクトリ・ファイルが存在しない場合は作成する。

(デフォルトでは存在しない)

{
    "hosts": ["fd://", "unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"]
}
# dockerd を再起動する
sudo systemctl restart dockerd.service

なぜこんなことをするのか

dockerd の起動パラメタに -H が指定されていると、 /etc/docker/daemon.jsonhosts が指定されていると

エラーが発生して起動しなくなってしまうことが原因。

Discussion