【问题标题】:Docker - Enable Remote HTTP API with SystemD and "daemon.json"Docker - 使用 SystemD 和“daemon.json”启用远程 HTTP API
【发布时间】:2017-08-16 16:40:37
【问题描述】:

免责声明:

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

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

Server:
 Version:      1.11.2
 (...)

问题:

此解决方案不适用于最近安装 Ubuntu 16.04 和 SystemD 的机器。

如最近安装的文件顶部所述/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/
#
(...)

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

话虽如此,我正在寻求帮助来转换它:

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

daemon.jsonobject?


注意事项

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

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

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


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

【问题讨论】:

  • 请注意,如果您按照此处的任何步骤操作,您将创建一个未加密的远程 root 登录到服务器,而无需任何密码或凭据。对于任何可以通过网络访问您的主机的人来说,以 root 身份运行容器并安装主机文件系统是微不足道的。强烈建议保护此套接字:docs.docker.com/engine/security/https

标签: json ubuntu docker systemd docker-api


【解决方案1】:

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

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

创建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 issue #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]

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

【讨论】:

  • 可能你忘记复制的错误信息是:unable to configure the Docker daemon with file /etc/docker/daemon.json: the following directives are specified both as a flag and in the configuration file: hosts: (from flag: [fd://], from file: [tcp://127.0.0.1:2375 fd://])
  • docker.service不用改,可以使用systemd drop-in文件,如:/etc/systemd/system/docker.service.d/no_fd.conf[Service] ExecStart= ExecStart=/usr/bin/dockerd
【解决方案2】:

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

【讨论】:

  • 您的建议不错!我要编辑问题,让新观众也检查你的答案。
  • 在 Debian 上对我不起作用;我得到docker.service: Service has more than one ExecStart= setting, which is only allowed for Type=oneshot services. Refusing.
  • 请注意,如果要实现从外部访问,IP应该是0.0.0.0,否则只能通过localhost访问。此外,Docker 文档建议使用2376 端口而不是2375 进行TLS 连接。
【解决方案3】:

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

一个难以解决的配置冲突的显着示例 疑难解答是当您要指定不同的守护程序地址时 从默认值。 Docker 默认监听一个套接字。在 Debian 和 Ubuntu 系统使用systemd),这意味着-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

【讨论】:

    【解决方案4】:

    我在 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"
    

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

    【讨论】:

      猜你喜欢
      • 2017-03-28
      • 2017-03-16
      • 2016-08-03
      • 1970-01-01
      • 1970-01-01
      • 2018-01-02
      • 2021-02-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多