Traefik docker image在Windows上不起作用,但在MacOS上起作用?

时间:2019-08-19 06:30:50

标签: docker traefik

我有一个应用程序,它由在MacOS上开发的几个Docker映像组成,我正在尝试使其在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 ../

3 个答案:

答案 0 :(得分:1)

好的,我会尽力指导您解决许多问题。

    找不到
  • 404(只是一个句子)-通常是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桌面,转到“共享驱动器”选项卡。添加驱动器,例如作为示例,我将K映射到例如K:\数据。
  • 在下面,您可以从docker-compose.yml文件中找到许多示例。在这些示例中,我使用份额“ K => k:/ data”。

第一个示例显示了如何在适用于Windows的Docker上启动完整的Jenkins环境。在Jenkins环境中,对Docker Engine进行了引用,因此对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"

Windows上另一个docker-compose.yml文件中的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仪表板。使用它来查看您拥有哪些前端和后端。稍微更改卷即可在Windows的Docker上运行它。

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

    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"

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

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

如果您在Windows的Docker上无法获得Traefik的路由工作,可以将其用作框架,首先从“ docker hello world”示例开始,然后通过Treafik对其进行访问。获得适用于Windows的Docker上的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重击:$ export 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

我希望这些技巧能帮助您及时解决问题!大获成功!询问问题是否需要更多帮助。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

看起来像docker-compose.yml的问题

此行:

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

还有一个:

build: ${WORKSPACE}/go-home/load_balancer

可以使用相对路径代替系统变量吗? here

给出了一些解释