繁体   English   中英

Docker中的Python WebSocket连接被拒绝

[英]Python WebSocket connection refused in Docker

我有一个 python socketio 应用程序,在本地运行时工作得很好。 但是,当我将其移至 Docker 时,外部客户端无法连接并抛出此错误:

socketio.exceptions.ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))

WebSocket 服务器非常基础,发布到0.0.0.0:8080 我的客户端应用程序监听localhost:8080 在我的 Docker 容器中,我暴露了 8080 端口。我猜我的容器设置不正确。:

Dockerfile:

FROM python:latest

WORKDIR /path/to/project

COPY requirements.txt .

RUN pip install --no-cache-dir -r requirements.txt

码头工人-compose.yml

version: "3.9"

services:
  app:
    build: .
    working_dir: /path/to/project
    stdin_open: true
    tty: true
    ports:
      - "8080:8080"
    volumes:
      - type: bind
        source: .
        target: /path/to/project

我用docker-compose up启动我的容器,我正在使用 Docker Desktop(如果有帮助的话)。 我使用这个环境进行开发,所以我用python my_server.py启动我的服务器。 服务器启动成功。 我还缺少什么?

根据其他人在网上对这个问题的看法,我尝试了以下方法

  • 显式设置0.0.0.0为主机
  • 在我的 Dockerfile 中使用EXPOSE 8080
  • 将网络模式设置为host

您的容器连接似乎很好。

您尚未指定要在容器中运行的任何命令。 为了确保您的服务器实际上在端口 8080 上运行,您可以在 Dockerfile 中添加CMD指令或在 docker docker-compose.yaml中指定 cmd 。 这可以通过以下方式完成:

CMD ["python", "my_server.py"]

或者使用docker-compose.yaml文件作为:

version: "3.9"

services:
  app:
    build: .
    working_dir: /path/to/project
    stdin_open: true
    tty: true
    command: python my_server.py #<== this overrides the Dockerfile CMD instruction
    ports:
      - "8080:8080"
    volumes:
      - type: bind
        source: .
        target: /path/to/project

您可以在此处了解有关docker-compose.yamlcommand的更多信息。

这也是使用 docker 开发的推荐方式。 在正在运行的容器中运行命令以进行开发工作不是正确的方法。 每次测试新更改时,您基本上都会运行 docker compose。 这避免了很多像这样的连接不起作用的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM