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

如何将.NET Docker Compose连接至运行中的SQL Server容器

问题:Docker Compose部署的.NET API无法连接已运行的SQL Server Docker容器

我在Linux环境下用Docker Compose启动.NET API,API成功启动且Swagger正常运行,但容器无法连接数据库,报错:

建立与SQL Server的连接时发生与网络相关或特定于实例的错误。未找到服务器或无法访问服务器。请验证实例名称是否正确,并且SQL Server已配置为允许远程连接。(provider: TCP Provider, error: 40 - 无法打开到SQL Server的连接: 无法打开到SQL Server的连接)

想确认:能否将Docker Compose部署的API连接到已运行的MS-SQL Docker容器?

我的Docker Compose配置:

version: '3.4'

services:
  vldonvehicle:
    image: ${DOCKER_REGISTRY-}api
    ports:
      - "8000:5000"
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
      - ASPNETCORE_URLS=https://+:443;http://+:80
      - ASPNETCORE_Kestrel__Certificates__Default__Password=password
      - ASPNETCORE_Kestrel__Certificates__Default__Path=/https/cert.pfx
      - DATABASE_PUBLIC_URL=localhost,1433
    build:
      context: .
      dockerfile: Re_VLDonFeedStock_WebApi/Dockerfile
    volumes:
      - ~/.aspnet/https:/https:ro

连接字符串:

...
"ConnectionStrings": {
    "Default": "Initial Catalog=CRMService; Data Source=localhost,1433; Persist Security Info=True;User ID=sa;Password=password; TrustServerCertificate=True"
  },
...

解决方案

完全可行,问题核心是容器内的localhost指向容器自身,而非宿主机或其他Docker容器,以下是两种有效解决方法:

方法一:使用Docker共享网络(推荐)

Docker容器间通过共享网络可直接用容器名/别名通信,步骤如下:

  1. 确认或创建SQL Server容器所在的Docker网络:
    • 执行docker network ls查看现有网络,若未专门创建,执行docker network create mssql-network新建
    • 将已运行的SQL Server容器加入该网络:docker network connect mssql-network <你的SQL Server容器名称/ID>
  2. 修改Docker Compose配置,将API容器加入同一网络:
    version: '3.4'
    
    services:
      vldonvehicle:
        # 保留原有所有配置
        networks:
          - mssql-network
    
    networks:
      mssql-network:
        external: true # 标记为已存在的外部网络
    
  3. 更新连接字符串的Data Source为SQL Server容器的名称(例如容器名为mssql,则写为mssql,1433):
    "ConnectionStrings": {
        "Default": "Initial Catalog=CRMService; Data Source=mssql,1433; Persist Security Info=True;User ID=sa;Password=password; TrustServerCertificate=True"
      }
    

方法二:使用宿主机映射地址

若SQL Server容器已将1433端口映射到宿主机(启动时带-p 1433:1433参数),可直接用Linux Docker内置的宿主机别名host.docker.internal替换localhost:
修改连接字符串:

"ConnectionStrings": {
    "Default": "Initial Catalog=CRMService; Data Source=host.docker.internal,1433; Persist Security Info=True;User ID=sa;Password=password; TrustServerCertificate=True"
  }

额外检查项

  • 确认SQL Server容器的sa密码与连接字符串中的完全一致
  • 执行docker logs <SQL Server容器名>,验证容器无启动错误
  • 保留TrustServerCertificate=True,避免Linux环境下的SSL证书验证问题

内容的提问来源于stack exchange,提问作者Alexandr Gevorkyan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 19:40:04