You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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服务:
    wsl --shutdown
    
    之后重新启动Docker和SQL容器

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连接对话框中点击选项,切换到连接属性标签页,勾选加密连接,或设置加密为强制
  • 若仍失败,可临时在容器中禁用强制加密测试:
    docker exec -it <container-name> /opt/mssql/bin/mssql-conf set network.forceencryption 0
    
    重启容器后再用SSMS连接

4. 用WSL2虚拟机IP替代localhost

WSL2虚拟机有独立IP,偶尔localhost无法正确映射:

  • 打开WSL终端,执行hostname -I获取WSL虚拟机的IP地址
  • 在SSMS中使用该IP替代localhost,即服务器名称填写[WSL_IP],1433进行连接

5. Docker端口映射绑定范围问题

确认容器端口是否绑定到所有网卡:

  • 检查容器端口映射状态:
    docker port <container-name> 1433
    
    确保输出为0.0.0.0:1433或:::1433,表示绑定到所有网卡,而非仅容器内部或WSL内部

内容的提问来源于stack exchange,提问作者Martín

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 02:12:29