无法连接到 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服务器”

无法连接到 Docker 内的 MySQL 服务器

无法从 Docker 容器连接到外部 SQL Server

无法从 docker 容器连接到 SQL Server

无法使用桥接网络模式从 docker 容器连接到远程 SQL 服务器