请注意,这与How to expose a service running inside a docker container, bound to localhost不同,后者可以在Docker for Linux中以多种方式解决,例如通过--net host
甚至甚至是-v
来将我的Linux风格客户端绑定到其中。我的问题是Mac专用的Docker,所以问题并不那么简单。
我有一个绑定到localhost:5005
的TCP服务器,在Mac的Docker内部运行。 (出于安全原因,我不能绑定到0.0.0.0:5005
。)
我有一个TCP客户端从我的Mac(不在docker容器内)向该服务器发送请求。
我的问题是,如何使它工作?
在Linux Docker中,我仅使用--net=host
,以便服务器绑定到主机lo
的接口,但是似乎Mac的Docker在托管VM上运行,因此host
网络行为是不同的行为。
为了说明我的观点:
在MacBook上
那根本行不通
[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:
在Linux上
相比之下,在Linux上使用host
网络模式将是微不足道的。由于我将Linux的lo
接口用作容器lo
接口。
[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!
我的模拟服务器代码
要求:它必须绑定到localhost
,并且不能绑定。因此,我无法将其更改为0.0.0.0
。
#!/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()
我的模拟客户代码
要求:它必须在MacBook上运行,因为真正的客户端是用CPP编写并编译为只能在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