Невозможно подключить клиента к docker python серверу - PullRequest
0 голосов
/ 09 января 2020

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

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

sudo docker-compose up -d

клиент пытается подключиться с помощью curl: (192.168.1.149 - это stati c IP Ubuntu машина), я пытался с 127.0.0.1 и IP-адресом docker изображения и 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

dockerfile_test:

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

docker -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()

1 Ответ

0 голосов
/ 09 января 2020

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

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

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

  1. Не использовать UDP обычно нет причин использовать его.
  2. Не пишите собственный сетевой протокол, обычно нет причин делать это. Просто создайте что-нибудь поверх HTTP.
  3. Если вам нужно сделать одно или другое, используйте сетевую среду (Twisted, Tornado, asyncio), которая сделает все это намного проще.
...