Windows11下SSMS连接Docker化SQL Server 2022遇18456登录失败排查
Windows 11(WSL2后端)Docker容器中SQL Server 2022无法通过SSMS连接
登录失败,用户 'sa'。(Microsoft SQL Server, 错误: 18456)
Docker配置
简化版docker-compose.yml如下:
services: mssql: image: mcr.microsoft.com/mssql/server:2022-latest ports: - "1433:1433" environment: SA_PASSWORD: "YourStrong@Passw0rd" ACCEPT_EULA: "Y" volumes: - mssql_data:/var/opt/mssql networks: - laravel_net networks: laravel_net: volumes: mssql_data:
容器已正常运行,且能在容器内部通过以下命令连接并创建数据库:
docker exec -it <container-name> /opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P "YourStrong@Passw0rd" -C
SSMS连接参数
- 服务器名称:
localhost,1433 - 身份验证:SQL Server身份验证
- 登录名:
sa - 密码:
YourStrong@Passw0rd
已尝试操作
- 确认容器内
sqlcmd可正常连接 - 执行
netstat -an | findstr :1433确认端口1433处于监听状态:
TCP 0.0.0.0:1433 0.0.0.0:0 LISTENING TCP [::]:1433 [::]:0 LISTENING
- 临时关闭Windows Defender防火墙,问题仍存在
- 可通过同一网络下的Adminer容器成功连接,但Windows主机上的SSMS无法连接
需求与问题
希望在Windows 11主机上通过SSMS连接该Docker化SQL Server实例。
问题:使用SSMS连接时出现18456登录失败的原因是什么?需检查哪些Docker、Windows或WSL2特定设置以允许主机SSMS访问?
可能原因及检查项
1. WSL2网络端口转发异常
WSL2后端的Docker端口映射依赖WSL虚拟机转发,偶尔会出现端口未正确同步到Windows主机的情况:
- 打开WSL终端,执行
netstat -an | grep 1433确认WSL虚拟机内该端口是否处于监听状态 - 若WSL内端口正常,尝试重启Docker Desktop,或重启WSL服务:
之后重新启动Docker和SQL容器wsl --shutdown
2. SQL Server身份验证模式配置问题
虽然容器内可连接,但可能存在身份验证模式或sa账户状态异常:
- 进入容器执行以下命令检查sa账户状态:
确保docker exec -it <container-name> /opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P "YourStrong@Passw0rd" -C -Q "SELECT name, is_disabled FROM sys.server_principals WHERE name = 'sa'"is_disabled值为0 - 检查SQL Server是否启用混合身份验证模式:
返回docker exec -it <container-name> /opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P "YourStrong@Passw0rd" -C -Q "SELECT SERVERPROPERTY('IsIntegratedSecurityOnly')"0表示混合模式(SQL+Windows身份验证)已启用;返回1则仅启用Windows身份验证,需修改配置:
修改后重启容器docker exec -it <container-name> /opt/mssql/bin/mssql-conf set sqlserver.defaultlogin sa docker exec -it <container-name> /opt/mssql/bin/mssql-conf set sqlserver.authentication_mode mixed
3. SSMS连接加密设置冲突
SQL Server 2022默认启用强制加密,SSMS的连接设置可能与此不匹配:
- 在SSMS连接对话框中点击选项,切换到连接属性标签页,勾选加密连接,或设置加密为强制
- 若仍失败,可临时在容器中禁用强制加密测试:
重启容器后再用SSMS连接docker exec -it <container-name> /opt/mssql/bin/mssql-conf set network.forceencryption 0
4. 用WSL2虚拟机IP替代localhost
WSL2虚拟机有独立IP,偶尔localhost无法正确映射:
- 打开WSL终端,执行
hostname -I获取WSL虚拟机的IP地址 - 在SSMS中使用该IP替代
localhost,即服务器名称填写[WSL_IP],1433进行连接
5. Docker端口映射绑定范围问题
确认容器端口是否绑定到所有网卡:
- 检查容器端口映射状态:
确保输出为docker port <container-name> 14330.0.0.0:1433或:::1433,表示绑定到所有网卡,而非仅容器内部或WSL内部
内容的提问来源于stack exchange,提问作者Martín
相关产品推荐
相关产品推荐

