Docker - 使用SystemD和“daemon.json”启用远程HTTP API

时间:2017-03-23 21:52:27

标签: json ubuntu docker systemd docker-api

声明:

在使用Ubuntu 14.04并使用Upstart作为初始系统的旧计算机上,我通过在DOCKER_OPTS上定义/etc/default/docker来启用HTTP API。它有效。

$ 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 documentation page上查看此信息时,我需要填写一个daemon.json文件,但正如reference所述,有一些属性不言自明,但其他属性可以在-explained。

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

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

daemon.json对象?

备注

PS1:我知道daemon.json默认为debug: true

PS2 group: "myuser"可能会像这样或使用字符串数组。

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

编辑(8/08/2017) 阅读接受的答案后,请查看@white_gecko答案以获取有关此事项的更多信息。

4 个答案:

答案 0 :(得分:9)

由于文档碎片很多,很难解决这个问题。

我的第一个解决方案是使用

创建daemon.json
{
  "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的帮助下)。

解决方案

使用以下新值从ExecStart编辑/lib/systemd/system/docker.service/usr/bin/docker daemon

使用

创建/etc/docker/daemon.json
{
  "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]

我希望这能帮助像我这样有类似问题的人! :)

答案 1 :(得分:5)

我遇到了同样的问题,实际上在我看来,最简单的解决方案应该是不接触任何现有文件,这些文件由系统更新过程管理,使用systemd drop-in: 只需创建一个文件/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

答案 2 :(得分:5)

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

  

难以配置冲突的一个值得注意的例子   疑难解答是指定要指定其他守护程序地址的时间   从默认。 Docker默认侦听套接字。论Debian和   使用systemd)的Ubuntu系统,这意味着始终是-H标志   在dockerd开始时使用。如果在中指定主机条目   daemon.json,这会导致配置冲突(如上所述)   消息)并且Docker无法启动。

     

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

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

请注意,实际上需要ExecStart=行,否则会因错误而失败:

  

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

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

sudo systemctl daemon-reload
sudo systemctl restart docker

答案 3 :(得分:1)

对我来说,致力于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-reload sudo systemctl restart docker 查看结果调用:

卷曲http://localhost:2376/info

如果您的泊坞窗位于代理之后,则可能需要配置代理。 要将此粘贴到以下/ 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"

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