无法连接到 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 错误