简单的 Træfɪk 反向代理安装
Simple Træfɪk reverse proxy installation
我正在尝试使用一些 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 web 部分:
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"
启动所有这些东西,我看到我的 frontend/backend 在 Træfɪk web UI 上创建,但我无法通过 my-domain.net.[=18 访问我的应用程序=]
$ curl -H Host:my-domain.net http://127.0.0.1
# ... after ±30s.
Gateway Timeout
Træfɪk 日志:
Error forwarding to http://172.18.0.4:80, err: dial tcp 172.18.0.4:80: i/o timeout
虽然我可以从它的本地 IP 访问该应用程序 (172.18.0.4
),但它工作正常。
我肯定在这里忘记了什么,有什么帮助吗?
附加信息:
- 官方
emilevauge/whoami
在单独的 docker-compose 文件中运行良好。
- 我的服务在没有 Træfɪk 的情况下工作正常(通过映射端口 80)
当您 运行 traefik 以 docker 作为后端时,无需公开 web
容器中的端口。因此,您应该安全地从撰写文件的 web
服务中删除 ports
部分。
您是否运行从同一个撰写文件中使用这两项服务?您必须确保 traefik 容器能够访问 web 容器。这在 运行 从同一个组合文件或将两个容器附加到同一个网络时有效。
超时的另一种可能性是您的 Web 容器暴露了多个端口(查看您的 Dockerfile)。如果是这种情况,您需要明确告诉 traefik 应该将请求映射到哪个端口。在您的情况下,这应该是 "traefik.port=80"
.
由于您正在 运行进行非常基本的设置,并且您已经使用标签设置域,因此无需提供一些特殊配置。请通过将 /dev/null
安装为 toml 文件来检查默认值,就像在 very basic docs.
中一样
对于 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"
按照@AndreasJägle 的建议,我检查了容器,它向我展示了 Traefik 和我在不同网络中的服务。
我认为默认情况下 docker 始终使用桥接模式,但从 v2 开始 compose networking 似乎不再如此。它正在为 docker-compose 文件创建网络(基于项目名称)。
因此,对于从 v2 开始的 compose,您必须通过需要通信的 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 文件,所以它使用的是桥接模式。
我正在尝试使用一些 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 web 部分:
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"
启动所有这些东西,我看到我的 frontend/backend 在 Træfɪk web UI 上创建,但我无法通过 my-domain.net.[=18 访问我的应用程序=]
$ curl -H Host:my-domain.net http://127.0.0.1
# ... after ±30s.
Gateway Timeout
Træfɪk 日志:
Error forwarding to http://172.18.0.4:80, err: dial tcp 172.18.0.4:80: i/o timeout
虽然我可以从它的本地 IP 访问该应用程序 (172.18.0.4
),但它工作正常。
我肯定在这里忘记了什么,有什么帮助吗?
附加信息:
- 官方
emilevauge/whoami
在单独的 docker-compose 文件中运行良好。 - 我的服务在没有 Træfɪk 的情况下工作正常(通过映射端口 80)
当您 运行 traefik 以 docker 作为后端时,无需公开 web
容器中的端口。因此,您应该安全地从撰写文件的 web
服务中删除 ports
部分。
您是否运行从同一个撰写文件中使用这两项服务?您必须确保 traefik 容器能够访问 web 容器。这在 运行 从同一个组合文件或将两个容器附加到同一个网络时有效。
超时的另一种可能性是您的 Web 容器暴露了多个端口(查看您的 Dockerfile)。如果是这种情况,您需要明确告诉 traefik 应该将请求映射到哪个端口。在您的情况下,这应该是 "traefik.port=80"
.
由于您正在 运行进行非常基本的设置,并且您已经使用标签设置域,因此无需提供一些特殊配置。请通过将 /dev/null
安装为 toml 文件来检查默认值,就像在 very basic docs.
对于 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"
按照@AndreasJägle 的建议,我检查了容器,它向我展示了 Traefik 和我在不同网络中的服务。
我认为默认情况下 docker 始终使用桥接模式,但从 v2 开始 compose networking 似乎不再如此。它正在为 docker-compose 文件创建网络(基于项目名称)。
因此,对于从 v2 开始的 compose,您必须通过需要通信的 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 文件,所以它使用的是桥接模式。