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

Pau*_*ira 3 ubuntu json systemd docker docker-api

免责声明:

在使用Ubuntu 14.04并使用Upstart作为init系统的旧机器上,我通过定义DOCKER_OPTSon 启用了HTTP API /etc/default/docker.有用.

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

Server:
 Version:      1.11.2
 (...)
Run Code Online (Sandbox Code Playgroud)

问题:

这个解决方案在最近使用带有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/
#
(...)
Run Code Online (Sandbox Code Playgroud)

当我在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.json有一个debug: true默认值.

PS2:可能group: "myuser"它会像这样或使用一串字符串.

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


编辑(8/08/2017) 阅读接受的答案后,请查看@white_gecko答案,了解有关此事的更多信息.

Pau*_*ira 9

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

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

{
  "hosts": [
    "unix:///var/run/docker.sock",
    "tcp://127.0.0.1:2376"
  ]
}
Run Code Online (Sandbox Code Playgroud)

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我认为是服务配置的配置不同.奇怪的是,文件on init.d确实包含对daemon参数的任何引用-H fd://.

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

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

并创造了/etc/docker/daemon.json

{
  "hosts": [
    "fd://",
    "tcp://127.0.0.1:2376"
  ]
}
Run Code Online (Sandbox Code Playgroud)

终于重新启动了服务,service docker start现在我得到了"绿灯" service docker status.

测试了新配置:

$ docker run hello-world

Hello from Docker!
(...)
Run Code Online (Sandbox Code Playgroud)

和,

$ curl http://127.0.0.1:2376/v1.23/info
[JSON]
Run Code Online (Sandbox Code Playgroud)

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

  • 你不需要改变原来的`docker.service`,你可以使用systemd drop-in文件,例如:`/ etc/systemd/system/docker.service.d/no_fd.conf`和`[Service] ExecStart = ExecStart =/usr/bin/dockerd` (2认同)

whi*_*cko 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://
Run Code Online (Sandbox Code Playgroud)

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

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

$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
Run Code Online (Sandbox Code Playgroud)


Ser*_*ano 5

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

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

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

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd
Run Code Online (Sandbox Code Playgroud)

请注意,ExecStart=实际上必须使用with行,否则它将因以下错误而失败:

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

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

sudo systemctl daemon-reload
sudo systemctl restart docker
Run Code Online (Sandbox Code Playgroud)