it-swarm.com.de

Stellen Sie von einem Docker-Container eine Verbindung zur SQL Server-Datenbank her

Ich habe ein Docker für Windows auf meinem Computer installiert. Es gibt eine Konsolenanwendung, die auf .net core 1.0.0 ausgerichtet ist und versucht, auf eine SQL Server-Datenbank zuzugreifen, die auf einer anderen VM ausgeführt wird. Ich kann den VM, auf dem SQL Server ausgeführt wird, von meinem Computer aus pingen.

Wenn ich versuche, die Konsolenanwendung mit dotnet run von der Eingabeaufforderung auf meinem Computer aus auszuführen, funktioniert das einwandfrei. Wenn jedoch dieselbe Anwendung in einem Docker-Container ausgeführt wird, erhalte ich eine Nachricht 

Bei .__ trat ein netzwerkbedingter oder instanzspezifischer Fehler auf. Herstellen einer Verbindung zu SQL Server. Der Server wurde nicht gefunden oder war nicht erreichbar. Stellen Sie sicher, dass der Instanzname korrekt ist und dass SQL Server ist so konfiguriert, dass Remoteverbindungen zugelassen werden. (provider: TCP Provider, Fehler: 40 - Verbindung zu SQL Server konnte nicht hergestellt werden)

Ich habe es versucht 

docker run --add-Host sqldemo:<VM running sql server ip here>

aber das machte keinen Unterschied.

15
Learning Docker

Annahmen

  • Microsoft SQL Server 2016
  • Windows 10-Jubiläums-Update
  • Windows-Container
  • ASP.NET-Kernanwendung 

Fügen Sie Ihrer SQL-Datenbank einen SQL-Benutzer hinzu.

  • In MS SQL erweitern Sie die Datenbank
  • Rechtsklick auf 'Sicherheit/Logins'
  • Wählen Sie "Neuer Login" 
  • Erstellen Sie einen Benutzernamen und ein Passwort.
  • Zuweisen einer 'Serverrolle (n)' ... Ich habe sysadmin verwendet, seit ich gerade teste
  • Unter 'Benutzerzuordnung' habe ich meinen neuen Benutzer zu meiner Datenbank hinzugefügt und 'dbo' für das Schema verwendet.

Ändern Sie die SQL-Authentifizierung, um den SQL Server-Authentifizierungsmodus zuzulassen

Klicken Sie mit der rechten Maustaste auf Ihre Datenbank und wählen Sie das Optionsfeld "Eigenschaften/Sicherheit/Serverauthentifizierung/SQL Server und Windows-Authentifizierungsmodus". Starten Sie den MS SQL-Dienst neu.

Aktualisieren Sie Ihre appsettings.json mit Ihrem neuen Benutzernamen und Kennwort

Beispiel 

"ConnectionStrings": {
        "DefaultConnection": "Server=YourServerName;Database=YourDatabaseName;MultipleActiveResultSets=true;User Id=UserNameYouJustAdded;Password=PassordYouJustCreated"
},

Stellen Sie sicher, dass Sie Trusted_Connection=True entfernen.

Erstellen Sie eine Docker-Datei

Meine Docker-Beispieldatei

FROM Microsoft/dotnet:nanoserver
ARG source=.
WORKDIR /app 
EXPOSE 5000 
EXPOSE 1433 
ENV ASPNETCORE_URLS http://+:5000 
COPY $source .

Anwendung veröffentlichen

Wird am selben Speicherort wie die Docker-Datei in einer PowerShell mit erhöhten Rechten ausgeführt 

dotnet publish

docker build bin\Debug\netcoreapp1.0\publish -t aspidserver

docker run -it  aspidserver cmd

Ich wollte den Container ausführen und sehen, wie die Ausgabe in PowerShell ausgeführt wurde. 

Sobald der Container bei der Eingabeaufforderung im Container betriebsbereit war, stieß ich meine Anwendung aus.

dotnet nameOfApplication.dll

Wenn alles nach Plan verlief, sollte man laufen.

6
ben

Sie können einen Docker-Container mit Netzwerkeinstellungen auf Host ausführen. Ein solcher Container teilt den Netzwerkstack mit dem Docker-Host und aus Sicht des Containers verweist localhost (oder 127.0.0.1) auf den Docker-Host.

docker run --net=Host ... 

Dann sollten Sie die SQL Server-Datenbank aus dem Docker-Container heraus holen wie von Ihrem Host.

2
Camilo Silva

wie in dieser Antwort

SQL Server-Instanzzeichenfolgenverbindung in Linux Docker

Laut Saurabh Singh von Microsoft:

Die Unterstützung des Instanznamens ist in Version 1.1 von .Net Core verfügbar. In v1.0 In .Net Core werden Instanzennamen nur unter .__ unterstützt. Windows.

Daher glaube ich nicht, dass Sie von .Net Core 1.0 aus unter Linux eine Verbindung zu einem SQL Server unter Verwendung des Instanznamens herstellen können.

Ihre Wahl scheint zu sein:

don't use instance name
wait for .Net Core 1.1 (planned for "Fall 2016")
use pre-release version of .Net Core 1.1
0