web-dev-qa-db-fra.com

Impossible de se connecter au serveur SQL à partir du projet principal asp.net pris en charge par Docker

J'ai un projet ASP.NET Core 2.2 pour lequel j'ai activé le support Docker. Le projet fonctionne correctement tant qu'il ne nécessite pas de connexion à la base de données. Par exemple pour la connexion. Lorsque j'entre les informations d'identification de l'utilisateur, j'obtiens l'erreur comme ci-dessous.

Une exception non gérée s'est produite lors du traitement de la demande. Win32Exception: une tentative de connexion a échoué car la partie connectée n'a pas répondu correctement après un certain temps ou la connexion établie a échoué car l'hôte connecté n'a pas répondu

Emplacement inconnu SqlException: une erreur liée au réseau ou spécifique à l'instance s'est produite lors de l'établissement d'une connexion à SQL Server. Le serveur est introuvable ou inaccessible. Vérifiez que le nom de l'instance est correct et que SQL Server est configuré pour autoriser les connexions à distance. (fournisseur: TCP Fournisseur, erreur: 0 - Une tentative de connexion a échoué parce que la partie connectée n'a pas répondu correctement après un certain temps, ou la connexion établie a échoué parce que l'hôte connecté n'a pas répondu.)

System.Data.SqlClient.SqlInternalConnectionTds..ctor (identité DbConnectionPoolIdentity, SqlConnectionString connectionOptions, objet providerInfo, bool redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData, bool applyTransientFaultHOperation est due à une exception de type TransactionFault: une exception à la valeur de cette erreur de transposition: bool applyTransientFaultHalter Si vous vous connectez à une base de données SQL Azure, envisagez d'utiliser SqlAzureExecutionStrategy.

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

Auparavant, l'erreur était différente lorsque TCP/IP n'était pas activé dans mon gestionnaire de configuration du serveur SQL. (Je ne me souviens pas de l'erreur) J'ai suivi les étapes mentionnées dans le lien https://jack-vanlightly.com/blog/2017/9/24/how-to-connect-to-your-local-sql-server-from-inside-docker pour résoudre ce problème.

J'ai également activé TCP/IP et nommé canaux. Je peux également me connecter en utilisant IP à partir de SQL Management Studio.

Chaîne de connexion actuelle:

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

Veuillez me faire savoir si je manque une étape. Je veux me connecter à un sql local depuis mon projet docker

6
Chaitanya Gadkari

Cela m'a pris un peu de temps pour travailler, il y a un certain nombre de petits problèmes qui peuvent être erronés, ce qui le rend frustrant. Cela peut devenir encore plus frustrant car le projet Visual Studio 2017 d'application Web de base .net qui est généré automatiquement ne fonctionne pas directement. Avoir cette expérience comme première exposition à Docker n'est pas idéal.

Au départ, j'avais également l'hypothèse incorrecte que l'image de docker viendrait avec SQL Server à l'intérieur du conteneur, ce n'est pas le cas, il essaie d'accéder au serveur de base de données qui doit être préinstallé sur la machine hôte.

Étapes à suivre (testé pour une image de docker Windows, plutôt que Linux);

1) Obtenez l'adresse IP de votre machine hôte, en exécutant une invite de commande et en tapant IPCONFIG

2) Définissez la chaîne de connexion à la base de données dans votre fichier appsettings.json à cette adresse IP, suivie du numéro de port SQL Server, c'est-à-dire;

192.168.X.X, 1433

3) Définissez la chaîne de connexion pour ne pas utiliser Trusted_Connection (supprimez-la de la chaîne de connexion) et le code dur dans l'ID utilisateur et le mot de passe;

ID utilisateur = sa; Mot de passe = SuperSecurePassword;

Si je ne le faisais pas, sur certaines configurations SQL Server, j'obtiendrais une erreur inhabituelle (je ne me souviens pas vraiment des détails!)

La chaîne de connexion montre quelque chose comme ceci;

"Server = 192.168.X.X, 1433; Database = MyDatabase; User Id = sa; Password = SuperSecurePassword; MultipleActiveResultSets = true"

4) maintenant sur la machine hôte, vous devez ouvrir le pare-feu Windows et ajouter une nouvelle règle de connexion entrante, pour TCP port 1433.

5) Après tout cela, et cela ne fonctionne toujours pas, essayez un redémarrage; J'ai lutté pendant longtemps et j'ai dû redémarrer, ce qui m'a donné vie; Je ne suis pas sûr que Docker ait correctement initialisé, mais c'est surtout de la spéculation! Je n'aime pas vraiment dire que le redémarrage est une solution aux problèmes, ce n'est pas vraiment une réponse, mais dans certains cas, il fait l'affaire.

modifier, une dernière chose, exécuter Visual Studio en mode administrateur (icône de clic droit, "exécuter en tant qu'administrateur") aide également.

S'excuse pour la résurrection d'un ancien thread, mais ce problème semble toujours exister et les informations disponibles sont un peu inégales sur la façon de résoudre ce problème, compte tenu du petit nombre de choses à faire.

12
Phill

Donc, ce qui a fonctionné pour moi, c'est:

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

docker.for.win.localhost est une adresse que le DNS interne de docker résoudra comme localhost (pas localhost à l'intérieur de docker mais la machine d'hébergement). Le code ci-dessus vous fournit une adresse IP de votre hôte local et vous pouvez créer une chaîne de connexion comme celle-ci:

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

Cela fonctionnera si vous utilisez une instance de serveur sql nommée - remplacez SQL2017 par le nom de votre instance et les pédiatres par l'utilisateur correct.

TOUTEFOIS! Pour les migrations et la mise à jour de la base de données, l'hôte local fonctionne correctement. Probablement puisque ce n'est pas géré depuis le conteneur Docker.

MODIFIER:

La deuxième solution est un peu plus propre, mais vous devez avoir un projet qui prend en charge Docker-compose.

Dans le fichier docker-compose.yml dans la définition de votre service sous la définition de propriété d'image, ajoutez:

extra_hosts:
- "localhost:192.168.65.2"

Vous devez toujours savoir pour quelle adresse IP (que vous pouvez trouver en utilisant la réponse d'origine) pour laquelle vous devez ajouter un alias, mais une fois que vous le savez, c'est un peu plus propre. Sur plus de 5 machines différentes sur lesquelles j'ai travaillé, cette IP est correcte.

6
KrzysztofG06

J'ai eu le même problème, j'ai suivi la même approche que sur le site Web que vous avez mentionné. Cela devrait fonctionner comme ça si vous avez les réseaux avec une configuration standard.

Désactivez simplement le pare-feu de votre réseau public.

Mon problème était simplement que les fenêtres semblaient classer le réseau créé par Docker comme réseau public et donc le pare-feu l'a bloqué, comme pour celui-ci:

Impossible de se connecter à SQL Server express à partir de l'application de base .net exécutée sur docker

Il n'y est pas marqué comme réponse mais plutôt édité dans la question.

2
Agash Thamo.

J'ai rencontré le même problème et j'ai suivi toutes les étapes mentionnées par Phil mais je n'ai toujours pas pu résoudre ce problème. Enfin, en plus des étapes de la réponse spécifiée, j'ai dû activer mon SQL Server pour le protocole TCP en suivant ces étapes.

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