【问题标题】:Traefik + Docker for Windows: Failed to create a client for docker, error: protocol not available & Provider connection error protocol not availableTraefik + Docker for Windows:无法为 docker 创建客户端,错误:协议不可用和提供程序连接错误协议不可用
【发布时间】:2020-09-01 05:59:35
【问题描述】:

我无法让基本的 Traefik 路由设置正常工作。

我的目标是使用两个 helloworld 应用程序(每个应用程序不同以区分)获得基本路由,两者都在端口 80 上,例如:

  • demo1.localhost -> helloworld1
  • demo2.localhost -> helloworld2

如果我通过docker run 单独运行它们,每个图像都可以正常工作。

使用我的项目目录 /app 中的 Powershell,当我运行 docker-compose up 时,我得到以下信息:

Traefik 服务启动,我可以正常访问仪表板但路由表没有显示我的路线。 demo1 和 demo2 启动正常,但显然我无法连接到它们,因为路由不起作用。

即使所有服务都成功启动 - 我反复收到以下错误

traefik | ... "Failed to create a client for docker, error: protocol not available" providerName=docker
traefik | ... "Provider connection error protocol not available, retrying ..." providerName=docker

我在下面包含了我的 docker-compose.yml 文件,这是我的目录中唯一的文件 /app

docker-compose.yml:

# app/docker-compose.yml

version: '3.8'
networks:
  myweb:
    driver: nat

services:
  proxy:
    image: traefik:v2.3.0-rc4-windowsservercore-1809
    container_name: traefik
    ports:
      - "80:80"
      - "8080:8080"
    volumes:
      - source: '\\.\pipe\docker_engine'
        target: '\\.\pipe\docker_engine'
        type: npipe
    command:
      - "--api.insecure=true"
      - "--providers.docker"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
    networks:
      - myweb
    labels:
      - "traefik.http.routers.dashboard.rule=Host(`dash.localhost`)"
      - "traefik.docker.network=app_myweb"

  demo1:
    image: helloworld:1
    container_name: demo1
    labels:
      - "traefik.enable=true"
      - "traefik.docker.network=app_myweb"
      - "traefik.port=80"
      - "traefik.http.routers.demo1.rule=Host(`demo1.localhost`)"
# Have tried this below, doesn't help.
#    volumes:
#      - source: '\\.\pipe\docker_engine'
#        target: '\\.\pipe\docker_engine'
#        type: npipe
    networks:
      - myweb
    depends_on:
      - proxy

  demo2:
    image: helloworld:2
    container_name: demo2
    labels:
      - "traefik.enable=true"
      - "traefik.docker.network=app_myweb"
      - "traefik.port=80"
      - "traefik.http.routers.demo2.rule=Host(`demo2.localhost`)"
    networks:
      - myweb
    depends_on:
      - proxy

我在某处看到一个建议,我应该在 Docker 桌面设置中启用设置 "Expose daemon on tcp://localhost:2375 without TLS",我已经这样做了,但没有帮助。

我的设置是:

  • 适用于 Windows 的 Docker 桌面 (v19.03.12)
  • Docker 使用 Windows 容器
  • Windows 10(10.0.18363 内部版本 18363)

问题 #1:

有人知道是什么原因造成的吗?

问题 #2:

请注意,在我的文件中,我还为仪表板设置了一条路由,从 dash.localhost 路由到 localhost:8080/dashboard,但即使这样也不起作用。知道如何让它工作吗?我需要告诉它从 80->8080 路由到仪表板吗?

【问题讨论】:

    标签: docker traefik


    【解决方案1】:

    根据他们 GitHub 上的 ticket,您似乎是:

    1. Traefik 命令行中缺少 --providers.docker.endpoint=npipe:////./pipe/docker_engine
    2. 在 Docker 期待 .\pipe\docker_engine 时共享 \\.\pipe\docker_engine

    尝试进行这两项更改,看看这是否有助于 Traefik 连接到您的 Docker 守护程序。在 Traefik 可以与 Docker 对话以读取容器的标签之前,您的所有路由都不会起作用。

    【讨论】:

    • #1 似乎已修复它。哥们,你是传奇! RE #2 当您说“共享 \\.\pipe\docker_engine”时,您的意思是在卷中:源和目标?如果我删除前 2 个斜线,它会中断。现在它正在工作,我还通过添加一个标签来指定路由端口 - traefik.http.services.traefik2.loadbalancer.server.port=8080,找出了 dash.localhost-> localhost:8080/dashboard 的路由。 (可在 22 小时内奖励赏金)
    猜你喜欢
    • 2017-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多