在 daemon.json 中配置主机后无法启动 docker



我正在尝试使用配置文件 /etc/docker/daemon.json 在 ubuntu 16.04 中配置 docker(版本 17.03.1-ce(以添加主机:

{
  "debug": true,
  "hosts": ["tcp://0.0.0.0:1234", "unix:///var/run/docker.sock"],
  "dns"  : ["8.8.8.8","8.8.4.4"]
}

当我尝试重新启动码头工人时,它失败了

#service docker restart
Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.

Systemctl status docker.service 上观看:

Starting Docker Application Container Engine...
docker-slave-ubuntu-build dockerd[24806]: unable to configure the Docker daemon with file /etc/docker/daemon.json: 
the following directives are specified both as a flag and in the configuration file: 
hosts: (from flag: [fd://], from file: [tcp://0.0.0.0:4243 unix:///var/run/docker.sock])

我在哪里可以删除提到的标志?我必须修改维护者的脚本?

看起来这是从

命令行和配置文件合并配置的问题。默认的 systemd 单元文件指定-H fd://,它与您的tcp://0.0.0.0:1234unix:///var/run/docker.sock冲突。

关于这个主题,GitHub 存在许多问题:

  • https://github.com/moby/moby/issues/22339
  • https://github.com/moby/moby/issues/21559
  • https://github.com/moby/moby/issues/25471
  • https://github.com/moby/moby/pull/27473

他们似乎不认为这是一个错误。但这绝对是一种烦恼。解决方法是复制默认单元文件并从中删除-H fd://

$ sudo cp /lib/systemd/system/docker.service /etc/systemd/system/
$ sudo sed -i 's/ -H fd:////g' /etc/systemd/system/docker.service
$ sudo systemctl daemon-reload
$ sudo service docker restart

对于 systemd,我的首选方法是部署一个简单的覆盖文件(您可能需要先创建目录(:

$ cat /etc/systemd/system/docker.service.d/override.conf
# Disable flags to dockerd, all settings are done in /etc/docker/daemon.json
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd

这会从 dockerd 中删除-H ...默认标志以及任何其他选项,并允许您从 daemon.json 文件管理 docker。这也允许 docker 对他们的启动脚本进行更改,只要他们不修改 ExecStart,你将继续收到这些更改,而无需维护你自己的 docker.service 副本。

创建此文件后,运行 systemctl daemon-reload; systemctl restart docker

我在Docker文档中找到了这个,它适用于Docker 18.09.1和Centos 8:

若要变通解决此问题,请创建一个新的文件/etc/systemd/system/docker.service.d/docker.conf与以下内容,以删除默认情况下启动守护程序时使用的-H参数。

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd

然后重新加载

systemctl daemon-reload

原因是:

默认情况下,Docker 侦听套接字。在使用 systemd 的 Debian 和 Ubuntu 系统上,这意味着启动 dockerd 时始终使用主机标志-H。如果在 daemon.json 中指定hosts条目,则会导致配置冲突(如上述消息所示(,并且 Docker 无法启动。

这是链接: https://docs.docker.com/config/daemon/#troubleshoot-conflicts-between-the-daemonjson-and-startup-scripts

就我而言,我尝试在/etc/docker 下添加 daemon.json,在/etc/systemd/system/docker.service.d 下添加一个 *.conf 文件。事实证明,只有一个 .conf 文件就足够了(在我的例子中称为 override.conf(:

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375

这样我就可以公开 docker 套接字。

我从一个网站上复制了daemon.json。运行后

sudo systemctl stop docker
/usr/sbin/dockerd

它向我展示了一个更好的错误消息,指出我在 daemon.json 文件中有一个奇怪的不可见字符

相关内容

  • 没有找到相关文章