Python Docker Traefik无法路由websocket

Python Docker Traefik无法路由websocket,python,docker,websocket,docker-compose,traefik,Python,Docker,Websocket,Docker Compose,Traefik,我有几个微服务作为docker容器运行。所有web服务都可以正常工作并正确路由 唯一的问题是websocket服务。 websocket服务本身使用python websocket,并且有自己的TLS证书 正在尝试使用wss://websocket.localhost失败,在下面的设置中根本找不到页面。 在我以前的配置中,它会导致网关错误 显然,traefik是开箱即用的WebSocket,没有额外的配置 事实似乎并非如此。有什么建议吗 websocket连接在没有docker或traefik参

我有几个微服务作为docker容器运行。所有web服务都可以正常工作并正确路由

唯一的问题是websocket服务。 websocket服务本身使用python websocket,并且有自己的TLS证书

正在尝试使用
wss://websocket.localhost
失败,在下面的设置中根本找不到页面。 在我以前的配置中,它会导致网关错误

显然,
traefik
是开箱即用的WebSocket,没有额外的配置

事实似乎并非如此。有什么建议吗

websocket连接在没有docker或traefik参与的情况下工作,所以我排除了这个问题。 在此方面的任何帮助都将不胜感激

docker compose.yml
版本:“3.7”
网络:
网状物:
外部:正确
内部:
外部:错误
卷数:
mysql\u数据:
服务:
特拉菲克:
图片:traefik:v2.2.1
容器名称:traefik
重新启动:始终
端口:
- "80:80"
- "443:443"
揭露:
- 8080
环境:
-/var/run/docker.sock:/var/run/docker.sock
卷数:
-/var/run/docker.sock:/var/run/docker.sock
-./config/:/config
-./traefik.yml:/traefik.yml
网络:
-网
-内部的
标签:
-traefik.http.routers.traefik.tls=true
-traefik.http.routers.traefik.entrypoints=secure
-traefik.http.routers.traefik.rule=Host(`traefik.localhost`)
-traefik.http.routers.traefik.service=api@internal
打瞌睡:
图片:amir20/dozzle:latest
容器名称:dozzle
重新启动:始终
卷数:
-/var/run/docker.sock:/var/run/docker.sock
揭露:
- 8080
标签:
-traefik.http.routers.dozzle.tls=true
-traefik.http.routers.dozzle.entrypoints=secure
-traefik.http.routers.dozzle.rule=Host(`dozzle.localhost`)| Host(`logs.localhost`)
网络:
-内部的
db:
图片:mysql:最新版本
容器名称:db
环境:
MYSQL\u ROOT\u密码:########
重新启动:始终
健康检查:
测试:“退出0”
命令:---默认身份验证插件=mysql\u本机\u密码
端口:
- '3306:3306'
卷数:
-mysql\u数据:/var/lib/mysql
网络:
-内部的
websocket:
图像:本地websocket图像
容器名称:websocket阶段
重新启动:失败时
命令:pythonserver.py
取决于:
db:
状况:服务健康
揭露:
- 8080
网络:
-网
-内部的
环境:
-路径到配置=/src/setup.cfg
卷数:
-${PWD}/docker配置:/src
-${PWD}/config/certs/socket:/var
标签:
-traefik.http.routers.core socket stage router.tls=true
-traefik.http.routers.core socket stage router.entrypoints=secure
-traefik.http.routers.core socket stage router.rule=Host(`websocket.localhost`)
traefik.yml
入口点:
不安全的:
地址:80
http:
重定向:
入口点:
致:安全
方案:https
安全:
地址:443
日志:
级别:信息
访问日志:
文件路径:“traefik access.log”
缓冲大小:100
应用程序编程接口:
仪表板:正确
不安全:真的
ping:{}
供应商:
文件:
文件名:/config/dynamic.yml#traefik动态配置
watch:true#每次更改时都会重新加载
码头工人:
端点:“unix:///var/run/docker.sock"
exposedByDefault:true
配置
tls:
商店:
违约:
默认证书:
证书文件:cert.crt
keyFile:key.key
证书:
-证书文件:crt.crt
keyFile:key.key
商店:
-违约
域:
-主:“本地主机”

