如何修复连接Docker中SQL Server时的"无法打开连接"错误?
错误信息
SQL Server。找不到服务器或无法访问服务器。请验证实例名称是否正确,以及SQL Server是否配置为允许远程连接。(provider: TCP Provider, error: 40 - Could not open a connection to SQL Server: Could not open a connection to SQL Server)
连接字符串
"CatalogDbConnectionString": "Server=tcp:127.0.0.1,1433;Initial Catalog=CatalogDb;User Id=sa;Password=Passw@rd"
docker-compose.override.yml 配置
catalogdb: environment: - SA_PASSWORD=Passw@rd - ACCEPT_EULA=Y ports: - "1433:1433" volumes: - /var/opt/mssql
代码片段
using (var scope = app.Services.CreateScope()) { var context = scope.ServiceProvider.GetRequiredService<CatalogDBContext>(); var env = scope.ServiceProvider.GetRequiredService<IWebHostEnvironment>(); var settings = scope.ServiceProvider.GetRequiredService<IOptions<CatalogSettings>>(); var logger = scope.ServiceProvider.GetRequiredService<ILogger<CatalogDBSeedData>>(); context.Database.Migrate(); new CatalogDBSeedData().SeedAsync(context, env, settings, logger).Wait(); }
检查容器运行状态:先确认
catalogdb容器是否正常启动并运行,执行命令:docker ps若容器未启动,执行
docker-compose up -d catalogdb启动;若容器异常,用docker logs catalogdb查看日志,确认SQL Server初始化是否完成。修正容器内服务的连接字符串:如果你的代码也运行在Docker容器中,不能使用
127.0.0.1,需改用Docker服务名称catalogdb作为服务器地址,修改后的连接字符串:"CatalogDbConnectionString": "Server=catalogdb,1433;Initial Catalog=CatalogDb;User Id=sa;Password=Passw@rd"Docker内部容器之间通过服务名通信,
127.0.0.1指向容器自身,而非SQL Server容器。验证宿主机端口占用情况:如果代码运行在宿主机,检查1433端口是否被其他程序占用:
# Windows系统 netstat -ano | findstr :1433 # Linux/macOS系统 lsof -i :1433若端口被占用,修改docker-compose的端口映射(比如改为
1434:1433),同时更新连接字符串的端口为1434。等待SQL Server初始化完成:SQL Server容器启动后需要数分钟完成初始化,未完成时连接会失败,可等待容器日志出现
SQL Server is now ready for client connections.后再执行迁移。确认SA密码合规性:检查SA密码是否符合SQL Server复杂度要求(至少8位,包含大小写、数字、特殊字符),若密码不合规会导致SQL Server无法正常启动,可通过容器日志确认。
内容的提问来源于stack exchange,提问作者Vlad

