配置了 daemon.json 的 hosts 后无法启动 docker

19

我正在尝试在Ubuntu 16.04上配置Docker(版本为17.03.1-ce),使用配置文件/etc/docker/daemon.json添加一个主机:

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

尝试重启 Docker 时失败

#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])

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


维护脚本是什么?您能详细说明一下您如何安装Docker,以便其他人可以尝试并重现问题吗? - Andy Shinn
5个回答

29

看起来这是一个合并命令行和配置文件的问题。默认的systemd unit文件指定了-H fd://,与你的tcp://0.0.0.0:1234unix:///var/run/docker.sock 有冲突。

关于这个问题,GitHub上有许多问题:

它们似乎不认为这是一个错误。但肯定是一个麻烦的问题。解决方法是复制默认的unit文件并从中删除-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

24

对于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


你不需要将 /lib/systemd/system/docker.service 复制到 /etc/systemd/system/ 吗?因为默认单元在内置目录中。 - Andy Shinn
不需要将/lib服务中的设置复制到/etc,就可以覆盖它。但是你需要使用空的ExecStart=来取消该值,以便重新配置它。 - BMitch

4
我在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

1
在我的情况下,我尝试在 /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套接字。

-1

我从一个网站上复制了daemon.json文件。运行后出现了问题。

sudo systemctl stop docker
/usr/sbin/dockerd

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接