3

免责声明:

在一台带有 Ubuntu 14.04 和 Upstart 作为初始化系统的旧机器上,我通过定义DOCKER_OPTSon启用了 HTTP API /etc/default/docker。有用。

$ docker version
Client:
 Version:      1.11.2
 (...)

Server:
 Version:      1.11.2
 (...)

问题:

这确实解决方案不适用于带有 SystemD 的 Ubuntu 16.04 的最新机器。

如最近安装的文件顶部所述/etc/default/docker

# Docker Upstart and SysVinit configuration file

#
# THIS FILE DOES NOT APPLY TO SYSTEMD
#
#   Please see the documentation for "systemd drop-ins":
#   https://docs.docker.com/engine/articles/systemd/
#
(...)

当我在 SystemD 的Docker 文档页面上检查此信息时,我需要填写一个daemon.json文件,但正如参考文献中所述,有些属性不言自明,但其他属性可能解释不足。

话虽这么说,我正在寻求帮助来转换它:

DOCKER_OPTS="-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock -G myuser --debug"

daemon.json对象?


笔记

PS1:我知道默认设置为daemon.jsona 。debug: true

PS2:可能group: "myuser"它会像这样或与字符串数组一起工作。

PS3:我主要关心的是同时使用 SOCK 和 HTTP。


编辑(2017 年 8 月 8 日) 阅读接受的答案后,检查@white_gecko 答案以获取有关此问题的更多信息。

4

4 回答 4

10

有很多零散的文档很难解决这个问题。

我的第一个解决方案是创建daemon.jsonwith

{
  "hosts": [
    "unix:///var/run/docker.sock",
    "tcp://127.0.0.1:2376"
  ]
}

docker[5586]: unable to configure the Docker daemon with file /etc/docker/daemon.json尝试使用 重新启动守护程序后,此错误不起作用service docker restart。注意:还有更多关于我未能复制的错误。

但是这个错误意味着它在启动守护程序时与标志和配置冲突daemon.json

当我对此进行调查时,service docker status它是父进程:ExecStart=/usr/bin/docker daemon -H fd://.

奇怪的是,与/etc/init.d/docker我认为是服务配置的配置不同。奇怪的是,文件上确实不包含对参数的init.d任何引用。daemon-H fd://

经过一些研究和对系统目录的大量搜索,我找到了这些目录(在关于这个问题docker github issue #22339的讨论的帮助下)。

解决方案

用这个新值 编辑了ExecStartfrom :/lib/systemd/system/docker.service/usr/bin/docker daemon

并创建了/etc/docker/daemon.jsonwith

{
  "hosts": [
    "fd://",
    "tcp://127.0.0.1:2376"
  ]
}

最后重新启动了服务,service docker start现在我得到了“绿灯” service docker status

测试了新的配置:

$ docker run hello-world

Hello from Docker!
(...)

和,

$ curl http://127.0.0.1:2376/v1.23/info
[JSON]

我希望这将帮助与我有类似问题的人!:)

于 2017-03-26T14:54:07.800 回答
5

https://docs.docker.com/engine/admin/#troubleshoot-conflicts-between-the-daemonjson-and-startup-scripts中描述的解决方案对我有用:

难以解决的配置冲突的一个显着示例是当您想要指定与默认值不同的守护程序地址时。Docker 默认监听一个套接字。在使用 ) 的 Debian 和 Ubuntu 系统上systemd,这意味着-H在启动时始终使用标志dockerd。如果在 中指定 hosts 条目 daemon.json,则会导致配置冲突(如上述消息中所示)并且 Docker 无法启动。

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

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

请注意,与ExecStart=实际需要的行,否则它将失败并出现错误:

docker.service:服务有多个 ExecStart= 设置,仅允许 Type=oneshot 服务。拒绝。

创建文件后,您必须运行:

sudo systemctl daemon-reload
sudo systemctl restart docker
于 2018-01-06T15:25:17.467 回答
5

我遇到了同样的问题,实际上在我看来,不应该触及由系统更新过程管理的任何现有文件的最简单解决方案是使用 systemd 插件:只需创建一个/etc/systemd/system/docker.service覆盖特定部分的文件中的服务/lib/systemd/system/docker.service

在这种情况下,内容/etc/systemd/system/docker.service将是:

[Service]
ExecStart=/usr/bin/dockerd --tlsverify --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/server-cert.pem --tlskey=/etc/docker/server-key.pem -H=tcp://127.0.0.1:2375 -H=fd://

(您甚至可以创建一个docker.service.d包含多个文件的目录来覆盖不同的参数。)

添加文件后,您只需运行:

$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
于 2017-08-07T11:25:01.177 回答
2

对我来说,在 Ubuntu 18.04.1 LTS 和 Docker 18.06.0-ce 创建 /etc/systemd/system/docker.service.d/remote-api.conf 具有以下内容:

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock

然后运行​​sudo systemctl daemon-reloadsudo systemctl restart docker 查看结果调用:

卷曲http://localhost:2376/info

如果您的 docker 在代理之后,您可能需要配置代理。要在 /etc/default/docker 文件中实现此粘贴,请执行以下操作:

http_proxy="http://85.22.53.71:8080/"
https_proxy="http://85.22.53.71:8080/"
HTTP_PROXY="http://85.22.53.71:8080/"
HTTPS_PROXY="http://85.22.53.71:8080/"
# below you can list some *.enterprise_domain.com as well
NO_PROXY="localhost,127.0.0.1,::1" 

或使用以下内容创建 /etc/systemd/system/docker.service.d/remote-api.conf :

[Service]
Environment="HTTP_PROXY=http://<you_proxy_ip>:<port>"
Environment="HTTPS_PROXY=https://<you_proxy_ip>:<port>/"
Environment="NO_PROXY=localhost,127.0.0.1,::1"

我希望它可以帮助某人...

于 2018-09-01T14:54:59.017 回答