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

时间:2018-10-22 09:23:52

标签: sql-server docker asp.net-core entity-framework-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

我还使用以下命令将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

Dockerfile的内容:

FROM microsoft/dotnet
COPY Output /app
WORKDIR /app
EXPOSE 80/tcp
ENTRYPOINT ["dotnet", "DockerSQLTest.dll"]

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

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

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

"ConnectionStrings": {
    "DefaultConnection": "Server=localhost,1433;Database=student;User Id=sa;Password=!Abcd123;"
}

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

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)

有什么问题吗?

3 个答案:

答案 0 :(得分:3)

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

 "ConnectionStrings": {
    "DefaultConnection": "Server=172.17.0.2;Database=VehicleKey;User Id=sa;Password=p@ssW0rd;"
  }

inspect docker network

答案 1 :(得分:2)

Docker内置有一个DNS服务器,并且容器通过容器名称相互连接。在您的情况下,您将SQL Server容器命名为GET https://www.googleapis.com/drive/v3/files/1EEYXRLIWD1_kbX3c8yYeY8duBSE_KeCVDUFSh9Sth7w?key={YOUR_API_KEY} ,因此,这是您需要在.NET应用程序的连接字符串中输入的服务器名称:mssql

签出.NET Core album viewer sample on GitHub,它使用Docker Compose定义了一个多容器应用。

答案 2 :(得分:0)

首先,当您使用两个或多个容器时,将没有任何本地主机连接。 每个docker容器都有自己的内部网络IP。 启动具有裸露端口的容器以能够连接到该容器后,您需要指定主机IP(容器实际运行的位置)。

因此,例如,您应该具有下一个用于连接的字符串:

Server=192.168.1.99,1433;Database=student;User Id=sa;Password=!Abcd123;

其中:192.168.1.99-运行docker容器的主机的实际IP。