首页 > 解决方案 > 路由到在默认端口上通过 Docker 运行的不同 SQL Server 实例

问题描述

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

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

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

开始附加问题

由于没有回复,也许有一种方法可以有不同的实例,例如:sql.docker.local\instance1虽然sql.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

标签: sql-serverdockerdocker-composetraefik

解决方案


As mentionned earlier traefik is not the right solution since it's a HTTP only LoadBalancer.

I can think right now in 3 different ways to achieve what you want to do :

  • Use a TCP Load Balancer like HAproxy
  • Setup you server in Docker Swarm Mode (https://docs.docker.com/engine/swarm/), that will allow to bind the same port with a transparent routing between them
  • Use a service discovery service like consul and SRV records that can abstracts ports number (this might be overkill for your needs and complex to setup)

推荐阅读