无法连接到 docker 容器内的 SQL Server
Posted
技术标签:
【中文标题】无法连接到 docker 容器内的 SQL Server【英文标题】:Unable to connect to SQL Server inside docker container 【发布时间】:2019-11-19 03:35:25 【问题描述】:我有 2 个 docker 容器(在其中一个容器中我有一个应用程序,在另一个 SQL Server 中)。
我尝试从带有应用程序的 docker-container 连接到另一个容器内的 SQL Server 数据库。
为此我做了:
root@application:/# sqlcmd -S 172.17.0.1 -U sa -P test
遇到问题后:
Sqlcmd:错误:Microsoft ODBC Driver 17 for SQL Server:登录超时已过期。
Sqlcmd:错误:Microsoft ODBC Driver 17 for SQL Server:TCP 提供程序:错误代码 0x2749。
Sqlcmd:错误:Microsoft ODBC Driver 17 for SQL Server:建立与 SQL Server 的连接时出现与网络相关或特定于实例的错误。服务器未找到或无法访问。检查实例名称是否正确以及 SQL Server 是否配置为允许远程连接。有关详细信息,请参阅 SQL Server 联机丛书。。
当我在没有-S 172.17.0.1
的 SQL Server 数据库的 docker-container 中使用此选项时,它可以正常工作。
任何想法如何通过sqlcmd
从带有应用程序的容器连接到带有数据库的容器?
更新
我弄错了,我使用从 docker-container 向数据库传递这个命令。 从应用程序到数据库的连接仍然有问题
【问题讨论】:
如果你不传递服务器值,你的命令应该如何找到服务器?我很困惑。 @JacobH 我弄错了,更新了问题,可能有人可以帮助我 你试过用docker容器名代替ip地址吗? @DanielN 是的,它可以工作,但我需要 172.17.0.1 并且不知道有什么变化以及我需要在哪里 我认为你不应该依赖 IP。如果你放弃你的容器或重建它,你可能会得到一个新的 ip。使用主机名或服务作为下面的答案 【参考方案1】:一种方式。恕我直言,最“值得信赖”的方式。
您必须将您的 sql-server 公开为 SERVICE。
apiVersion: v1
kind: Service
metadata:
name: mssql-service-deployment
#namespace: mycustomnamespace
spec:
selector:
app: mssql
ports:
- protocol: TCP
port: 1433
targetPort: 1433
type: LoadBalancer
..
那么你的连接字符串就变成了:
jdbc:sqlserver://mssql-service-deployment.default.svc.cluster.local;DatabaseName=MyDB;"
其中“.default”。是公开服务的 NAMESPACE。
注意“mssql-service-deployment”的重复(相同的字符串值)
这在此处记录:
https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/#namespaces-and-dns
当您创建服务时,它会创建相应的 DNS 条目。这 条目的形式 ..svc.cluster.local,这意味着如果 一个容器只是使用,它会解析到服务 这是命名空间的本地。这对于使用相同的 跨多个命名空间的配置,例如 Development、Staging 和生产。如果你想跨命名空间,你需要 使用完全限定域名 (FQDN)。
【讨论】:
感谢您的回复,但我理解您的回答,我可以粘贴 docker-compose.yml 以便您更好地了解我所做的事情。以上是关于无法连接到 docker 容器内的 SQL Server的主要内容,如果未能解决你的问题,请参考以下文章
无法从 docker 容器内的 Spring Boot 连接到 Redis
docker容器内的mysql说“无法通过套接字'/var/run/mysqld/mysqld.sock'连接到本地MySQL服务器”