ZeroMQ在[0.0.0.0:5555]上的Docker上没有.bind() - 已经在使用的地址。为什么呢?

时间:2017-03-23 14:56:28

标签: python sockets docker tcp zeromq

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

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

  

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))
...

也许有人有同样的问题。怎么解决?

2 个答案:

答案 0 :(得分:3)

ZeroMQ API定义了三种方式:

  

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

  可以通过以下任一方式指定接口:   
     - 通配符* ,表示所有可用的接口      - 以数字形式分配给接口的主IPv4地址      - 操作系统定义的接口名称   
  接口名称以任何方式标准化,应假定为任意且依赖于平台。在Win32平台上,不存在短接口名称,因此只能使用主IPv4地址来指定接口。

所以,至少有一个应该让工作进展。

答案 1 :(得分:3)

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