Обратите внимание, что это отличается от Как предоставить сервис, работающий внутри контейнера Docker, привязанный к localhost , к которому можно обратиться несколькими способами в Docker для Linux, скажем, через --net host
или даже -v
привязать мой Linux-клиент и т. д. Моя проблема специфична для Docker для Mac, поэтому она не так проста.
У меня есть привязка TCP-сервера к localhost:5005
внутри Docker для Mac. (Из соображений безопасности я не должен связываться с 0.0.0.0:5005
.)
У меня есть TCP-клиент, отправляющий запрос на этот сервер с моего Mac (не внутри контейнера Docker).
У меня вопрос, как мне заставить это работать?
В Linux Docker я просто использовал бы --net=host
, чтобы сервер связывался с моим lo
интерфейсом хоста, но похоже, что Docker для Mac работает на управляемой виртуальной машине, поэтому поведение сети 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
. Поскольку я использую интерфейс lo
моего Linux в качестве интерфейса 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