我正在使用一些docker容器尝试漂亮的Træfɪk反向代理。
这是我的Træfɪk docker-compose.yml :
version: '2'
services:
traefik:
image: traefik
command: --web --docker --docker.domain=my-domain.net --logLevel=DEBUG
ports:
- "80:80"
- "8080:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /dev/null:/traefik.toml
以下是我的服务' docker-compose.yml 网页部分:
version: '2'
services:
# [...]
web:
build: . # An nginx based image
container_name: my_app_web
volumes:
- ..:/app/
depends_on:
- db
- redis
labels:
- "traefik.backend=my_app"
- "traefik.frontend.rule=Host:my-domain.net"
- "traefik.port=80"
启动所有这些东西,我看到我的前端/后端在Træfɪk网页用户界面上创建,但我无法通过my-domain.net访问我的应用程序。
$ curl -H Host:my-domain.net http://127.0.0.1
# ... after ±30s.
Gateway Timeout
Træfɪklog:
转发到http://172.18.0.4:80时出错,错误:拨打tcp 172.18.0.4:80:i / o timeout
我可以通过它的本地IP访问应用程序(172.18.0.4
)并且它正常工作。
我肯定在这里遗忘了什么,有什么帮助吗?
其他信息:
emilevauge/whoami
在单独的docker-compose文件中正常工作。答案 0 :(得分:1)
使用docker作为后端运行traefik时,无需公开web
容器中的端口。因此,您可以安全地从撰写文件中的ports
服务中删除web
部分。
您是否在同一个撰写文件中运行这两项服务?您必须确保traefik容器能够访问Web容器。无论是从同一个撰写文件运行还是将两个容器连接到同一网络,都可以使用它。
超时的另一种可能性是您的Web容器暴露多个端口(看看您的Dockerfile)。如果是这种情况,您需要明确告诉traefik应该将请求映射到哪个端口。在您的情况下,这应该是"traefik.port=80"
。
当您运行非常基本的设置并且已使用标签设置域时,无需提供某些特殊配置。请查看默认设置,只需将/dev/null
挂载为very basic docs中的toml文件。
对于traefik服务:
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /dev/null:/traefik.toml
适用于您的网络服务
labels:
- "traefik.backend=my_app"
- "traefik.frontend.rule=Host:my-domain.net"
- "traefik.port=80"
答案 1 :(得分:0)
根据@AndreasJägle的建议,我检查了容器,它向我展示了Traefik和我在不同网络中的服务。
我认为默认情况下,docker始终使用桥接模式,但从v2开始,compose networking似乎不再是这种情况。它正在为docker-compose文件创建一个网络(基于项目名称)。
因此,使用compose start v2,您必须通过需要通信的docker-compose文件指定公共网络。
在这里,我只使用为traefik生成的那个:
version: '2'
services:
# ...
web:
# ...
labels:
- "traefik.backend=my_app"
- "traefik.frontend.rule=Host:my-domain.net"
- "traefik.port=80"
networks:
default:
external:
name: traefik_default
其他信息:
Traefik与emilevauge/whoami
工作正常,因为我正在定义一个docker-compose v1文件,所以它正在使用桥接模式。