无法连接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
相关产品推荐
相关产品推荐

