无法连接到 docker 托管的 MSSQL

Posted

技术标签:

【中文标题】无法连接到 docker 托管的 MSSQL【英文标题】:Failed to connect to docker hosted MSSQL 【发布时间】:2018-09-16 03:11:46 【问题描述】:

我在关注 [本教程](https://hub.docker.com/r/microsoft/mssql-server-linux/ ) 我尝试通过 sqlcmd 连接到我的 docker 托管的 MSSQL。

我在 Windows 的 PowerShell 中执行了以下操作:

docker run -e 'ACCEPT_EULA=Y' --name mssql -e \
 'SA_PASSWORD=yourStrong(!)Password' -p 1433:1433 -it \
 -d microsoft/mssql-server-linux:latest /bin/bash

注意:添加“-it”和“/bin/bash”是因为如果没有检测到任何活动,docker会自动停止。

我运行docker container ls -a 来验证它是否正在运行:

docker container Is -a 
CONTAINER ID      IMAGE                               COMMAND       CREATED          STATUS          PORTS                    NAMES 
92cfc504ab70      microsoft/mssql-server-linux:latest "/bin/bash"   27 minutes ago   Up 27 minutes   0.0.0.0:1433->1433/tcp  mssql 

我在主机上运行了 telnet local-ip:1433,它工作正常。

问题出在我执行以下操作时:

docker exec -it mssql /opt/mssql-tools/bin/sqlcmd -S localhost -U sa \
 -P yourStrong(!)Password

错误:

Sqlcmd:错误:Microsoft ODBC Driver 17 for SQL Server:登录超时 已到期。 Sqlcmd:错误:Microsoft ODBC Driver 17 for SQL Server:TCP 提供程序:错误代码 0x2749。 Sqlcmd:错误:Microsoft ODBC 驱动程序 17 对于 SQL Server:网络相关或特定于实例的错误有 在建立与 SQL Server 的连接时发生。服务器不是 找到或无法访问。检查实例名称是否正确以及 SQL 是否正确 服务器配置为允许远程连接。了解更多信息 请参阅 SQL Server 联机丛书。。

我还尝试通过我的主机使用 powershell 进行连接 链接:https://docs.microsoft.com/en-us/sql/linux/quickstart-install-connect-docker

命令:

sqlcmd -S 192.168.0.110,1433 -U SA -P yourStrong(!)Password

注意:192.168.0.110(通过在主机上运行 ipconfig 获得。)

有什么帮助吗?

【问题讨论】:

【参考方案1】:

从您的消息来看,服务器未配置为远程访问。可以按照下面提到的方式开启吗?

使用 SSMS(SQL Server 管理工作室): 在对象资源管理器中,右键单击服务器并选择属性。

单击连接节点。

在远程服务器连接下,选中允许远程连接到此服务器复选框。

谢谢,

阿南达库马尔 J.

【讨论】:

我不确定我是否正确地遵循了您的建议,如果我无法连接到我的服务器,我将在对象资源管理器中没有任何服务器。对吧?【参考方案2】:

docker run 命令语法如下:

Usage:  docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

当你执行命令时:

docker run -e 'ACCEPT_EULA=Y' --name mssql -e 'SA_PASSWORD=yourStrong(!)Password' -p 1433:1433 -it -d microsoft/mssql-server-linux:latest /bin/bash

/bin/bash 最终会覆盖在microsoft/mssql-server-linux 图像的Dockerfile 中定义的CMD 层。

所以,最后只需要启动一个容器,不需要任何额外的命令:

$ docker run -e 'ACCEPT_EULA=Y' --name mssql -e 'SA_PASSWORD=yourStrong(!)Password' -p 1433:1433 -it -d microsoft/mssql-server-linux:latest

现在您可以访问MSSQL

$ docker exec -it mssql /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P 'yourStrong(!)Password'
1> 

【讨论】:

谢谢,你的命令是他们在下面的链接中教的:hub.docker.com/r/microsoft/mssql-server-linux 我遇到了一个问题,它每次启动时都会自动退出。我发现了问题 -> 问题在于我在 PowerShell 中的命令。我需要将我的论点放在双引号中。例如。 docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=YourStrong!Passw0rd" -p 1401:1433 --name sql1 -d microsoft/mssql-server-linux:2017-latest 只是想补充一点,它在 Linux 机器上同时适用于单引号 ' ' 和双引号 " "【参考方案3】:

经过反复试验,我发现了问题,并重新阅读了文档。当我在 PowerShell 中执行命令时,我应该对参数使用双引号。

我看错了方向。最初我执行了命令:

docker run -e 'ACCEPT_EULA=Y' --name mssql -e \
 'SA_PASSWORD=yourStrong(!)Password' -p 1433:1433 -d \
 microsoft/mssql-server-linux:latest

容器每次启动时都会自动停止。 然后,我做了一些谷歌搜索,发现:

docker run -e 'ACCEPT_EULA=Y' --name mssql -e \
 'SA_PASSWORD=yourStrong(!)Password' -p 1433:1433 -it -d \
 microsoft/mssql-server-linux:latest /bin/bash

表面上看起来不错。它在 PowerShell 中成功执行。它不再自动停止。如果我使用

深入挖掘
docker container logs mssql

查看 mssql 的日志。没有给出错误,只是我没有看到很多给出的信息,这让我认为我的命令没有问题。

但是运行这些命令的正确方法是使用双引号。 链接:https://hub.docker.com/r/microsoft/mssql-server-linux/ 重要提示:如果您在 Windows 上使用 PowerShell 运行这些命令,请使用双引号而不是单引号。

例如

docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=YourStrong!Passw0rd" -p 1401:1433 --name sql1 -d microsoft/mssql-server-linux:2017-latest

我还可以使用 SSMS 登录:

服务器名称:Hostip,1401 用户名:sa 密码:你的密码

【讨论】:

【参考方案4】:

尝试 127.0.0.1 而不是 localhost

例如:

docker exec -it mssql /opt/mssql-tools/bin/sqlcmd -S 127.0.0.1 -U sa -P 'yourStrong(!)Password'

【讨论】:

【参考方案5】:

我是 Docker 新手,当我尝试从我的应用程序(或 Microsoft 的 sqlcmd 应用程序容器)连接到 SQL Server 容器时,我也遇到了同样的问题,该容器也在另一个 Docker 容器中运行。看起来每个容器都有自己的子网 IP 地址,因此如果您尝试从另一个容器连接到 SQL,“localhost”将永远无法工作。 下面的命令将为您提供桥接网络中 IP 地址的完整列表。可以直接在连接字符串中指定IP。

docker network inspect bridge

【讨论】:

以上是关于无法连接到 docker 托管的 MSSQL的主要内容,如果未能解决你的问题,请参考以下文章

无法连接到 unix:///var/run/docker.sock 上的 Docker 守护程序。 docker 守护进程是不是正在运行?带有自托管运行器的 Gitlab Cloud CI/CD 错误

无法连接到 Docker 上的 SQL 数据库

无法从 docker 容器连接到 SQL Server

无法使用 Python 连接到 MSSQL Server 数据库

SQLAlchemy 无法连接到 mssql 数据库

无法从 Spring 应用程序连接到 mssql 服务器