【问题标题】:SQL Server connection with Docker and Entity FrameworkSQL Server 与 Docker 和实体框架的连接
【发布时间】:2019-07-31 05:38:51
【问题描述】:

我正在尝试为我在 docker 上部署的服务设置数据库连接,其中服务和数据库都是 dockerized。

当我将有效负载发布到服务的 API 时,我收到以下错误:

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

API定义为:

    [HttpPost]
    public async Task<IActionResult> Postfoo([FromBody] Foo foo)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        _context.Foos.Add(foo);
        await _context.SaveChangesAsync();

        return CreatedAtAction("GetFoo", new { id = foo.ID }, foo);
    }

数据库连接在appsettings.json中定义如下:

"ConnectionStrings": {
    "DefaultConnection": "Server=tcp:127.0.0.1,1433;Trusted_Connection=True;MultipleActiveResultSets=true;User ID=sa;Password=Pass@word"
},

定义db连接的Startup.cs中的启动逻辑如下:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        services.AddDbContext<WorkflowContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
    }

docker-compose.yml中,数据库服务定义为:

version: '3.4'

services:

  sql.data:
    image: microsoft/mssql-server-linux:2017-latest

docker-compose.override.yml中,与数据库相关的部分定义为:

version: '3.4'

services:

  sql.data:
    environment:
      - SA_PASSWORD=Pass@word
      - ACCEPT_EULA=Y
    ports:
      - "1433:1433"

我可能忽略了,但仍然看不到缺少什么?

【问题讨论】:

    标签: sql-server entity-framework docker asp.net-core database-connection


    【解决方案1】:

    为了在两个容器之间共享网络,我们可以使用 docker-compose 来创建共享网络。

    按照以下步骤操作:

    1. 码头工人撰写

      version: '3.4'
      
      services:
      coredocker:
          image: coredocker
          build:
          context: .
          dockerfile: CoreDocker/Dockerfile
      sql.data:
          image: microsoft/mssql-server-linux:2017-latest
          environment:
          - SA_PASSWORD=Pass@word
          - ACCEPT_EULA=Y
          ports:
          - "1433:1433"
      
    2. appsettings.json

      {
          "ConnectionStrings": {
              "DefaultConnection": "Server=sql.data,1433;Database=CoreDocker;MultipleActiveResultSets=true;User ID=sa;Password=Pass@word"
          },
          "Logging": {
              "LogLevel": {
              "Default": "Warning"
              }
          },
          "AllowedHosts": "*"
      }
      

    这里有两点:

    1. Server=tcp:127.0.0.1,1433; 更改为Server=sql.data,1433,这是服务名称和端口
    2. 删除Trusted_Connection=True;

    【讨论】:

      【解决方案2】:

      由于不清楚,我假设您的服务和数据库都是 dockerized。

      首先,在appsettings.json 中,您必须指定 docker 主机的 IP 地址而不是 localhost,因为 localhost 仅指容器本身的 localhost。您可能想阅读more about docker networking here

      其次,我认为没有理由通过同时指定 override.yml 来使 docker-compose.yml 过于复杂,但它必须是 docker-compose.override.yml 而不是 docker-compose-override.yml。对于调试,在docker inspect 的帮助下查看容器是如何真正启动的(尤其是在使用 docker-compose 时)可能会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多