Traefik 2.2 + Docker + Websocketws无法正常工作

问题描述

我设法使Traefik适用于http容器,但是当我切换到websocket时,没有运气。 Traefik非常简单。让我分享它的docker-compose文件:

version: "3.3"
services:

  traefik:
    image: "traefik:v2.2"
    container_name: "traefik"
    command:
      - "--log.level=DEBUG"
      - "--api.insecure=true"
      - "--providers.docker=true"
#      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entryPoints.ws.address=:81" #I ADDED THIS
      - "--accesslog"
    ports:
      - "80:80"
      - "81:81" #I ADDED THIS
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"

为了简化操作,我添加了#I ADDED THIS并添加了注释,以便您看到为使WS工作而进行的更改。

现在在实际项目docker-compose上,我添加了以下标签:

version: '2.1'

services:
  test:
    restart: unless-stopped
    hostname: test
    build:
      context: .
      dockerfile: ./Dockerfile    
    expose:
      - 81
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.test.rule=Host(`test.com`)"
      - "traefik.http.routers.test.entrypoints=ws"
      - "traefik.http.services.test.loadBalancer.sticky.cookie=true"

我正在尝试使用Nodejs进行连接:

  var ws = new WebSocket('ws://test.com:81') 

不知道还能尝试什么。 谢谢你。

编辑:看到了traefik日志:

time="2020-08-23T16:07:28Z" level=debug msg="vulcand/oxy/roundrobin/rr: completed ServeHttp on request" Request="{\"Method\":\"GET\",\"URL\":{\"Scheme\":\"\",\"Opaque\":\"\",\"User\":null,\"Host\":\"\",\"Path\":\"/\",\"RawPath\":\"\",\"ForceQuery\":false,\"RawQuery\":\"\",\"Fragment\":\"\"},\"Proto\":\"HTTP/1.1\",\"ProtoMajor\":1,\"ProtoMinor\":1,\"Header\":{\"Connection\":[\"Upgrade\"],\"Sec-Websocket-Extensions\":[\"permessage-deflate; client_max_window_bits\"],\"Sec-Websocket-Key\":[\"jaXhUWe2lvrgxF0tOn3nWA==\"],\"Sec-Websocket-Version\":[\"13\"],\"Upgrade\":[\"websocket\"],\"X-Forwarded-Host\":[\"test.com:81\"],\"X-Forwarded-Port\":[\"81\"],\"X-Forwarded-Proto\":[\"ws\"],\"X-Forwarded-Server\":[\"58077bdceffd\"],\"X-Real-Ip\":[\"192.168.99.1\"]},\"ContentLength\":0,\"TransferEncoding\":null,\"Host\":\"test.com:81\",\"Form\":null,\"PostForm\":null,\"MultipartForm\":null,\"Trailer\":null,\"RemoteAddr\":\"192.168.99.1:56705\",\"RequestURI\":\"/\",\"TLS\":null}"
192.168.99.1 - - [23/Aug/2020:16:07:07 +0000] "GET / HTTP/1.1" 499 21 "-" "-" 56 "test@docker" "http://172.19.0.2:81" 21082ms

看起来不错,但客户端/服务器之间仍然没有通信。

解决方法

我认为您需要将服务端口添加到test容器中:

- "traefik.http.services.test.loadbalancer.server.port=81"

编辑:

为了让traefik能够发现您的服务,它必须位于同一网络上。因此最好的解决方案似乎是为这两种服务定义外部网络,或者使用您的websocket服务定义的网络

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...