无法连接Docker部署的SQL Server容器,请求故障排查
问题描述
我使用以下命令创建SQL Server容器:
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=yourStrong(!)Password" -p 1438:1438 -d mcr.microsoft.com/mssql/server
(已修改密码)
随后通过SSMS连接,设置服务器名称为localhost,1438,认证方式为SQL Server Authentication,账号sa,输入对应密码后出现错误:
A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.) (Framework Microsoft SqlClient Data Provider)
我能正常连接各类数据库(含Azure云数据库及本地数据库),Docker容器显示正常运行,但无法连接,请问原因是什么?
可能原因及解决方法
端口映射错误:SQL Server容器内默认监听端口是1433,你当前命令将宿主机1438映射到容器1438,而容器内服务并未在1438端口提供服务。修改端口映射参数为
-p 1438:1433,重启容器后用localhost,1438重新连接。SSMS版本兼容性问题:
mcr.microsoft.com/mssql/server默认拉取最新版SQL Server,若你的SSMS版本过旧,会因不支持新的预登录握手协议或TLS版本导致连接失败。升级SSMS到最新版本后重试。容器内服务未完全初始化:Docker容器显示运行状态不代表内部SQL Server服务已就绪。执行
docker logs <容器ID>查看日志,确认是否出现SQL Server is now ready for client connections的提示,等待服务完全启动后再尝试连接。密码不满足复杂度要求:SQL Server强制要求SA密码符合复杂度规则(至少8字符,包含大小写字母、数字、特殊字符)。若你修改后的密码不达标,容器内SQL Server可能未完成初始化。查看容器日志确认是否有密码相关错误,重新设置符合要求的密码并重建容器。
TLS协议不匹配:容器内SQL Server默认启用TLS 1.2,若你的系统或SSMS禁用了该协议,会导致握手失败。可在SSMS连接窗口的「选项」->「连接属性」中取消勾选「加密连接」,或启用系统的TLS 1.2协议后重试。
内容的提问来源于stack exchange,提问作者coolblue2000

