web-dev-qa-db-ja.com

別のコンテナーからSQL Server Dockerコンテナーに接続する方法?

次のコマンドを使用して、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)

何か間違っていることでも?

6
WPInfo

まず、2つ以上のコンテナを使用している場合、ローカルホスト接続はありません。各Dockerコンテナーには、独自の内部ネットワークIPがあります。コンテナーに接続できるようにポートを公開してコンテナーを開始したら、ホストIP(コンテナーが実際に実行されている場所)を指定する必要があります。

したがって、例として、次の接続文字列が必要です。

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

ここで:192.168.1.99-Dockerコンテナーが実行されているホストの実際のIP.

0
Rockvlv