DockeR语言 使用 SystemD 和 "daemon.json" 启用远程 HTTP API



免责声明:

在一台装有 Ubuntu 14.04 的旧机器上,Upstart 作为初始化系统,我通过在/etc/default/docker上定义DOCKER_OPTS来启用 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 文档页面上检查此信息时,我需要填写一个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答案以获取有关此事的更多意见。

由于有大量零散的文档,很难解决这个问题。

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

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

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

但是这个错误在开始时意味着守护程序它与daemon.json上的标志和配置冲突。

当我用service docker status来研究它时,它是父进程:ExecStart=/usr/bin/docker daemon -H fd://.

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

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

溶液

使用以下新值编辑了/lib/systemd/system/docker.service中的ExecStart/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]

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

我遇到了同样的问题,实际上在我看来,最简单的解决方案不应该触及任何由系统更新过程管理的现有文件,是使用 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

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以下内容 内容,-H以删除启动 默认情况下的守护程序。

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

请注意,实际上需要带有ExecStart=的行,否则它将失败并显示错误:

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

创建文件后,必须运行:

sudo systemctl daemon-reload
sudo systemctl restart docker

对我来说,在 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守护程序重新加载和 sudo systemctl重新启动 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"

我希望它对某人有所帮助...

最新更新