Как подключиться к Docker-контейнеру SQL Sever из другого контейнера? - PullRequest
0 голосов
/ 22 октября 2018

Я извлек и запустил образ контейнера 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"]

В моем приложении веб-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)

Что-то не так?

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

В Docker встроен DNS-сервер, и контейнеры соединяются друг с другом с помощью имени контейнера .В вашем случае вы назвали контейнер SQL Server mssql, так что это имя сервера, которое вы должны вставить в строку подключения для приложения .NET: Server=mssql;Database=student;User Id=sa;Password=!Abcd123;.

Извлечь .NET CoreПример просмотра альбома на GitHub , который использует Docker Compose для определения мультиконтейнерного приложения.

0 голосов
/ 22 октября 2018

Прежде всего, когда вы используете два или более контейнеров, не может быть никаких локальных соединений.Каждый док-контейнер имеет собственный внутренний IP-адрес.После того, как вы запустили контейнер с открытым портом, чтобы иметь возможность подключиться к этому контейнеру, вам нужно указать IP-адрес хоста (где фактически работает контейнер).

Так, например, у вас должна быть следующая строка для подключения:

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

где: 192.168.1.99 - фактический IP-адрес хоста, на котором работает докер-контейнер.

...