首页 > 解决方案 > Traefik - 无法为不同域公开具有相同端口的 redis docker 容器

问题描述

我正在尝试为不同的环境设置一个带有 docker-compose 的 Redis。因此,我需要在同一个端口上使用 traefik 公开两个域:

我无法在容器上公开这些端口,因为它们在同一台服务器上运行。

我的 docker-compose 文件(用于域开发)如下所示:

version: '2' 
services:
redis:
  container_name: redis-signalr-dev
image: redis
volumes:
  - ./redis-signalr-data:/data
restart: always
labels:
  - traefik.enable=true
  - traefik.backend=redis-signalr-dev
  - traefik.frontend.rule=Host:domain-dev.com
  - traefik.port=6379
  - traefik.docker.network=traefik_default
  - traefik.frontend.entryPoints=redis
networks:
  - traefik_default
volumes:
  redis-signalr-data:

networks: 
  traefik_default:
    external: true

我还尝试将 treafik 配置为使用以下端点:

--entrypoints='Name:redis Address::6379'

连接到“domain-dev.com:6379”时,无法建立连接。

有谁知道这个问题的解决方案?

标签: redisdocker-composeportreverse-proxytraefik

解决方案


Traefik 是 http 的反向代理,而不是 tcp 负载均衡器。因此,traefik 本身(通常)打开端口 80 和 443 用于入口,并将传入的 http 请求转发到给定的支持 http 的后端。您在撰写服务标签中指定的端口是容器的端口,流量应该传递到。

因此,如果您在端口 3000 上运行 nodejs (http) 服务器,您将连接到http://yourdomain:80并且 traefik 会将请求转发到端口 3000 上的 nodejs 容器。这意味着通过在 compose 服务上指定端口,您将不会打开此端口在您的主机上。

在您使用自定义协议运行 redis 的示例中,traefik 不是解决方案,因为 traefik 仅执行 http 代理。要在您的主机上公开 redis(如果您真的想这样做),只需使用常规 docker 端口映射并将您的域指向您的 docker 主机。这样做,没有办法在不同的域中使用相同的端口,只需为两个实例指定两个不同的端口。对于 http,这是通过 traefik 检查 http 请求并根据主机标头进行路由来实现的。


推荐阅读