Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ZeroMQ fails to .bind() on Docker on [0.0.0.0:5555] - address already in use. Why?

Got a bit problem with ZeroMQ socket on trying to .bind() on 0.0.0.0:5555 address, when tried to run it in Docker container via a Rancher Cattle.

Every time I try to run it, I'm getting the same error:

zmq.error.ZMQError: Address already in use.

Tried to do EXPOSE 5555 and EXPOSE 5555/tcp in my Dockerfile, but it did not help me.

Here is a part of my code:

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

Maybe somebody had the same problem. How to solve it?

like image 945
Denys Lytvinyuk Avatar asked Mar 23 '17 14:03

Denys Lytvinyuk


People also ask

How do I fix bind address already in use?

The Error “address already in use” occurred because some process was already running on the same port. So we can resolve the issue just by killing the process. To stop the process, we need the process ID (PID), which we can fetch using the lsof command.

What is context in Zmq?

Contexts help manage any sockets that are created as well as the number of threads ZeroMQ uses behind the scenes. Create one when you initialize a process and destroy it as the process is terminated. Contexts can be shared between threads and, in fact, are the only ZeroMQ objects that can safely do this.


2 Answers

ZeroMQ API defines 3-ways to go:

Assigning a local address to a socket

When assigning a local address to a socket using zmq_bind() with the tcp:// transport, the endpoint shall be interpreted as an interface followed by a colon and the TCP port number to use.

An interface may be specified by either of the following:
- The wild-card *, meaning all available interfaces.
- The primary IPv4 address assigned to the interface, in its numeric representation.
- The interface name as defined by the operating system.

Interface names are not standardised in any way and should be assumed to be arbitrary and platform dependent. On Win32 platforms no short interface names exist, thus only the primary IPv4 address may be used to specify an interface.

So, at least one ought make the job progress.

like image 145
user3666197 Avatar answered Oct 03 '22 20:10

user3666197


After two hours of debugging i tried to make .bind_to_random_port() and noticed, that my app in Docker starts via 4 Gunicorn workers. So after first worker started, three another workers can not bind to the same port. Be aware of binding to only one port while you have multiple threaded or multiple workers application.

like image 34
Denys Lytvinyuk Avatar answered Oct 03 '22 20:10

Denys Lytvinyuk