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

无法连接Docker中运行的SQL Server:sa用户登录失败求助

Docker部署SQL Server后sa登录失败的解决方法

问题场景

已通过以下命令部署SQL Server 2022容器,容器状态正常:

docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<@MystrongPassword1" -p 1433:1433 --name sql1 --hostname sql1 -d mcr.microsoft.com/mssql/server:2022-latest

使用Azure Data Studio连接时,先出现证书信任错误,点击信任后弹出「用户'sa'登录失败」错误,错误编号18456。

翻译后的详细错误信息

Microsoft.Data.SqlClient.SqlException (0x80131904): 用户 'sa' 登录失败。
   在 Microsoft.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   在 Microsoft.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   在 Microsoft.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   在 Microsoft.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
   在 Microsoft.Data.SqlClient.SqlInternalConnectionTds.CompleteLogin(Boolean enlistOK)
   在 Microsoft.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean ignoreSniOpenTimeout, TimeoutTimer timeout, Boolean withFailover)
   在 Microsoft.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString connectionOptions, SqlCredential credential, TimeoutTimer timeout)
   在 Microsoft.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(TimeoutTimer timeout, SqlConnectionString connectionOptions, SqlCredential credential, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance)
   在 Microsoft.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData, Boolean applyTransientFaultHandling, String accessToken, DbConnectionPool pool)
   在 Microsoft.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)
   在 Microsoft.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup, DbConnectionOptions userOptions)
   在 Microsoft.Data.ProviderBase.DbConnectionFactory.<>c__DisplayClass48_0.<CreateReplaceConnectionContinuation>b__0(Task`1 _)
   在 System.Threading.Tasks.ContinuationResultTaskFromResultTask`2.InnerInvoke()
   在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
--- 上一位置的堆栈跟踪结束 ---
   在 System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot, Thread threadPoolThread)
--- 上一位置的堆栈跟踪结束 ---
   在 Microsoft.SqlTools.ServiceLayer.Connection.ReliableConnection.ReliableSqlConnection.<>c__DisplayClass30_0.<<OpenAsync>b__0>d.MoveNext() (位于 D:\a\_work\1\s\src\Microsoft.SqlTools.ManagedBatchParser\ReliableConnection\ReliableSqlConnection.cs:第312行)
--- 上一位置的堆栈跟踪结束 ---
   在 Microsoft.SqlTools.ServiceLayer.Connection.ConnectionService.TryOpenConnection(ConnectionInfo connectionInfo, ConnectParams connectionParams) (位于 D:\a\_work\1\s\src\Microsoft.SqlTools.ServiceLayer\Connection\ConnectionService.cs:第666行)
客户端连接ID:cbab63a5-c831-442e-b117-eb024e6f16bf
错误编号:18456,状态:1,级别:14

解决步骤

1. 排查密码设置问题

SQL Server的sa密码需要满足复杂度要求(至少8字符,包含大小写、数字、特殊字符),你的密码格式符合要求,但命令中的特殊字符可能因终端环境未转义导致密码设置错误:

  • Bash环境:<是重定向符号,需要转义,重新创建容器时将密码参数改为:
    -e 'MSSQL_SA_PASSWORD=\<@MystrongPassword1'
    
  • PowerShell环境:特殊字符无需额外转义,但确保用双引号包裹密码参数。

2. 验证容器内sa密码有效性

进入容器直接测试登录:

# 进入容器
docker exec -it sql1 bash
# 使用sqlcmd登录
/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P '<@MystrongPassword1'

如果登录失败,说明密码未正确设置,可在容器内重置密码:

-- 进入sqlcmd后执行
ALTER LOGIN sa WITH PASSWORD='<新的符合复杂度的密码>';
GO

3. 确认sa账户已启用

如果密码正确但仍登录失败,检查sa账户是否被禁用:

-- 进入sqlcmd后执行
SELECT name, is_disabled FROM sys.server_principals WHERE name = 'sa';
GO
-- 若is_disabled为1,启用账户
ALTER LOGIN sa ENABLE;
GO

4. 修正Azure Data Studio连接配置

  • 确认服务器地址为localhost或容器IP(执行docker inspect sql1 | grep IPAddress查看)
  • 确认端口为1433
  • 在连接设置中永久勾选「Trust server certificate」,避免临时信任失效
  • 重新输入sa密码,注意大小写和特殊字符的准确性

内容的提问来源于stack exchange,提问作者Edson Gonçalves

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 00:41:58