2016-11-22 4 views
0

Wir haben einen Webserver in einem Linux-Docker-Container ausgeführt. Wenn ich es auf einem Windows 10-Host ausgeführt ich Fehler erhalten folgenden auf den lokalen SQL Server auf Verbindungs:Verbindungszeichenfolge vom Andock-Container zum SQL Server dblocal in Host

Microsoft.EntityFrameworkCore.Query.Internal.SqlServerQueryCompilationContextFactory[1] 
    An exception occurred in the database while iterating the results of a query. 
    System.Data.SqlClient.SqlException: A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: TCP Provider, error: 25 - Connection string is not valid) ---> System.Net.Internals.SocketExceptionFactory+ExtendedSocketException: No such device or address... 

Die Verbindungszeichenfolge in der json wie folgt aussieht:

"ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=MyAppDb;User ID=test;Password=test;", 

Wenn ich den Webserver debuggen In Visual Studio mit der gleichen Verbindungszeichenfolge funktioniert es. Also ich verstehe nicht, warum Docker den Connection string is not valid Fehler wirft.

Der Webserver verwendet .NET Core 1.1, daher sollte in Bezug auf this die Verbindung zu einer benannten Instanz von SQL Server funktionieren. Ich habe zwei SQL Server-Instanzen installiert. Die Verbindung mit Named Pipes funktioniert nicht, da das Linux-Andockfenster dies nicht unterstützt.

Ich benutze den Netzwerk-Modus Host für den Behälter, so sollte es die gleiche Netzwerkumgebung wie die Host-Computer hat:

docker run --rm -it --name MyApp -v c:\users\myself\MyApp.json:/app/appsettings.json --network="host" MyAppImage 

Hat jemand eine Idee?

+0

Ist ['LocalDb'] (https://msdn.microsoft.com/en-us/library/hh510202.aspx) auf dem Webserver installiert? – DavidG

+0

Der Container befindet sich auf einer anderen IP-Adresse, nicht auf dem lokalen Host. Wenn Sie den Datenbankserver auf dem lokalen Rechner ausführen, müssen Sie das TCP/IP-Netzwerk für den Datenbankserver aktivieren und die Konfiguration für die Verwendung des HOSTNAME aktualisieren oder IP der Host-Umgebung ... sollte dies idealerweise über eine Umgebungsvariable erfolgen. – Tracker1

+0

@DavidG: Der LocalDb wird auf dem Windows 10-Hostcomputer ausgeführt. – gumo

Antwort

1

Ich benutze den Netzwerk-Modus Host für den Behälter, so sollte es die gleiche Netzwerkumgebung wie den Host-Computer

hat Wenn ich diese Aussage richtig verstanden hat, dies nicht tun, was Sie denken, es tut. Der Container hat dieselbe Netzwerkumgebung wie der Host. Der Host ist jedoch nicht Ihre physische Maschine, es ist die VM, die von Docker zum Ausführen von Linux-Containern erstellt wird. Es gibt eine umfassendere Erklärung von Hyper-V-Vernetzung here. Das Diagramm unten auf dem einen basiert aus diesem Artikel

Docker on windows networking

Die Netzwerkkarte in rot umrandet ist derjenige, der das Gerät auf die virtuelle Switch Docker schafft für Windows verbinden verwendet. Die blau umrissene Netzwerkkarte ist diejenige, die die Linux-VM für die Verbindung mit demselben virtuellen Switch verwendet. Es ist auch die Karte, die Ihr Container sieht, wenn er Host Netzwerk verwendet.

Wenn Ihre Anwendung in einem Container ausgeführt wird, müssen Sie über das Netzwerk eine Verbindung zur Datenbank herstellen. This article behandelt die Erstellung von Multi-Container-Anwendungen mit Docker Compose unter Windows. Obwohl der Autor Windows-Container verwendet, stellt er ein Beispiel docker-compose file bereit, das einen Datenbankcontainer und einen Webcontainer sowie eine Verbindungszeichenfolge für die Verknüpfung erstellt.

Es gibt auch eine große Schritt für Schritt Anleitung zum Andocken NerdDinner Anwendung. durchläuft die Konvertierung der Anwendung von localdb zu einem SQL Server mit Container.

+0

Danke für die Einsicht in den Host. Dann ist es klar, dass ich eine Verbindung über IP oder Hostname als @ Tracker1 vorgeschlagen habe. In Bezug auf die Containerisierung des SQL-Servers wollen wir das in diesem Szenario nicht. – gumo

Verwandte Themen