SQL Server 与 Docker 和实体框架的连接

Ham*_*med 7 sql-server entity-framework database-connection docker asp.net-core

我正在尝试为我在 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);
    }
Run Code Online (Sandbox Code Playgroud)

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

"ConnectionStrings": {
    "DefaultConnection": "Server=tcp:127.0.0.1,1433;Trusted_Connection=True;MultipleActiveResultSets=true;User ID=sa;Password=Pass@word"
},
Run Code Online (Sandbox Code Playgroud)

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

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

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

version: '3.4'

services:

  sql.data:
    image: microsoft/mssql-server-linux:2017-latest
Run Code Online (Sandbox Code Playgroud)

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

version: '3.4'

services:

  sql.data:
    environment:
      - SA_PASSWORD=Pass@word
      - ACCEPT_EULA=Y
    ports:
      - "1433:1433"
Run Code Online (Sandbox Code Playgroud)

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

Tao*_*hou 9

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

请按照以下步骤操作:

  1. docker 撰写

    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"
    
    Run Code Online (Sandbox Code Playgroud)
  2. appsettings.json

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

这里有两点:

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