路由到通过Docker在默认端口上运行的其他SQL Server实例

时间:2018-08-01 05:05:01

标签: sql-server docker docker-compose traefik

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

那么,有什么可以允许连接到在同一docker实例上运行的不同sql服务器实例的,而不必为它们提供不同的端口或外部ip地址,以便某人可以访问

sql01.docker.local,1433sql02.docker.local,1433(来自SQL工具)。

开始其他问题

由于没有回复,也许有一种方法可以使诸如sql.docker.local\instance1sql.docker.local\instance2之类的不同实例出现,尽管我想这可能也不可能

结束附加问题

这是我尝试使用的docker-compose文件的示例(在我意识到对sql server的查询未通过主机头发送之前-否则我错了吗?)

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

3 个答案:

答案 0 :(得分:0)

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

您是sql服务器,可以通过TCP进行监听和通信。

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

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

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

答案 1 :(得分:0)

没有像HTTP服务器那样对数据库的“虚拟”访问。因此-指向相同IP的其他主机名无济于事。

如果您为所有实例坚持使用端口1433,那么除了使用两个不同的外部IP,我看不到其他任何方法。

如果您在Linux机器上,则可以尝试一些iptables魔术,但是它并不雅致,并且允许在任何时候仅访问您的一个实例。 Windows可能具有等效的iptables(我从未听说过),但一次只能逃避一次。

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

答案 2 :(得分:0)

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

我现在可以以3种不同的方式思考以实现您想要做的事情:

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