使用一个简单的python-tcp脚本连接同一主机上的两个Docker容器,但出现连接拒绝错误



我有一个服务器和一个客户端docker容器在同一个AWS EC2上运行,我试图让它们通过使用Tcp协议进行通信,但得到了:

Traceback (most recent call last):
File "testClient.py", line 13, in <module>
s.connect((HOST, PORT))
ConnectionRefusedError: [Errno 111] Connection refused

这是我的服务器容器代码:

import socket
import sys
HOST, PORT = "localhost", int(sys.argv[2])
protocol = sys.argv[1]
print(protocol, HOST, PORT)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = (HOST, PORT)
sock.bind(server_address)
sock.listen(1)
connection, client_address = sock.accept()
while True:
data = connection.recv(20)
if not data: break
print('received data: ', data)
connection.send(data.upper())
connection.close()

和客户端容器:

import socket
import sys
protocol = sys.argv[1]
HOST = sys.argv[2]
PORT = int(sys.argv[3])
print(protocol, HOST, PORT)
# HOST, PORT = "localhost", 9998
command = " ".join(sys.argv[4:])
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.send(command.encode('utf-8'))
data = s.recv(1024)
s.close()
print('received data: ', data)

为了避免潜在的错误,我只使用交互式shell运行docker,然后手动运行python代码:

docker run -it --rm --name node_server -p 4444:4444 server
/# python3 Server.py ts 4444
docker run --rm -it --name node_client -p 8888:8888 client
/# python3 Client.py ts 172.17.0.2 4444 put a 3

我放在客户端的ip地址来自docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' server

我在暴露服务器的端口上运气不佳,所以我也尝试添加--link server来运行客户端容器,并将---network=test添加到两个容器,但它给了我相同的错误。

顺便说一句,我在主机上使用了telnet 172.17.0.2 4444,它也给了我拒绝连接的消息。

我的其他同学在同一个环境中使用java做同样的事情,他们没有遇到任何连接问题。

我是docker的新手,但从我的角度来看,我认为问题来自docker配置,而不是我的代码。任何建议都将不胜感激。

我通过使用这个来计算

只需更改服务器的主机ip:HOST, PORT = ", 1234,服务器套接字就不会受到太大的限制,无法接收消息。HOST = localhost将使来自其他网络的连接变得不可能。

最新更新