Traefik docker 映像不能在 Windows 上运行但在 MacOS 上运行?

Posted

技术标签:

【中文标题】Traefik docker 映像不能在 Windows 上运行但在 MacOS 上运行?【英文标题】:Traefik docker image not working on Windows but working on MacOS? 【发布时间】:2019-12-24 08:43:52 【问题描述】:

我有一个由多个 Docker 映像组成的应用程序,该应用程序正在 MacOS 上开发,我正在尝试在 Windows 上启动它。大多数似乎都在工作,但有一个 Traefik 负载均衡器没有。

在 MacOS 上它可以正常工作,但在 Windows 上,无论我访问什么 URL,它都会给我一个 404,实际内容只是“找不到 404 页面”。

Traefik 配置如下所示:

logLevel = "INFO"
defaultEntryPoints = ["http", "https"]
[entryPoints]
  [entryPoints.http]
   address = ":80"
  [entryPoints.https]
   address = ":443"
    [entryPoints.https.tls]
    [entryPoints.https.tls.defaultCertificate]
      certFile = "/certs/cert.pem"
      keyFile = "/certs/cert.pem"
# Connection to docker host system (docker.sock)
[docker]
watch = true
domain = "localhost"
[file]
 [backends]
  [backends.backend-mixpanel]
     [backends.backend-mixpanel.servers]
      [backends.backend-mixpanel.servers.mixpanel]
        url = "https://api.mixpanel.com"
        weight = 10
  [backends.backend-yieldify]
     [backends.backend-yieldify.servers]
      [backends.backend-yieldify.servers.yieldify]
        url = "https://td.yieldify.com/"
        weight = 0
 [frontends]
     [frontends.frontend-mixpanel]
       backend = "backend-mixpanel"
      [frontends.frontend-mixpanel.routes.one]
        rule = "HostRegexp:localhost,catchall:.*;Path:/mixpanel/.*;PathPrefixStripRegex:/mixpanel"
        priority=10
     [frontends.frontend-yieldify]
       backend = "backend-yieldify"
      [frontends.frontend-yieldify.routes.two]
        rule = "HostRegexp:localhost,catchall:.*;Path:/yieldify/.*"
        priority=0

虽然 Dockerfile 包含:

FROM traefik:alpine

RUN apk add --update openssl

RUN mkdir -p /certs

RUN openssl req -x509 -newkey rsa:2048 -keyout key.pem -out ca.pem -days 1080 -nodes -subj '/C=UK/ST=London/L=London/O=ProjectX/OU=Engineering team/CN=local.wif'

RUN cat key.pem ca.pem > /certs/cert.pem

相关的 docker-compose.yml 部分包含:

  lb:
    image: load-balancer
    build: $WORKSPACE/go-home/load_balancer
    ports:
    - 80:80
    - 443:443
    links:
    - wifi-ui-dev
    - wifi-ui-prod
    - portal
    - wifi-api
    env_file:
    - .env
    volumes:
    - /var/run/docker.sock:/var/run/docker.sock:ro,delegated
    - $PWD/load_balancer/traefik.toml:/etc/traefik/traefik.toml:ro,delegated

当我收到 404 时,我没有收到任何内容发送到该 Docker 映像的控制台(stdout 和 stderr)。

任何想法发生了什么或如何更接近它不起作用的原因?

我担心的一个问题是套接字音量:

- /var/run/docker.sock:/var/run/docker.sock:ro,delegated

检查正在运行的容器,文件看起来像一个套接字:

/ # ls -laF /var/run/docker.sock
srw-rw----    1 root     root             0 Sep  2 11:04 /var/run/docker.sock=

以防万一,我尝试将那行替换为:

- //./pipe/docker_engine:/var/run/docker.sock

或与:

- type: npipe
  source: ////./pipe/docker_engine
  target: /var/run/docker.sock
  consistency: delegated

这两者都导致套接字看起来像一个目录:

/ # ls -laF /var/run/docker.sock
total 4
drwxr-xr-x    2 root     root            40 Sep  3 14:52 ./
drwxr-xr-x    1 root     root          4096 Sep  3 14:57 ../

【问题讨论】:

