【问题标题】:.NET Core API can't connect to database via docker-compose.NET Core API 无法通过 docker-compose 连接到数据库
【发布时间】:2019-07-10 08:57:21
【问题描述】:

我正在开发一个带有 MSSQL Server 数据库的 .NET 核心 Web API。我试图将它容器化到一个 Docker 容器中,并使用 Docker Compose 来启动这个服务。但我的 API 无法连接到数据库。

出现以下错误:

应用程序启动异常:System.Data.SqlClient.SqlException (0x80131904):建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。 (提供者:TCP 提供者,错误:40 - 无法打开与 SQL Server 的连接)

我的启动代码:

services.AddDbContext<ProductServiceDbContext>(options =>
     options.UseSqlServer("server=sqlserver;port=1433;user id=sa;password=docker123!;database=ProductService;"));

Dockerfile:

FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /app

COPY *.csproj ./
RUN dotnet restore dockerapi.csproj

COPY . ./
RUN dotnet publish dockerapi.csproj -c Release -o out

FROM microsoft/dotnet:2.1-aspnetcore-runtime AS runtime

WORKDIR /app

COPY --from=build /app/out .

ENTRYPOINT ["dotnet", "dockerapi.dll"]`

Docker 撰写:

version: '3.4'

services:
   productservice:
     image: productservice/api
     container_name: productservice_api
     build:
       context: ./ProductService/ProductService
     depends_on:
       - sqlserver
     ports:
       - "5000:80"

   sqlserver:
     image: microsoft/mssql-server-linux:latest
     container_name: sqlserver
     ports:
       - "1433"
     environment:
       - ACCEPT_EULA=Y 
       - SA_PASSWORD=docker123!

我已经尝试了几件事:

  • 在 docker-compose 文件中添加链接(productservice 中的 sqlserver)
  • 将网络添加到 docker-compose 文件中
  • 将连接字符串更改为 “服务器=sqlserver;用户ID=sa;密码=docker123!;数据库=ProductService;”或 "server=sqlserver,1433;user id=sa;password=docker123!;database=ProductService;"

【问题讨论】:

  • 另外,我建议不要在您的应用程序中使用sa 帐户。为您的应用程序创建具有适当权限的登录名(和用户);不要给它sysadmin 访问权限。
  • 您可以在您的撰写文件端口中尝试此更改:-“1433:1433”
  • 不幸的是没有任何区别

标签: sql-server docker .net-core docker-compose containers


【解决方案1】:
  sqlserver:
    image: "microsoft/mssql-server-linux:latest"
    extra_hosts:
      - "localhost:192.168.65.2"
    container_name: sqlserver
    hostname: sqlserver
    environment:
      ACCEPT_EULA: "Y"
      SA_PASSWORD: "Your_password123"
    ports:
      - "49173:1433"

将连接字符串更改为 “本地主机,49173;数据库=产品服务;用户 id=sa;密码=Your_password123;

【讨论】:

    【解决方案2】:

    试试这些改变:

    sqlserver:
         image: microsoft/mssql-server-linux:latest
         container_name: sqlserver
         ports:
           - "1433:1433" # map the ports
         environment:
           - ACCEPT_EULA=Y 
           - SA_PASSWORD=docker123!
    

    【讨论】:

      【解决方案3】:

      嘿,我遇到了类似的问题,偶然发现了您的帖子,这与我遇到的问题不同,但我想我知道您遇到的问题(对不起,这个回复太晚了)

      查看您的连接字符串server=sqlserver;port=1433;user id=sa;password=docker123!;database=ProductService;,您实际上必须以另一种方式指定端口:server=sqlserver,1433;user id=sa;password=docker123!;database=ProductService;

      希望这会有所帮助!

      【讨论】:

        【解决方案4】:
        1. 尝试另一个端口,因为它可能会导致与现有端口发生冲突。例如“1433:1401”;
        2. 暂时禁用您的防病毒软件,看看它是否有效;
        3. 在运行容器之前创建一个名称为“ProductService”的目录,就像在 appSettings.json 中定义的那样;

        我没有测试过这个。风险自负。

        【讨论】:

          猜你喜欢
          • 2018-12-21
          • 1970-01-01
          • 2019-02-25
          • 2021-01-02
          • 2017-11-18
          • 1970-01-01
          • 1970-01-01
          • 2019-11-06
          • 2020-06-03
          相关资源
          最近更新 更多