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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:29:37