无法将客户端连接到 docker python 服务器
Can't connect client to docker python server
我正在尝试在 docker 下连接 python 服务器 运行(撰写),但在 Ubuntu 上出现 "Connection Refused" 错误。任何帮助表示赞赏。
使用 docker compose 构建我的服务器的命令:
sudo docker-compose up -d
客户端尝试使用 curl 连接:(192.168.1.149 是 Ubuntu 机器的静态 IP),我尝试使用 127.0.0.1 和 docker 图像的 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
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()
您是 运行 UDP 服务器,所以:
- 您的端口转发需要是 UDP 端口转发,默认情况下是 TCP。
curl
正在发送通过 TCP 运行的 HTTP 请求。所以 curl
将永远无法与您的服务器通信。
除了这两个需要解决的问题,我还建议:
- 不要使用 UDP,通常没有理由使用它。
- 不要编写自定义网络协议,通常没有理由这样做。只需在 HTTP 之上构建一些东西。
- 如果您确实需要做其中之一,请使用网络框架(Twisted、Tornado、asyncio),这将使这一切变得更加简单。
我正在尝试在 docker 下连接 python 服务器 运行(撰写),但在 Ubuntu 上出现 "Connection Refused" 错误。任何帮助表示赞赏。
使用 docker compose 构建我的服务器的命令:
sudo docker-compose up -d
客户端尝试使用 curl 连接:(192.168.1.149 是 Ubuntu 机器的静态 IP),我尝试使用 127.0.0.1 和 docker 图像的 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
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()
您是 运行 UDP 服务器,所以:
- 您的端口转发需要是 UDP 端口转发,默认情况下是 TCP。
curl
正在发送通过 TCP 运行的 HTTP 请求。所以curl
将永远无法与您的服务器通信。
除了这两个需要解决的问题,我还建议:
- 不要使用 UDP,通常没有理由使用它。
- 不要编写自定义网络协议,通常没有理由这样做。只需在 HTTP 之上构建一些东西。
- 如果您确实需要做其中之一,请使用网络框架(Twisted、Tornado、asyncio),这将使这一切变得更加简单。