0

我正在尝试带有一些 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"

启动所有这些东西后,我看到在 Træfɪk Web UI 上创建了我的前端/后端,但我无法通过 my-domain.net 访问我的应用程序。

$ curl -H Host:my-domain.net http://127.0.0.1
# ... after ±30s.
Gateway Timeout

Træfɪk日志:

转发到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)
4

2 回答 2

1

当您使用 docker 作为后端运行 traefik 时,无需从web容器中公开端口。因此,您应该安全地从撰写文件中ports的服务中删除该部分。web

您是否从同一个撰写文件运行这两个服务?您必须确保 traefik 容器能够访问 Web 容器。当从同一个撰写文件运行两者时,或者通过将两个容器附加到同一个网络时,这都有效。

超时的另一种可能性可能是您的 Web 容器暴露了多个端口(查看您的 Dockerfile)。如果是这种情况,您需要明确告诉 traefik 应该将请求映射到哪个端口。在你的情况下,这应该是"traefik.port=80".

由于您正在运行一个非常基本的设置,并且您已经使用标签设置了域,因此无需提供一些特殊配置。/dev/null请通过像在非常基本的文档中那样安装为 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"
于 2016-12-05T14:06:47.343 回答
0

正如@AndreasJägle 所建议的,我检查了容器,它向我展示了 Traefik 和我在不同网络中的服务。

我认为默认情况下 docker 总是使用桥接模式,但是从 v2 开始的compose 网络似乎不再是这种情况了。它正在为 docker-compose 文件创建一个网络(基于项目名称)。

因此,随着 compose 开始 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 文件,所以它使用的是桥接模式。

于 2016-12-06T13:03:36.530 回答