Маршрутизация в различные экземпляры SQL Server, выполняемые через Docker по умолчанию

Я могу использовать Traefik для веб-сайтов, так как они используют заголовки, когда они соединяются. Но я хочу иметь несколько разных экземпляров SQL Server, работающих через докеры, которые будут доступны снаружи (вне хоста докера, потенциально вне локальной сети)

Итак, есть ли что-нибудь, что позволяет подключаться к различным экземплярам sql-сервера, работающим на одном экземпляре docker, без необходимости предоставлять им разные порты или внешние IP-адреса, чтобы кто-то мог получить доступ

sql01.docker.local,1433 И sql02.docker.local,1433 из SQL Tools.

Начать дополнительный вопрос

Поскольку ответов не было, возможно, есть способ иметь разные экземпляры, такие как: sql.docker.local\instance1 и sql.docker.local\instance2 хотя я думаю, что это также не возможно

Завершить дополнительный вопрос

Это пример файла, который я пытался использовать для докеры (прежде чем я понял, что запросы к серверу 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

Ответ 1

вы не можете использовать traefik, потому что это HTTP обратный прокси.

Вы работаете в SQL Server и обмениваетесь данными через TCP.

Я не понимаю, какова конечная цель. Почему вы используете 2 разных sql-сервера?

Это зависит от того, что вы хотите, но у вас могут быть два решения:

  • Можете ли вы использовать более простое решение? разные базы данных, роли и разрешения для разделения.
  • Вы можете искать в документации SQL Server Always On, но, похоже, нелегко направлять запросы к определенному серверу.

Ответ 2

Нет никакого "виртуального" доступа к базам данных, например, для HTTP-серверов. Таким образом - никакие дополнительные имена хостов, указывающие на один и тот же IP-адрес, могут вам помочь.

Если вы настаиваете на порту 1433 для всех своих экземпляров, я не вижу для вас возможности, кроме использования двух разных внешних IP-адресов.

Если вы были на Linux-боксе, вы можете попробовать немного iptables-магии, но это не изящно и позволит доступ к одному из ваших экземпляров в любой момент. У Windows может быть эквивалент iptables (я никогда не слышал об этом), но все же только один раз в то время вы не можете убежать.

Мой совет - используйте несколько портов, чтобы выставлять свои серверы.

Ответ 3

Как упоминалось ранее, traefik не является правильным решением, так как это только HTTP LoadBalancer.

Я могу сейчас подумать тремя разными способами, чтобы достичь того, что вы хотите сделать:

  • Использовать балансировщик нагрузки TCP, например, HAproxy
  • Настройка сервера в режиме Docker Swarm (https://docs.docker.com/engine/swarm/), который позволит связать один и тот же порт с прозрачной маршрутизацией между ними
  • Используйте службу обнаружения сервисов, такую как записи consul и SRV, которые могут абстрагировать номер порта (это может быть излишним для ваших нужд и сложным для настройки)