.NET Core 2.2 Web API容器无法连接Docker内SQL Server的问题
解决Docker中.NET Core API无法连接SQL Server容器的问题
我一眼就看出问题出在容器间的网络通信上——你在Catalog.API的连接字符串里用了localhost,但在Docker容器的世界里,每个容器都是独立的网络环境,localhost指向的是容器自己,而不是你的宿主机或者SQL Server容器。下面是具体的解决方案:
1. 修改数据库连接字符串
打开你的appsettings.json,把连接字符串里的服务器地址从localhost,1433改成Docker Compose配置里的SQL服务名sqldata,1433:
{ "Logging": { "LogLevel": { "Default": "Warning" } }, "AllowedHosts": "*", "ConnectionStrings": { "Default": "Server=sqldata,1433;Initial Catalog=Test.Services.CatalogDb;User Id=sa;Password=Pass@word" } }
Docker Compose会自动为所有服务创建一个内部网络,服务名(这里是sqldata)可以直接被其他容器解析为对应的容器IP,这是容器间通信的标准方式。
2. 优化容器启动顺序(可选但推荐)
虽然你用了depends_on,但它只保证sqldata容器先启动,不保证SQL Server服务已经就绪。可以给sqldata服务添加健康检查,确保SQL Server完全启动后再启动Catalog.API:
version: '3.4' services: sqldata: ports: - 1433:1433 image: mcr.microsoft.com/mssql/server:2017-latest-ubuntu environment: - ACCEPT_EULA=Y - SA_PASSWORD=Pass@word healthcheck: test: ["CMD-SHELL", "/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P Pass@word -Q 'SELECT 1' || exit 1"] interval: 10s timeout: 30s retries: 5 catalog.api: ports: - 80:80 build: context: . dockerfile: src/Services/Catalog/Catalog.API/Dockerfile depends_on: sqldata: condition: service_healthy
3. 重新部署并测试
执行以下命令重新构建镜像并启动容器:
docker-compose down docker-compose build docker-compose up -d
之后再调用localhost:80/api/catalog,应该就能正常连接到SQL Server了。
为什么之前的方法没用?
- 用
localhost:容器内的localhost指向自身,自然找不到宿主机上的SQL Server(其实SQL Server在另一个容器里) - 用宿主机IP:虽然理论上可行,但需要确保容器能访问宿主机的1433端口,还要处理防火墙、网络模式等问题,远不如用服务名可靠
- 用
docker inspect的IP:容器IP是动态分配的,重启容器后可能会变化,不适合作为固定连接地址
内容的提问来源于stack exchange,提问作者Tjatte
相关产品推荐
相关产品推荐

