Используйте простой python tcp скрипт для соединения двух контейнеров Docker на одном хост-компьютере, но получил ошибку «Ошибка подключения» - PullRequest
0 голосов
/ 22 февраля 2020

У меня есть сервер и клиентский 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)

Чтобы избежать потенциальных ошибок, я просто запускаю 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, а не в моем коде. Любое предложение будет оценено.

1 Ответ

0 голосов
/ 22 февраля 2020

Я понял это с помощью this

Просто измените ip хоста сервера: HOST, PORT = ", 1234, чтобы сокет сервера не был слишком ограничен для приема сообщений. HOST = localhost сделает подключение из другой сети невозможным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...