SQL 服务器与 Docker 和 Entity Framework 的连接

SQL Server connection with Docker and Entity Framework

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

当我 POST 一个负载到 API 服务时,我得到以下错误:

SqlException: A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: TCP Provider, error: 40 - Could not open a connection to 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"
},

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

    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"

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

由于不清楚,我假设您的服务和数据库都已 docker 化。

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

其次,我认为没有理由通过指定 override.yml 来使 docker-compose.yml 过于复杂,但它必须是 docker-compose.override.yml 而不是 [=12] =].对于调试,在 docker inspect.

的帮助下查看容器是如何真正启动的(尤其是如果使用 docker-compose)可能会有所帮助

为了在两个容器之间共享网络,我们可以使用 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"
    
  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;