[How to reach docker container
localhost from Mac?]
This is a problem specific for Docker for Mac. I have posted it on Stackoverflow as well. My Docker for Mac version is
I have a TCP server binding to
localhost:5005 running inside Docker for Mac. (For security reason, I must not bind to
I have a TCP client sending request to this server from my Mac (not inside the docker container).
My question is, how do I make it work?
In Linux Docker, I would simply use
--net=host so the server binds to my host
lo interface, but it seems that Docker for Mac runs on a managed VM, so the
host network behavior is different behavior.
To illustrate my point:
It simply would not work
[me@MacBook App]$ docker run -v `pwd`:/App -p 127.0.0.1:5005:5005 nitincypher/docker-ubuntu-python-pip /App/server.py [me@MacBook App]$ ./client.py Client received data:
In comparison, it would be trivial to do on Linux by using
host network mode. Since I’m using my Linux’s
lo interface as my container
[me@Linux App]$ docker run -v `pwd`:/App --net=host nitincypher/docker-ubuntu-python-pip /App/server.py Server Connection address: ('127.0.0.1', 52172) Server received data: Hello, World! [me@Linux App]$ ./client.py Client received data: Hello, World!
My Simulated Server Code
Requirement: It MUST bind to
localhost, and nothing else. So I cannot change it to
#!/usr/bin/env python import socket TCP_IP = 'localhost' TCP_PORT = 5005 BUFFER_SIZE = 20 # Normally 1024, but we want fast response s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind((TCP_IP, TCP_PORT)) s.listen(1) conn, addr = s.accept() print 'Server Connection address:', addr while 1: data = conn.recv(BUFFER_SIZE) if not data: break print "Server received data:", data conn.send(data) # echo conn.close()
My Simulated Client Code
Requirement: It MUST be ran on MacBook, since the real client is written in CPP and compiled to run only on MacBook.
#!/usr/bin/env python import socket TCP_IP = 'localhost' TCP_PORT = 5005 BUFFER_SIZE = 1024 MESSAGE = "Hello, World!" s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((TCP_IP, TCP_PORT)) s.send(MESSAGE) data = s.recv(BUFFER_SIZE) s.close() print "Client received data:", data