主机客户端脚本从dockerized server script

时间:2017-09-25 14:09:38

标签: python sockets docker

我在mac osx上运行Docker Version 17.06.2-ce-mac27(19124)。 我正在尝试运行一个简单的python服务器脚本,使用容器中的socket和容器主机中的客户端脚本。 似乎客户端脚本可以连接到端口但不会触发服务器脚本。

当我从容器外部运行客户端脚本时,我得到一个空响应:

  

port_test_server $ ./echo_client.py

     

收到''

并且容器中运行的服务器脚本没有输出。

当我从容器内部运行客户端脚本时,我得到了预期的响应

  

port_test_server $ docker container exec 7c7d1fb7e614 ./echo_client.py

     

收到'有爱的地方有生命'

以及容器中运行的服务器脚本的预期输出:

  

port_test_server $ docker run -it --expose 8887 -p 8887:8887 ptserver

     

由('127.0.0.1',38694)

连接

所以服务器脚本在容器中运行,从容器外部运行的客户端脚本连接到端口,但似乎服务器脚本没有被触发。

以下是代码:

Docker文件:(将echo_client.py和echo_server.py复制到workdir)

FROM debian:jessie-slim
ENV DEBIAN_FRONTEND noninteractive

RUN apt-get update && apt-get install -y locales \
    && localedef -i en_US -c -f UTF-8 en_US.UTF-8
ENV LANG en_US.utf8

RUN apt-get update && apt-get install -y libssl-dev libsnappy-dev python python-pip python-dev gcc git curl
RUN easy_install --upgrade pip

RUN mkdir /test_wd
WORKDIR /test_wd
COPY . /test_wd
RUN chmod +x *.py
RUN ls
CMD ./echo_server.py

服务器脚本echo_server.py:

import socket

HOST = localhost  # Hostname to bind
PORT = 8887  # Open non-privileged port 8888

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(10)
while 1:
    conn, addr = s.accept()
    print 'Connected by', addr
    while 1:
        data = conn.recv(1024)
        if not data: break
        conn.send(data)
conn.close()

客户端脚本echo_client.py:

import socket

HOST = 'localhost'  # Set the remote host, for testing it is localhost
PORT = 8887  # The same port as used by the server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.send('where there is love there is life')
data = s.recv(1024)
s.close()
print 'Received', repr(data)

运行容器的Docker命令:

  

port_test_server $ docker run -it --expose 8887 -p 8887:8887 ptserver

1 个答案:

答案 0 :(得分:1)

解决此问题的一种方法是使用主机网络模式启动容器

docker run -it --expose 8887 -p 8887:8887 --network host ptserver

在这种情况下,localhost将解析为主机IP地址。