0

我正在设置一个 docker swarm 并尝试在 docker manager 上运行 traefik reverse 和 portainer+agent。但是容器不是公开的。

我是 docker 和反向代理的新手,所以我尝试的不仅仅是显示的代码。

开始: docker stack deploy -c stack.yml stack0

堆栈.yml

version: "3.3"
services:
  traefik:
    image: traefik
    command: --docker.swarmmode
    networks:
      - traefik-net
    ports:
      - "80:80"
      - "443:443"
      - "8080:8080"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./traefikdata:/etc/traefik
    deploy:
      placement:
        constraints: [node.role==manager]

  portainer-agent:
    image: portainer/agent
    environment:
      AGENT_CLISTER_ADDR: tasks.agent
      AGENT_PORT: 9001
      LOG_LEVEL: debug
    ports:
      - target: 9001
        published: 9001
        protocol: tcp
        mode: host
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /var/lib/docker/volumes:/var/lib/docker/volumes
    networks:
      - portainer-agent_network
      - traefik-net
    deploy:
      mode: global
      placement:
        constraints: [node.platform.os == linux]

  portainer:
    image: portainer/portainer
    command: -H tcp://tasks.agent:9001 --tlsskipverify
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
      - "./portainerdata:/data"
    networks:
      - portainer-agent_network
      - traefik-net
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints: [node.role == manager]
      labels:
        - "traefik.enable=true"
        - "traefik.port=9000"
        - "traefik.docker.network=stack0_traefik-net"
        - "traefik.frontend.rule=Host:portainer.intern.domain.tld"

networks:
  traefik-net:

  portainer-agent_network:
    driver: overlay
    attachable: true

traefikdata/traefik.toml

logLevel = "INFO"
  defaultEntryPoints = ["http", "https"]

[web]
  address = ":8080"

[docker]
  domain = "traefik.intern.domain.tld"
  watch = true
  exposedbydefault = false

 # Force HTTPS
[entryPoints]
  [entryPoints.http]
  address = ":80"
    [entryPoints.http.redirect]
    entryPoint = "https"
  [entryPoints.https]
  address = ":443"
    [entryPoints.https.tls]

 # Let's encrypt configuration
 [acme]
   email="network@techgods.biz"
   storage="/etc/traefik/acme/acme.json"
   entryPoint="https"
   acmeLogging=true
   OnHostRule=true
   [acme.httpChallenge]
     entryPoint = "http"

我希望有一个正在运行的 Traefik 反向代理,UI 可通过 traefik.intern.domain.tld 访问,portainer 可通过 portainer.intern.domain.tld 访问

4

2 回答 2

1

为了完全明确,我还将entryPoints定义:

- "traefik.frontend.entryPoints=https"

你确定这部分是正确的吗?

- "traefik.docker.network=stack0_traefik-net"

它似乎与您的网络定义不一致:

networks:
  traefik-net:

  portainer-agent_network:
    driver: overlay
    attachable: true

我强烈建议在没有网络定义的情况下让它工作,然后一次添加这些。

于 2019-06-23T02:49:31.973 回答
0

在尝试恢复我的 stack.yml 数小时后,我从头开始,阅读了更多文档并发现了很多有用的 stackoverflow 帖子。

最后,我实际上有这个:

version: "3"

services:

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

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

networks:
  proxy:

现在我需要让搬运工代理工作。我会努力的。在第一个视图 portainer 和 traefik 可以在正确的端口上访问。SSL 还没有,但我的问题如下。

  • 实际上portainer.intern.domain.tld:5001traefik.intern.domain.tld:5001两者仍然存在portainer,但traefik.intern.domain.tld:5001不应该是可达的 - 只是:5003-traefik也反过来。
  • 在文档中,我读到对于集群操作,需要 kv 存储才能跨多个主机使用 acme 证书。尽管如此,我还是在网络中找到了带有 acme.json 配置的配置(用于 swarm 操作)。kv存储是强制性的吗?
  • 如果他们是 portainer 和 traefik 前面的第一个基本身份验证,我将非常感激 - 稍后想将其编辑为证书。我对 traefik.toml 中的配置有所了解 - 但如果我对 compose 文件做了其他任何事情,这是正确的方法吗?
  • SSL 也是如此 - 我对 traefik.toml 的配置有所了解,但它是正确的方法吗?将所有这些存储在撰写文件中怎么样?

提前谢谢你。

于 2019-06-24T09:02:52.087 回答