Маршрутизация в различные экземпляры 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, которые могут абстрагировать номер порта (это может быть излишним для ваших нужд и сложным для настройки)