【问题标题】:ZeroMQ fails to .bind() on Docker on [0.0.0.0:5555] - address already in use. Why?ZeroMQ 在 [0.0.0.0:5555] 上的 Docker 上无法 .bind() - 地址已在使用中。为什么?
【发布时间】:2017-08-16 05:20:06
【问题描述】:

当尝试通过 Rancher Cattle 在 Docker 容器中运行时,ZeroMQ 套接字在尝试 .bind() 0.0.0.0:5555 地址时遇到了一点问题。

每次我尝试运行它时,都会遇到同样的错误:

zmq.error.ZMQError: 地址已在使用中。

尝试在我的 Dockerfile 中执行 EXPOSE 5555EXPOSE 5555/tcp,但对我没有帮助。

这是我的代码的一部分:

...
self.context = zmq.Context()
self.socket = self.context.socket(zmq.PUB)
self.socket.bind('tcp://%s:%d' % ('0.0.0.0', 5555))
...

也许有人遇到了同样的问题。如何解决?

【问题讨论】:

  • 当然,没有任何变化。我什至尝试在没有这部分代码的情况下运行容器并进入容器的外壳。此端口未使用。
  • 'netstat -nlp | 有什么作用? grep :5555' 返回?
  • 您是否尝试将其他应用程序绑定到此端口?尝试公开一个简单的 hello-world 网络服务器而不是 ZMQ。只是为了检查它是否不是 ZMQ 特定的。
  • 'netstat -nlp | grep :5555' 什么都不返回。
  • 我尝试在 0.0.0.0:5555 上运行应用程序,它可以工作。这是0MQ的问题

标签: python sockets docker tcp zeromq


【解决方案1】:

经过两个小时的调试,我尝试制作 .bind_to_random_port() 并注意到,我在 Docker 中的应用程序是通过 4 个 Gunicorn 工人启动的。所以在第一个工人启动后,另外三个工人不能绑定到同一个端口。当您有多个线程或多个工作人员应用程序时,请注意仅绑定到一个端口。

【讨论】:

    【解决方案2】:

    ZeroMQ API 定义了 3 种方式:

    为套接字分配本地地址

    当使用 zmq_bind()tcp:// 传输将本地地址分配给套接字时,端点应解释为后跟冒号和 TCP 端口号的接口使用。

    接口可以通过以下任一方式指定:
    - 通配符 *,表示所有可用的接口。
    - 分配给接口的主要 IPv4 地址,以数字表示。
    - 操作系统定义的接口名称

    接口名称以任何方式标准化,并且应假定为任意且依赖于平台。在 Win32 平台上不存在短接口名称,因此只能使用主 IPv4 地址来指定接口。

    所以,至少应该让工作取得进展。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-12
      • 2020-02-07
      • 1970-01-01
      • 1970-01-01
      • 2017-04-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多