我有2个docker容器(在其中一个中,我的另一个SQL Server中有一个应用程序)。
我试图从具有应用程序的docker-container连接到另一个容器内的SQL Server数据库。
为此,我做到了:
root@application:/# sqlcmd -S 172.17.0.1 -U sa -P test
遇到问题后:
Sqlcmd:错误:SQL Server的Microsoft ODBC驱动程序17:登录超时已过期。
Sqlcmd:错误:SQL Server的Microsoft ODBC驱动程序17:TCP提供程序:错误代码0x2749。
Sqlcmd:错误:SQL Server的Microsoft ODBC驱动程序17:建立与SQL Server的连接时,发生了与网络相关或特定于实例的错误。找不到服务器或无法访问服务器。检查实例名称是否正确以及SQL Server是否配置为允许远程连接。有关更多信息,请参见SQL Server联机丛书。
当我在不带-S 172.17.0.1
的SQL Server数据库中的docker-container内部使用此选项时,它可以正常工作。
有什么想法如何通过sqlcmd
从带有应用程序的容器到带有数据库的容器?
更新
我错了,我曾经使用docker-container将此命令与数据库一起传递。 从应用程序到数据库的连接仍然有问题
答案 0 :(得分:0)
一种方式。最“值得信任”的方式恕我直言。
您必须将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”。是公开服务的名称空间。
注意“ mssql-service-deployment”的重复(相同的字符串值)
在此处记录:
https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/#namespaces-and-dns
创建服务时,它会创建一个相应的DNS条目。这个 条目的形式 ..svc.cluster.local,这意味着 只是使用一个容器,它将解析为服务 它是名称空间的本地名称。这对于使用相同的功能很有用 跨多个名称空间(例如开发,暂存)进行配置 和生产。如果要跨命名空间访问,则需要 使用完全限定的域名(FQDN)。