如何从另一个容器连接到 SQL Sever docker 容器?

WPI*_*nfo 14 sql-server docker entity-framework-core asp.net-core asp.net-core-2.0

我已使用以下命令拉取并运行 SQL Server 2017 容器映像:

docker pull microsoft/mssql-server-linux
docker run --name mssql -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=!Abcd123' -p 1433:1433 -d microsoft/mssql-server-linux
Run Code Online (Sandbox Code Playgroud)

我还使用以下命令将 ASP.NET Core Web API 应用程序部署到 Docker 容器:

dotnet publish -c Release -o Output
docker build -t apitest .
docker run -p 3000:80 --name apitest_1 apitest
Run Code Online (Sandbox Code Playgroud)

内容Dockerfile

FROM microsoft/dotnet
COPY Output /app
WORKDIR /app
EXPOSE 80/tcp
ENTRYPOINT ["dotnet", "DockerSQLTest.dll"]
Run Code Online (Sandbox Code Playgroud)

在我的 Web API 应用程序中,我创建了一个 Entity Framework Core 迁移,它将创建数据库并播种一些数据。在类的Configure方法中Startup,我添加以下代码以将挂起的迁移应用于数据库:

public async void Configure(IApplicationBuilder app,
                            IHostingEnvironment env, 
                            StudentDbContext dbContext)
{
    await dbContext.Database.MigrateAsync();
    ...
}
Run Code Online (Sandbox Code Playgroud)

并从中检索数据库连接字符串,appsettings.json其中包含以下部分:

"ConnectionStrings": {
    "DefaultConnection": "Server=localhost,1433;Database=student;User Id=sa;Password=!Abcd123;"
}
Run Code Online (Sandbox Code Playgroud)

但是应用程序无法正常运行,异常信息:

fail: WebApplication6.Startup[0]
  System.Threading.Tasks.TaskCanceledException: A task was canceled.
     at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenDbConnectionAsync(Boolean errorsExpected, CancellationToken cancellationToken)
     at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenAsync(CancellationToken cancellationToken, Boolean errorsExpected)
     at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerDatabaseCreator.<>c__DisplayClass20_0.<<ExistsAsync>b__0>d.MoveNext()
  --- End of stack trace from previous location where exception was thrown ---
     at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.ExecuteAsync[TState,TResult](TState state, Func`4 operation, Func`4 verifySucceeded, CancellationToken cancellationToken)
     at Microsoft.EntityFrameworkCore.Migrations.HistoryRepository.ExistsAsync(CancellationToken cancellationToken)
     at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.MigrateAsync(String targetMigration, CancellationToken cancellationToken)
Run Code Online (Sandbox Code Playgroud)

有什么不对的吗?

Elt*_*man 14

Docker 内置了一个 DNS 服务器,容器之间通过容器名称相互连接。在你的情况,你命名的SQL Server容器,mssql所以这就是你需要把你的连接字符串的.NET应用程序的服务器名称:Server=mssql;Database=student;User Id=sa;Password=!Abcd123;

查看GitHub 上.NET Core 专辑查看器示例,该示例使用 Docker Compose 定义多容器应用程序。


Ngu*_*àng 11

我通过首先检查容器网络然后找到网络 IP 并放入 appsetting.json 解决了这个问题

 "ConnectionStrings": {
    "DefaultConnection": "Server=172.17.0.2;Database=VehicleKey;User Id=sa;Password=p@ssW0rd;"
  }
Run Code Online (Sandbox Code Playgroud)

检查 docker 网络

查找 SQLSERVER 的名称 在此处输入图片说明