Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 路由到通过默认端口上的Docker运行的不同SQL Server实例_Sql Server_Docker_Docker Compose_Traefik - Fatal编程技术网

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

Sql server 路由到通过默认端口上的Docker运行的不同SQL Server实例,sql-server,docker,docker-compose,traefik,Sql Server,Docker,Docker Compose,Traefik,我可以将Traefik用于网站,因为它们在连接时使用标题。 但我希望有多个不同的SQL Server实例通过docker运行,这些实例将在外部可用(在docker主机之外,可能在本地网络之外) 那么,是否有任何东西允许连接到同一docker实例上运行的不同sql server实例,而不必为它们提供不同的端口或外部ip地址,以便有人可以访问 SQL工具中的sql01.docker.local,1433和sql02.docker.local,1433 开始附加问题 由于没有回复,可能有一种方法可以创

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

那么,是否有任何东西允许连接到同一docker实例上运行的不同sql server实例,而不必为它们提供不同的端口或外部ip地址,以便有人可以访问

SQL工具中的
sql01.docker.local,1433
sql02.docker.local,1433

开始附加问题

由于没有回复,可能有一种方法可以创建不同的实例,例如:
sql.docker.local\instance1
sql.docker.local\instance2
,尽管我认为这也不可能

结束附加问题

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


不能使用traefik,因为它是HTTP反向代理

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

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

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

  • 你能用一个更简单的解决方案吗?用于分离的不同数据库、角色和权限
  • 您可以搜索的文档,但将查询路由到特定服务器似乎并不容易
没有像HTTP服务器那样的对数据库的“虚拟”访问。所以-没有指向同一IP的其他主机名可以帮助您

如果您坚持所有实例都使用端口1433,那么我认为除了使用两个不同的外部IP之外,您没有其他方法

如果您在Linux机器上,您可以尝试一些iptables魔术,但它并不优雅,并且在任何时刻都只允许访问您的一个实例。Windows可能有相当于iptables的功能(我从来没有听说过),但仍然只能一次一个,你无法逃脱


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

如前所述,traefik不是正确的解决方案,因为它是一个仅限HTTP的负载平衡器

我现在可以用三种不同的方式来实现你的目标:

  • 使用像HAproxy这样的TCP负载平衡器
  • 将服务器设置为Docker Swarm模式(),这将允许使用透明路由绑定同一端口
  • 使用一个服务发现服务,如领事和SRV记录,可以提取端口号(这可能会超出您的需要,而且设置起来很复杂)

与SQL Server的通信是通过TDS协议完成的,这是一种与HTTP非常不同的二进制协议。(对于初学者来说,TDS连接通常是持久的,而HTTP连接通常不是。)至少,您需要一个通用TCP代理。SQL Server也不关心其主机名——不能在同一端口上运行两个实例。在同一台“计算机”(无论是虚拟的还是真实的)上,实例必须使用不同的端口。实例名称仅用作将这些名称解析为端口的机制。可以根据客户端在连接时指定的服务器名称代理TDS连接——我知道,因为我建立了概念证明。但我不知道有(值得生产的)TDS代理。最终,通过将不同的主机名分配给同一台机器,并将这些主机名解析为单独的网络接口,这样即使服务器运行在同一节点上,它们也具有不同的IP地址,从而更好地解决了这些问题。这不需要代理。在docker中,它们已经在不同的接口上,但是当从docker服务器外部访问时,它是一个单一的网络接口,所以我不能这样做。显然,如果可能的话,我将不得不对此进行进一步研究。只回答您问题的一个方面:。我使用两个不同的服务器,因为我想将它们作为docker容器运行。因此,在这种情况下,角色和权限是没有帮助的,而且目前这种情况不再正确。Traefik现在也能够负载平衡TCP和UDP。这是一个如此快速发展的生态系统的好处:-)很高兴知道。丹@emu
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