【发布时间】:2019-01-08 13:48:50
【问题描述】:
我可以将 Traefik 用于网站,因为它们在连接时使用标题。 但我希望通过 docker 运行多个不同的 SQL Server 实例,这些实例将在外部可用(在 docker 主机之外,可能在本地网络之外)
那么,有没有什么东西可以连接到在同一个 docker 实例上运行的不同 sql server 实例,而不必为它们提供不同的端口或外部 IP 地址以便有人可以访问
sql01.docker.local,1433 AND 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
【问题讨论】:
-
与 SQL Server 的通信是通过 TDS 协议完成的,这是一个与 HTTP 非常不同的二进制协议。 (对于初学者来说,TDS 连接通常是持久的,而 HTTP 连接通常不是。)至少,您需要一个通用的 TCP 代理。 SQL Server 也不关心它的主机名——你不能在同一个端口上运行两个实例。在同一“机器”(无论是虚拟的还是真实的)上的实例必须使用不同的端口。实例名称仅用作将这些名称解析为端口的机制。
-
它是可以根据客户端在连接时指定的服务器名称来代理 TDS 连接——我知道是因为我构建了一个概念证明。但我不知道(值得生产的)TDS 代理。最终,通过为同一台机器分配不同的主机名,并将这些解析到不同的网络接口,可以更好地解决此类问题,因此即使服务器在同一节点上运行,它们也具有不同的 IP 地址。无需代理即可完成这项工作。
-
在 docker 中,它们已经在不同的接口上,但是当从 docker 服务器外部访问它时,它是一个单一的网络接口,所以我不能那样做。显然,如果可能的话,我将不得不进一步研究。
-
只回答你问题的一个方面:There are no named instances in SQL Server for Linux.
标签: sql-server docker docker-compose traefik