如何从Mac到达Docker容器`localhost`?

时间:2018-09-13 20:20:18

标签: macos docker docker-networking

请注意,这与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

0 个答案:

没有答案