【问题标题】:Traefik 2.2 + Docker + Websocket (ws) not workingTraefik 2.2 + Docker + Websocket (ws) 不工作
【发布时间】:2020-12-12 06:55:07
【问题描述】:

我已经设法让它 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') 

不知道还有什么可以尝试的。 提前谢谢你。

EDIT 在 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

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

【问题讨论】:

    标签: docker websocket traefik ws


    【解决方案1】:

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

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

    编辑:

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

    【讨论】:

    • 感谢您的回答,但事实并非如此。实际上容器位于不同的网络上......这就是它不起作用的原因。你能改变你的答案让我接受吗?
    • 我明白了,感谢您的澄清。编辑的答案以反映不同的网络
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-20
    • 2018-04-16
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多