sql-server - 路由到在默认端口上通过 Docker 运行的不同 SQL Server 实例
问题描述
我可以将 Traefik 用于网站,因为它们在连接时使用标题。但我希望通过 docker 运行多个不同的 SQL Server 实例,这些实例将在外部可用(在 docker 主机之外,可能在本地网络之外)
那么,有没有什么东西可以连接到在同一个 docker 实例上运行的不同 sql server 实例,而不必给它们不同的端口或外部 IP 地址,以便有人可以访问
sql01.docker.local,1433
和sql02.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
解决方案
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)
推荐阅读
- azure - Azure AKS 主节点体系结构
- http - HTTP OPTIONS 方法响应
- java - 表单的 Spring Boot 日期转换
- facebook - 设置 facebook 应用程序时 webhook 未收到 webhook 事件
- c# - 从报告中删除排序字段
- django - 使用动态休息过滤日期范围
- python - Python 正则表达式 - 停止在 > 20 个字符的行
- android - 如何根据 Ionic 3 中的用户输入在 JSON 数组中选择一个对象?
- java - 在 JSPX ADF 中播放媒体?
- asp.net-identity - IdentityUser 连接到 CreatedBy 和 ChangedBy