看看这些有没有帮助? github.com/danprakash/windows-dockerfiles/tree/…, github.com/StefanScherer/dockerfiles-windows/blob/…? 【参考方案1】:

好的,我将尝试指导您解决一些问题。

404 not found(就像一句话) - 通常是 traefik 配置问题。不是常规网站 404。您可以通过查看 Traefik 容器的日志来验证这一点。 当 Traefik 没有以正确的顺序启动时,我遇到了类似的 404 问题。我们有时会在 Docker (Swarm) 堆栈之外单独部署 Traefik。然后我们部署堆栈(或其他组件)。您可以通过例如指定订单一个 docker-compose.yml 文件。这个'depends_on'并不准确,因为它只测试组件是否启动,而不是完全作为应用程序启动。 因为您的配置在 Mac 上运行,我的假设是 traefik 404 不是由于 Docker (Traefik) 网络配置造成的。 确定您使用的是哪个版本的 Treafik。自 Traefic 2 以来,发生了一些重要的变化。我使用:traefik:v1.7.11-alpine。 确保“traefik.enable”应明确设置为 true。我们看到,如果需要此设置,它会因环境而异。 如果您部署了一个正在运行的网站,您可以使用 Traefik 控制台(通过端口 8080)查看您已配置的内容。您会看到前端规则和后端。 环境文件是“.env”。在 Windows 上放置点文件需要特殊操作,例如通过 cygwin 或 Git bash。假设文件是​​存在的。

关于安装和 docker.sock?

分享。在 Windows 上,打开 Docker 桌面,转到“共享驱动器”选项卡。添加驱动器,例如D 或 K。例如,我将 K 映射到例如K:\数据。 您可以在下面找到来自 docker-compose.yml 文件的一些示例。我在这些示例中使用共享“K => k:/data”。

第一个示例展示了如何在 Docker for Windows 上启动一个完整的 Jenkins 环境。在 Jenkins 环境中引用了 Docker 引擎,因此在 Windows 上引用了 docker.sock。 这就是 我在我的 Docker for Windows 环境中日常使用的内容。效果很好!

version: '3'
services:
  jenkins:
    image: docker-jenkins-maven-npm-oc:latest
    ports:
      - "8888:8080"
    volumes:
      - //k/data/var/jenkins_home:/var/jenkins_home
      - /var/run/docker.sock:/var/run/docker.sock
  geosolschmea:
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=somedatabase
      - MYSQL_USER=johan
      - MYSQL_PASSWORD=bladibladibla
    volumes:
      - //k/data/var/mysql-data:/var/lib/mysql
    ports:
      - "3306:3306"

docker-compose.yml 文件中的另一个 Windows 上的 Spring 启动应用程序:

  geosolutionapp:
    image: myuser/geosolutions:latest
    build:
      context: ./
      dockerfile: Dockerfile
    depends_on:
      - geosolschmea
    environment:
      - SCDATALIMIT=100000
    ports:
      - 8080:8080
    volumes:
      - //k/data/spring-boot-app:/data/spring-boot-app
    networks:
      - geosolutionsnet

对于 Traefik,docker-compose.yml 可能看起来像(在 Linux、Amazon EC2 上)。这也将允许您显示 Traefik 仪表板。使用它来查看您拥有哪些前端和后端。稍微改变一下卷,你就可以在 Docker for Windows 上运行它了。

如果您更改 Treafik 文件的路径,您可以轻松地在 Docker for Windows 上运行它:

    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - //k/data/traefik/traefik.toml:/traefik.toml
      - //k/data/traefik/acme.json:/acme.json

每天在 Linux 上运行的完整工作(实时)示例是:

version: '3'
services:
  traefik:
    image: traefik:v1.7.11-alpine
    container_name: traefik
    restart: always
    networks:
      - geosolutionsnet
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /home/ec2-user/traefik/traefik.toml:/traefik.toml
      - /home/ec2-user/traefik/acme.json:/acme.json
    ports:
      - "80:80"
      - "443:443"
      - "8080:8080"
    labels:
      - "traefik.docker.network=geosolutionsnet"
      - "traefik.enable=true"
      - "traefik.frontend.rule=Host:yourwebsite.nl;PathPrefix:/traefik"
      - "traefik.port=8080"
      - "traefik.protocol=http"
      - "traefik.backend=traefik"

