在使用Ubuntu 14.04和Upstart作为init系统的旧机器上,我通过在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所述,有些属性不言自明,但其他属性可能未得到充分解释。
话虽这么说,我正在寻求帮助来转换这个:
DOCKER_OPTS="-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock -G myuser --debug"
到daemon.json
object?
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"
]
}
尝试用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]
我希望这能帮助像我这样有类似问题的人! :)
我有同样的问题,实际上在我看来,最简单的解决方案应该不接触任何现有的文件,由系统更新过程管理,使用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
难以排除故障的配置冲突的一个值得注意的示例是,您希望从默认值中指定不同的守护程序地址。 Docker默认侦听套接字。在使用
systemd
的Debian和Ubuntu系统上,这意味着在启动-H
时总是使用dockerd
标志。如果在daemon.json
中指定hosts条目,则会导致配置冲突(如上面的消息中所示),并且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 daemon-reload和sudo systemctl restart docker查看结果调用:
如果您的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"
我希望它可以帮助某人......