DockerのAPIをTCPで待受させる


動機

家に数台の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 が指定されていると

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