【问题标题】:Simple Træfɪk reverse proxy installation简单的Træfɪk反向代理安装
【发布时间】:2016-12-02 16:42:51
【问题描述】:

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

【问题讨论】:

  • 能否请您提供您的 Web 应用程序的 Dockerfile 以及您的 docker-compose.yml 的完整 sn-p?
  • 您是否在多个网络中运行某些容器?那么您还应该添加一个标签,网络 traefik 应该在其中查找容器。否则,您还会看到一些网关超时。请提供完整的撰写文件。

标签: networking docker docker-compose reverse-proxy traefik


【解决方案1】:

当您使用 docker 作为后端运行 traefik 时,无需从您的 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"

【讨论】:

  • 谢谢您的详细解答。事实上,我发现我不需要为我的服务定义任何端口映射。确实,我的容器暴露了一个额外的端口,我用traefik.port 指定了正确的端口。问题已更新。但是我仍然收到超时并且没有日志传入我的服务(nginx)
  • 我刚刚在单独的 docker-compose 文件中尝试了官方的 emilevauge/whoami 小图像,它工作正常。没有 Traefik,我的图像也能正常工作。我不知道如何调试。
  • 能否请您提供docker network ls 和一些docker network inspect <network> 的输出,这些网络被称为您的撰写文件所在的文件夹(例如,如果您的文件夹被称为某物,则对于名为 mytest_default 的网络像我的测试)。我假设容器无法相互接触。
  • 我可以看到我的服务与 Traefik 不在同一个网络中。他们在myproject_default 网络中,Traefik 在桥中。我试图将我所有的服务都放在桥上,这使 Traefik 可以与我的 web 服务进行通信,但 web 无法再与我的其他服务进行通信
【解决方案2】:

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

我认为默认情况下 docker 总是使用桥接模式,但从 v2 开始,compose networking 似乎不再是这种情况。它正在为 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 文件,所以它使用的是桥接模式。

【讨论】:

    猜你喜欢
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    • 2016-07-22
    • 2016-01-24
    • 1970-01-01
    相关资源
    最近更新 更多