Traefik + Docker for Windows: Failed to create a client for docker, error: protocol not available & Provider connection error protocol not available

Traefik + Docker for Windows: Failed to create a client for docker, error: protocol not available & Provider connection error protocol not available

我在使用基本的 Traefik 路由设置时遇到问题。

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

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

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

Traefik 服务启动,我可以很好地访问仪表板但是路由 table 不显示我的路由 。 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",我已经这样做了,但没有帮助。

我的设置是:

问题 #1:

有人知道是什么导致了这个问题吗?

问题 #2:

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

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

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

尝试进行这两项更改,看看这是否有助于 Traefik 连接到您的 Docker 守护程序。 None 你的路线将工作,直到 Traefik 可以与 Docker 交谈以读取你的容器的标签。