web-dev-qa-db-ja.com

Dockerでサポートされているasp.netコアプロジェクトからSQLサーバーに接続できません

Dockerサポートを有効にしたASP.NET Core 2.2プロジェクトがあります。データベース接続を必要としない限り、プロジェクトは問題なく実行されます。ログイン用など。ユーザーの資格情報を入力すると、次のようなエラーが表示されます。

リクエストの処理中に未処理の例外が発生しました。 Win32Exception:接続の試行が一定時間後に適切に応答しなかったために失敗した、または接続されたホストが応答に失敗したために確立された接続が失敗した

不明な場所SqlException:SQL Serverへの接続を確立中にネットワーク関連またはインスタンス固有のエラーが発生しました。サーバーが見つからなかったか、アクセスできませんでした。インスタンス名が正しいこと、およびSQL Serverがリモート接続を許可するように構成されていることを確認してください。 (プロバイダー:TCPプロバイダー、エラー:0-接続された側が一定時間後に適切に応答しなかったために接続試行が失敗したか、接続されたホストが応答しなかったために確立された接続が失敗しました。)

System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity、SqlConnectionString connectionOptions、object providerInfo、bool redirectedUserInstance、SqlConnectionString userConnectionOptions、SessionData reconnectSessionData、bool applyTransientFaultHandling)InvalidOperationException:例外が発生し、一時的なエラーが原因である可能性があります。 SQL Azureデータベースに接続している場合は、SqlAzureExecutionStrategyの使用を検討してください。

Microsoft.EntityFrameworkCore.Storage.Internal.SqlServerExecutionStrategy + d__7.MoveNext()

以前は、SQLサーバー構成マネージャーでTCP/IPが有効になっていない場合のエラーは異なっていました。(エラーを覚えていません)リンクに記載されている手順に従いました https://jack-vanlightly.com/blog/2017/9/24/how-to-connect-to-your-local-sql-server-from-inside-docker この問題を解決します。

TCP/IPと名前付きパイプも有効にしました。また、SQL Management StudioからIPを使用して接続することもできます。

現在の接続文字列:

"ConnectionStrings": {
    "DefaultConnection": "Server=xxx.xx.xx.x,1433;Database=TestDB;User ID=username;Password=pwd;Trusted_Connection=True;MultipleActiveResultSets=true"
  },

手順が足りない場合はお知らせください。 DockerプロジェクトからローカルSQLに接続したい

6

これは私が解決するのに少し時間がかかりました、間違っているかもしれないいくつかの小さな問題があり、それはそれをイライラさせます。自動生成される.netコアWebアプリケーションビジュアルスタジオ2017プロジェクトはそのままでは機能しないので、これはさらに苛立たしくなります。この経験をDockerへの最初の曝露として持つことは理想的ではありません。

私は最初、Dockerイメージがコンテナー内のSQL Serverに付属しているという誤った仮定も持っていましたが、これは当てはまりません。ホストマシンに事前にインストールする必要があるデータベースサーバーにアクセスしようとしています。

実行する手順(LinuxではなくWindows Dockerイメージでテスト済み);

1)コマンドプロンプトを実行し、IPCONFIGと入力して、ホストマシンのIPアドレスを取得します。

2)appsettings.jsonファイル内のデータベース接続文字列をこのIPアドレスに設定し、その後にSQL Serverのポート番号を続けます。

192.168.X.X、1433

3)Trusted_Connectionを使用しないように接続文字列を設定し(これを接続文字列から削除します)、ユーザーIDとパスワードにハードコードを使用します。

ユーザーID = sa; Password = SuperSecurePassword;

これを行わなかった場合、特定のSQL Server構成で異常なエラーが発生します(詳細を完全に思い出せません!)

接続文字列の表示は次のようになります。

「Server = 192.168.X.X、1433; Database = MyDatabase; User Id = sa; Password = SuperSecurePassword; MultipleActiveResultSets = true」

4)ホストマシンで、Windowsファイアウォールを開き、新しいインバウンド接続ルールをTCPポート1433に追加する必要があります。

5)この後、それでも機能しない場合は、再起動してみてください。私は長い間苦労し、再起動する必要がありました。 Dockerが正しく初期化されたかどうかはわかりませんが、これはほとんど推測ですが!再起動が問題の修正であるとは言いたくないのですが、これは実際には答えではありませんが、場合によってはうまくいくことがあります。

編集、最後に、管理者モードでVisual Studioを実行(アイコンを右クリック、「管理者として実行」)も役立ちます。

古いスレッドが復活したことをお詫びしますが、この問題はまだ存在しているようで、利用可能な情報は、実行する必要がある少数のことを考慮して、これを修正する方法について少し不規則です。

12
Phill

だから私のために働いているのは:

public static string DockerHostMachineIpAddress => Dns.GetHostAddresses(new Uri("http://docker.for.win.localhost").Host)[0].ToString();

docker.for.win.localhostは、Dockerの内部DNSがlocalhost(Docker内のlocalhostではなく、ホストマシン)として解決するアドレスです。上記のコードは、uにローカルホストのIPアドレスを提供し、次のような接続文字列を作成できます。

$"Server={DockerHostMachineIpAddress}\\SQL2017;Database=YourDB;User Id=Admin;Password=123;"

これは、名前付きSQLサーバーインスタンスを使用している場合に機能します-SQL2017をurインスタンス名に置き換え、資格情報を正しいユーザーに置き換えます。

しかしながら!移行およびデータベース更新の場合、localhostは正常に機能します。おそらく、Dockerコンテナから処理されていないためです。

編集:

2番目のソリューションは少しすっきりしていますが、docker-composeをサポートするプロジェクトが必要です。

サービスの定義の下にあるdocker-compose.ymlファイルに、イメージプロパティ定義の下に以下を追加します。

extra_hosts:
- "localhost:192.168.65.2"

エイリアスを追加する必要があるIPアドレス(元の回答を使用して調べることができます)をまだ知っている必要がありますが、一度知ったら、もう少しクリーンになります。私がこのIPで作業した5台以上の異なるマシンでは正しいです。

6
KrzysztofG06

私は同じ問題を抱えており、あなたが言及したウェブサイトと同じアプローチに従いました。標準構成のネットワークがある場合は、このように機能するはずです。

パブリックネットワークのファイアウォールを無効にするだけです。

私の問題は、WindowsがDockerによって作成されたネットワークをパブリックネットワークとして分類しているようで、ファイアウォールが次のようにブロックしたことです。

Dockerで実行されている.netコアアプリからSQL Server Expressに接続できません

回答としてマークされているのではなく、質問で編集されています。

2
Agash Thamo.

私は同じ問題に遭遇し、 Phil で言及されたすべての手順を実行しましたが、それでも解決できませんでした。最後に、指定された回答の手順に加えて、次の手順に従ってSQL ServerでTCPプロトコルを有効にする必要がありました。

1. Open SQL Server Configuration Manager
2. Select "SQL Server Network Configuration" > "Protocols for MSSQLSERVER"
3. Edit "TCP/IP" properties, and change "Enabled" to "Yes"
0
tech-y