Docker swarm堆栈中的Portainer与Traefik拒绝连接

Docker swarm堆栈中的Portainer与Traefik拒绝连接,docker,docker-compose,traefik,docker-swarm-mode,portainer,Docker,Docker Compose,Traefik,Docker Swarm Mode,Portainer,我试图在docker compose swarm中包含Portainer,它由WordPress+MySQL和Traefik(反向代理)组成。我使用以下定义: version: '3' services: traefik: image: "traefik:v2.0.0-rc3" command: - "--api.insecure=true" - "--providers.docker=true" - "--providers.docke

我试图在docker compose swarm中包含Portainer,它由WordPress+MySQL和Traefik(反向代理)组成。我使用以下定义:

version: '3'

services:
  traefik:
    image: "traefik:v2.0.0-rc3"
    command:
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.swarmmode=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
    ports:
      - "80:80"
      - "8080:8080"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - traefik
    deploy:
      mode: global
      placement:
        constraints: [node.role==manager]

  portainer:
    image: portainer/portainer:latest
    command: -H unix:///var/run/docker.sock
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./portainer:/data
    networks:
      - traefik
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints: [node.role==manager]
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
      labels:
        - "traefik.enable=true"
        - "traefik.http.routers.portainer.entrypoints=web"

  db:
    image: mysql:5.7
    volumes:
      - ./db/initdb.d:/docker-entrypoint-initdb.d
    networks:
      - traefik
    environment:
      MYSQL_ROOT_PASSWORD: <root_password>
      MYSQL_DATABASE: <db_name>
      MYSQL_USER: <db_user>
      MYSQL_PASSWORD: <user_password>
    deploy:
      replicas: 1
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3

  app:
    image: my-repo/wordpress:latest
    networks:
      - traefik
    deploy:
      replicas: 2
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
      labels:
        - "traefik.enable=true"
        - "traefik.http.routers.app.rule=Host(`example.org`)"
        - "traefik.http.routers.app.entrypoints=web"
        - "traefik.http.services.app.loadbalancer.server.port=80"

networks:
  traefik:
版本:“3”
服务:
特拉菲克:
图片:“traefik:v2.0.0-rc3”
命令:
-“--api.unsecure=true”
-“--providers.docker=true”
-“--providers.docker.swarmmode=true”
-“--providers.docker.exposedbydefault=false”
-“--entrypoints.web.address=:80”
端口:
- "80:80"
- "8080:8080"
卷数:
-/var/run/docker.sock:/var/run/docker.sock
网络:
-特拉菲克
部署:
模式:全球
安置:
约束:[节点.角色==管理器]
手提电话:
图像:portainer/portainer:最新
命令:-Hunix:///var/run/docker.sock
卷数:
-/var/run/docker.sock:/var/run/docker.sock
-/portainer:/data
网络:
-特拉菲克
部署:
模式:复制
副本:1份
安置:
约束:[节点.角色==管理器]
重新启动\u策略:
条件:故障时
延迟:5秒
最多尝试次数:3次
标签:
-“traefik.enable=true”
-“traefik.http.routers.portainer.entrypoints=web”
db:
图片:mysql:5.7
卷数:
-./db/initdb.d:/docker入口点initdb.d
网络:
-特拉菲克
环境:
MYSQL\u ROOT\u密码:
MYSQL\u数据库:
MYSQL\u用户:
MYSQL\u密码:
部署:
副本:1份
重新启动\u策略:
条件:故障时
延迟:5秒
最多尝试次数:3次
应用程序:
图片:my repo/wordpress:最新
网络:
-特拉菲克
部署:
副本:2份
重新启动\u策略:
条件:故障时
延迟:5秒
最多尝试次数:3次
标签:
-“traefik.enable=true”
-“traefik.http.routers.app.rule=Host(`example.org`)”
-“traefik.http.routers.app.entrypoints=web”
-“traefik.http.services.app.loadbalancer.server.port=80”
网络:
特拉菲克:
除了便携机,一切都正常。当我访问localhost:9000时,我只得到一个被拒绝的连接。但是,以下非swarm模式docker compose工作正常:

version: '3'

services:
  traefik:
    image: "traefik:v2.0.0-rc3"
    container_name: "traefik"
    restart: always
    command:
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
    ports:
      - "80:80"
      - "8080:8080"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - traefik

  portainer:
    image: portainer/portainer
    command: -H unix:///var/run/docker.sock
    restart: always
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./portainer:/data
    ports:
      - "9000:9000"
      - "8000:8000"
    networks:
      - traefik
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.portainer.entrypoints=web"

  db:
    image: mysql:5.7
    restart: always
    volumes:
      - ./db/initdb.d:/docker-entrypoint-initdb.d
    networks:
      - traefik
    environment:
      MYSQL_ROOT_PASSWORD: <root_password>
      MYSQL_DATABASE: <db_name>
      MYSQL_USER: <db_user>
      MYSQL_PASSWORD: <user_password>

  app:
    image: my-repo/wordpress:latest
    restart: always
    depends_on:
      - db
    networks:
      - traefik
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.app.rule=Host(`example.org`)"
      - "traefik.http.routers.app.entrypoints=web"

networks:
  traefik:
版本:“3”
服务:
特拉菲克:
图片:“traefik:v2.0.0-rc3”
容器名称:“traefik”
重新启动:始终
命令:
-“--api.unsecure=true”
-“--providers.docker=true”
-“--providers.docker.exposedbydefault=false”
-“--entrypoints.web.address=:80”
端口:
- "80:80"
- "8080:8080"
卷数:
-/var/run/docker.sock:/var/run/docker.sock
网络:
-特拉菲克
手提电话:
图片:portainer/portainer
命令:-Hunix:///var/run/docker.sock
重新启动:始终
卷数:
-/var/run/docker.sock:/var/run/docker.sock
-/portainer:/data
端口:
- "9000:9000"
- "8000:8000"
网络:
-特拉菲克
标签:
-“traefik.enable=true”
-“traefik.http.routers.portainer.entrypoints=web”
db:
图片:mysql:5.7
重新启动:始终
卷数:
-./db/initdb.d:/docker入口点initdb.d
网络:
-特拉菲克
环境:
MYSQL\u ROOT\u密码:
MYSQL\u数据库:
MYSQL\u用户:
MYSQL\u密码:
应用程序:
图片:my repo/wordpress:最新
重新启动:始终
取决于:
-分贝
网络:
-特拉菲克
标签:
-“traefik.enable=true”
-“traefik.http.routers.app.rule=Host(`example.org`)”
-“traefik.http.routers.app.entrypoints=web”
网络:
特拉菲克:

我做错了什么?每种情况下的日志都是相同的。在非swarm模式下,我可以登录到Portainer UI,看到我所有的容器都在运行,等等。但是swarm版本只是拒绝连接,即使我通过了主机规则(Portainer.example.org)。我使用Traefik才几天,很可能会出现一个简单的配置错误(希望如此!)。

端口检测

Docker Swarm不向Traefik提供任何信息


因此,您必须使用标签traefik.http.services..loadbalancer.server.port来指定用于通信的端口(请查看中有关此标签的参考)。

谢谢您的回答,我不再使用traefik,不过这是一个有用的说明。