【问题标题】:Python Client Server with Docker - Connection refused带有 Docker 的 Python 客户端服务器 - 连接被拒绝
【发布时间】:2019-08-22 08:56:50
【问题描述】:

我正在尝试在 python 中开发一个简单的客户端/服务器应用程序。

客户端在 Docker 容器中运行,而服务器直接在主机上运行。

这是客户端的代码:

import socket

def main():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect(('127.0.0.1', 8888))
    print (Connected to server)

if __name__ == '__main__':
    main()

这是服务器的代码:

import socket

HOST = '127.0.0.1'
PORT = 8888

print ("Serving on ", PORT)

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()
    conn, addr = s.accept()
    with conn:
        print('Connected by', addr)

我有以下错误:

  File "./main.py", line 5, in main
    s.connect(('127.0.0.1', 8888))
ConnectionRefusedError: [Errno 111] Connection refused

如果我在容器外(直接在主机上)运行此客户端,我可以连接。但是当我在容器中运行它时出现此错误。

PS:它不是纯粹的 Docker 容器,而是 IoT Edge 模块

你知道是什么问题吗? 谢谢

【问题讨论】:

  • 在服务器中,HOST 必须是特殊的“所有接口”地址 0.0.0.0,否则将无法从容器外部访问。在客户端,您需要将服务器的容器名称作为主机名,127.0.0.1 是“此容器”。两者都需要在同一个 Docker 网络上。

标签: python docker sockets client-server


【解决方案1】:

容器中的第一个s.connect(('127.0.0.1', 8888)) 意味着连接到容器本身而不是主机,要使其正常工作,您应该使用--network=host 运行Container

第二个选项是向客户端提供您的host IP 地址:

s.connect(('HOST_ROUTABLE_IP_ADDRESS', 8888))

【讨论】:

  • 这可能会起作用,但它来自 docker 容器的removes any kind of network isolation,这可能会带来巨大的安全风险。
  • 服务器在localhost不是在容器中运行因此我建议这个解决方案
  • 哈哈,没错。我可能很快就写了一点,但无论如何还是很高兴知道。
  • 好的,谢谢,我会试试这个。如果服务器也在容器中(在同一台主机上)运行,我是否需要做一些特定的事情,或者在这种情况下我可以使用 localhost 吗?谢谢
  • 不,您应该在它们之间配置网络并使用container名称s.connect(('container_name', 8888))进行连接
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-27
  • 1970-01-01
相关资源
最近更新 更多