我正在尝试使用docker-compose为不同的环境设置Redis。因此,我需要在同一端口上使用traefik公开两个域:
我无法在容器上公开这些端口,因为它们在同一台服务器上运行。
我的docker-compose文件(对于domain-dev)看起来像这样:
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”时,无法建立连接。
有谁知道这个问题的解决方案?
Traefik是http的反向代理,而不是tcp负载均衡器。所以traefik本身(通常)打开端口80和443进入入口并将传入的http请求转发给给定的http-able后端。您在撰写服务标签中指定的端口是容器的端口,应将流量传递给。
因此,如果您在端口3000上运行nodejs(http)服务器,您将连接到http://yourdomain:80
,并且traefik会将请求转发到端口3000上的nodejs容器。这意味着通过在撰写服务上指定端口,您将无法打开此主机上的端口。
在使用自定义协议运行redis的示例中,traefik不是解决方案,因为traefik只进行http代理。要在主机上公开redis(如果你真的想这样做),只需使用常规的docker端口映射并将域指向docker主机。这样做,就无法使用具有不同域的相同端口,只需为两个实例指定两个不同的端口。对于http,这可以通过traefik检查http请求并根据主机头进行路由。
Traefik 2.0将获得TCP支持:https://github.com/containous/traefik/pull/4587
在此之前,您必须使用NGINX或类似产品。