Docker Swarm + Traefik:通过前端规则展示Traefik GUI;服务/容器端口重定向

时间:2018-01-12 17:45:28

标签: docker docker-swarm traefik docker-swarm-mode

我正在尝试将Traefik与Docker Swarm后端一起使用,我正在使用下面的堆栈文件:

version: "3"

services:

  traefik:
    image: traefik:1.5
    command: --web --docker --docker.swarmmode --docker.watch --docker.domain=sample.com --logLevel=DEBUG 
    deploy:
      placement:
        constraints: [node.role==manager]
      restart_policy:
        condition: on-failure
      labels:
        - "traefik.port=8080"
        - "traefik.docker.network=sample-network"
        - "traefik.frontend.rule=Host:traefik.sample.com"
    ports:
      - "80:80"
      - "8080:8080"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /dev/null:/traefik.toml
    networks:
      - sample-network

  portainer:
    image: portainer/portainer:latest
    command: --no-auth -H unix:///var/run/docker.sock
    deploy:
      placement:
        constraints: [node.role == manager]
      labels:
        - "traefik.portainer.port=7777"
        - "traefik.docker.network=sample-network"
        - "traefik.frontend.rule=Host:portainer.sample.com"
    ports:
      - "7777:9000"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - sample-network

networks:
  sample-network:

我有2个问题,我试图解决这个问题:

1)(通过前端规则公开Traefik仪表板)我可以在sample.com:8080访问Traefik的网络信息中心,但我无法通过traefik.sample.com访问它。

2)(容器/服务上的端口重定向)我可以通过sample.com:7777访问Portainer GUI,但我无法通过portainer.sample.com访问它。我对端口重定向更好奇,因为如果我遇到2个图像发布到同一个端口,我将如何在单个堆栈文件中设置2个服务?我的服务标签声明将在traefik.port=XXXX

发生冲突

1 个答案:

答案 0 :(得分:0)

你不需要traefik服务本身的traefik标签。它是通过指定端口从外部访问的:

  ports:
  - "80:80"
  - "8080:8080"
  - "443:443"

在portainer服务上,您不需要端口映射,因为您可能希望使用traefik路由请求。 因为traefik和portainer在同一个docker网络中,traefik可以访问每个端口上的portainer。 因此,traefik的端口必须匹配真正的移植端口:

 labels:
    - "traefik.port=9000"
    - "traefik.docker.network=sample-network"
    - "traefik.frontend.rule=Host:portainer.sample.com"

在当前设置中,您必须使用Host:portainer.sample.com请求traefik。 您可以使用

进行测试
curl --verbose --header 'Host: portainer.sample.com' 'http://<DockerhostIp>:80'

修改:更新了卷曲

编辑2:对PO编辑的反应

portainer.sample.com DNS条目必须指向您的泊坞主机。然后traefik将它传送到正确的容器。

另一种方法是指定一个traefik前缀:

 "traefik.frontend.rule=Host:site1.org;PathPrefixStrip: /sub/"

根据规则,site1.org/sub上的所有请求都将路由到此特定服务/容器。

看一看 Traefik-Docker-Sample

编辑3:

仪表板/ webui的自我路由应该与:

一起使用
  labels:
    - "traefik.port=8080"
    - "traefik.docker.network=sample-network"
    - "traefik.frontend.rule=Host:traefik.sample.com"

请确保您拥有traefik.sample.com的DNS条目。 要检查traefik设置是否有效,您还可以运行

 curl --verbose -H Host:traefik.sample.com <DockerHostIp>