在 Docker for Windows 上使用 Traefik 时,我使用它来连接 traefik.toml 文件中的 docker 引擎:

[docker]
  endpoint = "unix:///var/run/docker.sock"
  domain = "yourwebsite.nl"
  watch = true
  exposedByDefault = false

如果您无法在 Docker for Windows 上为 Traefik 进行路由工作,您可以将其用作框架并首先从“docker hello world”示例开始,然后通过 Treafik 访问它。在 Docker for Windows 上获得基本路由工作 Traefik 后,您可以逐步添加您的真实应用程序。这可能感觉很长,但根据我们的经验,这很快就会奏效。

当然,并非所有端口都应该对外界可见。您可以使用更新版本的 docker-compose.yml 文件。

另一个使用 Treafik 的组件可能是这样的:

  geosolutionapp:
    image: myuser/myproduct:latest
    environment:
      - slackBotToken=xyz-etc
    ports:
      - 8080
    networks:
      - geosolutionsnet
    labels:
      - "traefik.enable=true"
      - "traefik.docker.network=geosolutionsnet"
      - "traefik.frontend.rule=Host:myapplication.nl"
      - "traefik.port=8080"
      - "traefik.protocol=http"

还有一个例子:

slackbotsimple:
    image: myuser/slackbotsimple:latest
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    depends_on:
      - traefik
    environment:
      - slackBotToken=xoxb-etc-etc-etc

仍然卡在 docker.sock 上?

如果上述方法没有帮助,您还可以使用如下方法:docker run -v //var/run/docker.sock:/var/run/docker.sock ... Powershell:运行 $Env:COMPOSE_CONVERT_WINDOWS_PATHS=1 Git bash:$ 导出 COMPOSE_CONVERT_WINDOWS_PATHS=1 $ docker-compose down && docker-compose up -d 确保 /var/run/docker.sock 具有正确的权限。在某些情况下,我必须通过以下方式手动设置权限: $ docker exec -u 0 -it bash ... 然后 # chmod 777 /var/run/docker.sock

希望这些提示能帮助您及时解决问题!非常成功!如果您需要更多帮助,请提出问题。

【讨论】:

@pupeno - 我添加了一些例子。第一个对你来说可能很有趣。这是一个在 Docker for Windows 上运行的 Jenkins 环境。这使用 /var/run/docker.sock。每天我在 Docker for Windows 上使用这个环境。也许这些和其他示例可以帮助您找到所需的内容。 @pupeno - 环境文件是“.env”。在 Windows 上放置点文件需要特殊操作,例如通过 cygwin 或 Git bash。假设该文件确实存在。 @pupeno - 当你使用一个标准的 Traefik 容器,而不是你描述的那个容器时,它是否允许你在没有 404 的情况下正确路由?【参考方案2】:

docker-compose.yml 似乎有问题

这一行:

- $PWD/load_balancer/traefik.toml:/etc/traefik/traefik.toml:ro,delegated

还有这个:

build: $WORKSPACE/go-home/load_balancer

你能用相对路径代替系统变量吗? 有的解释写here

【讨论】:

【参考方案3】:

要在 Windows 上运行基于 linux 的 docker 映像,需要满足一些要求:Windows 10 Pro 或更高版本,启用 Hyper-V 支持。

您还需要安装“Docker for Windows.exe”,这是一个管理器应用程序,可设置名为:MobyLinuxVM 的“Hyper-V VM”,其中包含一个能够运行 docker 容器的最小 linux 系统。 希望对您有所帮助!

【讨论】:

我安装了适用于 Windows 的 Docker,并且作为应用程序一部分的所有其他 docker 实例都可以正常运行。

以上是关于Traefik docker 映像不能在 Windows 上运行但在 MacOS 上运行?的主要内容,如果未能解决你的问题,请参考以下文章

traefik 代理后面的 docker 中的 gitlab 失败(通常)

Traefik 2 docker没有显示客户端真实IP

云原生之Docker实战使用Docker部署Traefik开源边缘路由器

Nextcloud 在 traefik on unraid 后面的 docker 中

text Wordpress堆栈与traefik #wordpress #docker #traefik

使用 docker-compose 和 traefik 实现微服务之间的通信