Не удается подключить клиент к серверу docker python

Я пытаюсь подключить сервер Python, работающий под докером (compose), и получаю сообщение об ошибке «Отказано в подключении» в Ubuntu. Любая помощь приветствуется.

Команда для сборки моего сервера с помощью docker compose:

sudo docker-compose up -d

клиент пытается подключиться с помощью curl: (192.168.1.149 — это статический IP-адрес машины Ubuntu), я пробовал с 127.0.0.1 и IP-адресом образа докера и 0.0.0.0 без каких-либо различий.

curl --data "Testing" 192.168.1.149:5149

Ответ от команды curl:

curl: (7) Failed to connect to 192.168.1.149 port 5149: Connection refused

докерфайл_тест:

FROM python:3.8
EXPOSE 5149
COPY ./test_main.py /
CMD ["python", "-u", "./test_main.py"]

докер-compose.yaml:

version: '3'
services:
  test_expose:
    build:
      context: /home/home/mydockers/custom_docker/test_expose_port
      dockerfile: dockerfile_test
    image: test_expose
    container_name: test_expose
    ports:
      - 5149:5149
    restart: unless-stopped

test_main.py:

import socket
import time

socket_receive_buffer = 4096

def main():
    try:
        print("Create socket")
        sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        print("Bind socket")
        sock.bind(('0.0.0.0', 5149))
        while True:
            print("In loop waiting for data")
            data, address = sock.recvfrom(socket_receive_buffer)
            print("received data")
            string_data = data.decode('utf-8')
            print(string_data)
    except Exception as e:
        print("got error")
        if sock is not None:
            sock.close()
        print("Exception " + str(e))
        time.sleep(60)

main()

person user1995546    schedule 09.01.2020    source источник
comment
Почему вы используете sudo с docker-compose?   -  person tripleee    schedule 09.01.2020
comment
пожалуйста, добавьте вывод из docker ps и docker logs CONATINER   -  person LinPy    schedule 09.01.2020


Ответы (1)


Вы используете UDP-сервер, поэтому:

  1. Ваша переадресация портов должна быть переадресацией портов UDP, по умолчанию это TCP.
  2. curl отправляет HTTP-запрос, который выполняется через TCP. Так что curl никогда не сможет поговорить с вашим сервером.

Помимо этих двух проблем, которые необходимо исправить, я бы также предложил:

  1. Не используйте UDP, обычно нет причин его использовать.
  2. Не пишите собственный сетевой протокол, обычно для этого нет причин. Просто создайте что-нибудь поверх HTTP.
  3. Если вам нужно сделать одно или другое, используйте сетевой фреймворк (Twisted, Tornado, asyncio), который сделает все это намного проще.
person Itamar Turner-Trauring    schedule 09.01.2020
comment
Спасибо за подробности. Я добавил udp в переадресацию портов и использовал свой собственный клиент python, и все заработало, как и ожидалось. Ценю вашу помощь. Строка переадресации портов изменена на: - 5149:5149/udp И файл клиента python test_client.py: import socket sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.sendto(Test data string.encode(utf-8) , (192.168.1.149, 5149)) - person user1995546; 09.01.2020