通过默认端口上的Docker路由到不同的SQL Server实例



我可以将Traefik用于网站,因为它们在连接时使用标头。但我希望有多个不同的SQL Server实例通过docker运行,它将在外部可用(在docker主机之外,可能在本地网络之外(

那么,有没有什么东西可以连接到运行在同一docker实例上的不同sql server实例,而不必给它们不同的端口或外部ip地址,这样某人就可以访问

来自SQL工具的sql01.docker.local,1433sql02.docker.local,1433

开始附加问题

由于没有回复,也许有一种方法可以有不同的实例,如:sql.docker.localinstance1sql.docker.localinstance2,尽管我认为这可能也是不可能的

结束附加问题

这是我试图使用的docker compose文件的一个例子(在我意识到对sql服务器的查询不会通过主机头发送之前——或者我错了吗?(

version: '2.1'
services:
traefik:
container_name: traefik
image: stefanscherer/traefik-windows
command: --docker.endpoint=tcp://172.28.80.1:2375 --logLevel=DEBUG
ports:
- "8080:8080"
- "80:80"
- "1433:1433"
volumes:
- ./runtest:C:/etc/traefik
- C:/Users/mvukomanovic.admin/.docker:C:/etc/ssl
networks:
- default
restart: unless-stopped
labels:
- "traefik.enable=false"
whoami:
image: stefanscherer/whoami
labels:
- "traefik.backend=whoami"
- "traefik.frontend.entryPoints=http"
- "traefik.port=8080"
- "traefik.frontend.rule=Host:whoami.docker.local"
networks:
- default
restart: unless-stopped

sql01:
image: microsoft/mssql-server-windows-developer
environment:
- ACCEPT_EULA=Y
hostname: sql01
domainname: sql01.local
networks:
- default
restart: unless-stopped
labels:
- "traefik.frontend.rule=Host:sql01.docker.local,sql01,sql01.local"
- "traefik.frontend.entryPoints=mssql"
- "traefik.port=1433"
- "traefik.frontend.port=1433"
networks:
- default
restart: unless-stopped    
sql02:
image: microsoft/mssql-server-windows-developer
environment:
- ACCEPT_EULA=Y
hostname: sql02
domainname: sql02.local
networks:
- default
restart: unless-stopped
labels:
- "traefik.frontend.rule=Host:sql02.docker.local,sql02,sql02.local"
- "traefik.frontend.entryPoints=mssql"
- "traefik.port=1433"
- "traefik.frontend.port=1433"
networks:
- default
restart: unless-stopped    
networks:
default:
external:
name: nat

如前所述,traefik不是正确的解决方案,因为它是一个仅HTTP的LoadBalancer。

我现在可以用三种不同的方式来实现你想要做的事情:

  • 使用类似HAproxy的TCP负载均衡器
  • 在Docker Swarm模式下设置服务器(https://docs.docker.com/engine/swarm/),这将允许通过它们之间的透明路由绑定同一端口
  • 使用服务发现服务,如领事和SRV记录,可以提取端口号(对于您的需求来说,这可能过于夸张,而且设置起来很复杂(

您不能使用traefik,因为它是一个HTTP反向代理。

您是sql server,通过TCP进行侦听和通信。

我不明白你的最终目标是什么。为什么要使用2个不同的sql server?

这取决于你想要什么,但你可能有两种解决方案:

  • 你能用一个更简单的解决方案吗?用于分离的不同数据库、角色和权限
  • 您可以搜索SQL Server Always-On的文档,但将查询路由到特定服务器似乎并不容易

没有像HTTP服务器那样的对数据库的"虚拟"访问。所以,并没有其他主机名指向相同的IP可以帮助你们。

如果您坚持所有实例都使用端口1433,那么我认为您除了使用两个不同的外部IP之外别无选择。

如果你在Linux上,你可以尝试一些iptables的魔力,但它并不优雅,而且在任何时候都只允许访问你的一个实例。Windows可能有类似的iptables(我从来没有听说过(,但仍然一次只有一个,你无法逃脱。

我的建议-使用多个端口来公开您的服务器。

最新更新