Docker swarm堆栈中的Portainer与Traefik拒绝连接
我试图在docker compose swarm中包含Portainer,它由WordPress+MySQL和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
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,不过这是一个有用的说明。