Docker 远程守护进程 (TCP) : Cannot connect to the Docker daemon

标签 docker tcp ubuntu-18.04 docker-daemon

我正在尝试通过 TCP 将 docker 守护程序从客户端连接到远程主机,但出现此错误:

docker -H tcp://{{HOST_IP}}:2375 ps

Cannot connect to the Docker daemon. Is 'docker daemon' running on this host?

可能的原因是什么?寻找解决方案的正确调试方法是什么?
  • 系统:Ubuntu 18.04(客户端和主机)
  • ufw:为所有传入和传出启用(用于测试目的)
  • 访问权限:在客户端和主机上使用 root

  • 我做了什么

    在主机上:
    systemctl edit docker.service
    

    添加并保存这些行:
    [Service]
     ExecStart=
     ExecStart=/usr/bin/dockerd -H fd:// -H tcp://127.0.0.1:2375
    

    重新加载守护进程:
    systemctl daemon-reload
    

    重启 docker :
    systemctl restart docker.service
    

    检查它是否有效:
    netstat -lntp | grep dockerd
    

    结果:
    tcp        0      0 127.0.0.1:2375          0.0.0.0:*               LISTEN      3758/dockerd
    

    用 docker 测试:
    docker -H tcp://127.0.0.1:2375 ps
    

    一切都在主机上工作。但是,当我尝试从客户端连接到远程主机时,出现错误。

    在客户端:
    docker -H tcp://{{HOST_IP}}:2375 ps
    
    Cannot connect to the Docker daemon. Is 'docker daemon' running on this host?
    

    通过 ssh 连接有效:
    docker -H ssh://root@{{HOST_IP}} ps
    

    最佳答案

    您让 Docker 守护进程监听 localhost 地址,127.0.0.1 .您将无法从远程主机连接到它。唯一可以连接到该地址的主机是...本地主机。

    要让 Docker 守护进程接受来自远程主机的连接,您可能需要:

    ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375
    

    这意味着,“监听来自所有主机的连接”。但是你真的不想要那个,因为这会授予未经身份验证的 root任何能够连接到该端口的人都可以访问您的系统。您可以使用 iptables限制对特定远程主机的访问,但这仍然是一个问题,因为任何能够访问任何这些主机的人都会再次未经身份验证 root访问您的 Docker 主机。

    您真正想要做的是通读“Protect the Docker daemon socket”,其中讨论了如何为到 Docker 守护程序的远程连接设置基于证书的身份验证。与您问题中的示例不同,该文档中讨论的配置要求客户端使用 SSL 证书进行身份验证。

    这比允许从任何地方未经身份验证的访问要安全得多,而且比允许来自特定主机的未经身份验证的访问要安全得多(因为文件系统所有权和权限可用于限制对授予访问 docker 守护进程所需的 SSL 私钥的访问)。

    关于Docker 远程守护进程 (TCP) : Cannot connect to the Docker daemon,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59605137/

    相关文章:

    sql-server - 无法从 Kubernetes 连接到本地主机上托管的 SQL Server 数据库,如何调试?

    docker - 恢复预配置的Docker镜像的方法

    Java:TCP加密、SSL和Netty

    c# - 多个客户端在服务器上调用函数 : Isolate each client calls

    java - 在 Ubuntu 服务器上通过 R 连接到 Athena 时出现问题

    python - Ansible 忽略 ansible_python_interpreter 作为命令行参数

    docker - 使用代理docker从Jenkins管道部署/运行应用

    macos - docker for mac 启动失败

    java - java游戏使用TCP和UDP

    yaml - 在 YAML 中创建 CloudFormation 模板以创建以下资源和输出