Python Docker Traefik无法路由websocket
我有几个微服务作为docker容器运行。所有web服务都可以正常工作并正确路由 唯一的问题是websocket服务。 websocket服务本身使用python websocket,并且有自己的TLS证书 正在尝试使用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参
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的父文件夹名称。您没有在这里指定它,因此我假定它是通过
指定的。您可以在docker compose调用中使用traefik
或通过设置env变量PROJECT\u NAME显式设置此选项docker compose-p traefik up
- 您正在使用域名“.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 compose项目在外部创建的。主要效果是,在执行docker network create
时不会删除它。这与与外界的联系无关。 要获得隔离的内部网络,必须使用选项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`)