查看您的配置时,以下内容不适用:

  • docker compose projectname将成为域名的一部分。默认设置是使用docker-compose.yaml的父文件夹名称。您没有在这里指定它,因此我假定它是通过
    traefik
    指定的。您可以在docker compose调用中使用
    docker compose-p traefik up
    或通过设置env变量PROJECT\u NAME显式设置此选项

  • 您正在使用域名“.localhost”,但没有明确定义域名。这意味着使用默认名称,该名称源自服务名称、项目名称(存储docker compose文件的文件夹)以及使用此模式附加到的docker网络名称:
    servicename.projectname\u networkname
    。 使用属性
    hostname
    domainname
    明确定义名称(仅适用于
    internal=false
    的网络)。 如果有两个网络连接和另外一个域名定义,您将获得以下域名:

  • db.traefik_internal(仅intern、db.localhost不工作)
  • dozzle.traefik_internal(仅实习生,dozzle.localhost将不工作)
  • traefik.localhost
  • traefik.traefik_网站
  • traefik.traefik_内部
  • websocket.localhost
  • websocket.traefik_网站
  • websocket.traefik_内部
  • external=true
    仅表示网络是由
    docker network create
    或另一个docker compose项目在外部创建的。主要效果是,在执行
    docker compose down
    时不会删除它。这与与外界的联系无关。 要获得隔离的内部网络,必须使用选项
    internal:true

  • 版本:“3.7”
    不再支持选项
    条件:服务健康
    ,因此请删除该选项(尽管它不能像您预期的那样工作)或将版本更改为
    2.4

这里是我当前版本的
version: "2.4"

networks:
  web:
  internal:
    internal: true

volumes:
  mysql_data:

services:
  traefik:
    image: traefik:v2.2.1
    container_name: traefik
    hostname: traefik
    domainname: localhost
    restart: always
    ports:
      - "80:80"
      - "443:443"
    expose:
      - 8080
    environment:
      - /var/run/docker.sock:/var/run/docker.sock
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./config/:/config
      - ./traefik.yml:/traefik.yml
    networks:
      - web
      - internal
    labels:
      - traefik.http.routers.traefik.tls=true
      - traefik.http.routers.traefik.entrypoints=secure
      - traefik.http.routers.traefik.rule=Host(`traefik.localhost`)
      - traefik.http.routers.traefik.service=api@internal

  dozzle:
    image: amir20/dozzle:latest
    container_name: dozzle
    hostname: dozzle
    domainname: localhost
    restart: always
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    expose:
      - 8080
    labels:
      - traefik.http.routers.dozzle.tls=true
      - traefik.http.routers.dozzle.entrypoints=secure
      - traefik.http.routers.dozzle.rule=Host(`dozzle.traefik_internal`) || Host(`logs.localhost`)
    networks:
      - internal

  db:
    image: mysql:latest
    container_name: db
    hostname: db
    domainname: localhost
    environment:
      MYSQL_ROOT_PASSWORD: ########
    restart: always
    healthcheck:
      test: "exit 0"
    command: --default-authentication-plugin=mysql_native_password
    ports:
      - '3306:3306'
    volumes:
      - mysql_data:/var/lib/mysql
    networks:
      - internal

  websocket:
    image: local-websocket-image
    container_name: websocket-stage
    hostname: websocket
    domainname: localhost
    restart: on-failure
    command: python server.py
    depends_on:
      db:
        condition: service_healthy
    expose:
      - 8080
    networks:
      - web
      - internal
    environment:
      - PATH_TO_CONFIG=/src/setup.cfg
    volumes:
      - ${PWD}/docker-config:/src
      - ${PWD}/config/certs/socket:/var
    labels:
      - traefik.http.routers.core-socket-stage-router.tls=true
      - traefik.http.routers.core-socket-stage-router.entrypoints=secure
      - traefik.http.routers.core-socket-stage-router.rule=Host(`websocket.localhost`)