web-dev-qa-db-fra.com

Se connecter à la base de données SQL Server à partir d'un conteneur docker

J'ai un menu fixe pour Windows installé sur ma machine. Une application console ciblant .net core 1.0.0 tente d'accéder à une base de données SQL Server s'exécutant sur une machine virtuelle différente. Je peux envoyer un ping à la VM exécutant SQL Server à partir de mon ordinateur.

Lorsque j'essaie d'exécuter l'application console à l'aide de dotnet run à partir de la commande Invite sur ma machine, tout fonctionne correctement. Mais lorsque la même application est exécutée à l'intérieur d'un conteneur Docker, un message s'affiche. 

Une erreur liée au réseau ou spécifique à une instance s'est produite pendant que établir une connexion à SQL Server. Le serveur n'a pas été trouvé ou n'était pas accessible. 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: 40 - Impossible d'ouvrir une connexion à SQL Server)

J'ai essayé d'utiliser 

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

mais cela ne faisait aucune différence.

15
Learning Docker

Hypothèses

  • Microsoft SQL Server 2016
  • Mise à jour anniversaire Windows 10
  • Conteneurs Windows
  • Application ASP.NET Core 

Ajoutez un utilisateur SQL à votre base de données SQL.

  • Dans MS SQL, développez la base de données
  • Faites un clic droit sur 'Sécurité/Connexions'
  • Sélectionnez 'Nouvelle connexion' 
  • Créez un nom d'utilisateur et un mot de passe.
  • Attribuer un 'rôle (s) de serveur' ... j'ai utilisé sysadmin puisque je viens de tester
  • Sous "Mappage utilisateur", j'ai ajouté mon nouvel utilisateur à ma base de données et utilisé "dbo" pour le schéma.

Modifier l'authentification SQL pour autoriser le mode d'authentification SQL Server

Faites un clic droit sur votre base de données, sélectionnez le bouton radio "Propriétés/Sécurité/Authentification du serveur/Mode d’authentification SQL Server et Windows". Redémarrez le service MS SQL.

Mettez à jour votre fichier appsettings.json avec votre nouveau nom d'utilisateur et mot de passe

Exemple 

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

Assurez-vous de supprimer Trusted_Connection=True.

Créer un fichier Docker

Mon exemple de fichier Docker

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

Publier une application

Exécution du même emplacement que le fichier Docker dans un PowerShell élevé 

dotnet publish

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

docker run -it  aspidserver cmd

Je voulais exécuter le conteneur et voir la sortie telle qu'elle s'exécutait dans PowerShell. 

Une fois le conteneur installé et en cours d'exécution dans le conteneur à l'invite de commande, j'ai lancé mon application.

dotnet nameOfApplication.dll

Si tout se passe comme prévu, il faut être opérationnel.

6
ben

Vous pouvez exécuter un conteneur de menu fixe avec les paramètres réseau définis sur Host. Un tel conteneur partagera la pile réseau avec l'hôte du menu fixe et du point de vue du conteneur, localhost (ou 127.0.0.1) désignera le système hôte.

docker run --net=Host ... 

Ensuite, vous devez obtenir la base de données SQL Server de l'intérieur du conteneur de menu fixe, comme vous le faites de votre hôte.

2
Camilo Silva

comme dans cette réponse

Connexion de chaîne d'instance SQL Server dans Linux Docker

Selon Saurabh Singh de Microsoft:

La prise en charge du nom d'instance est disponible dans la version 1.1 de .Net Core. Dans v1.0 de .Net Core, les noms d’instance ne sont pas pris en charge sur les systèmes d’exploitation autres que Les fenêtres.

Je ne pense donc pas que vous puissiez vous connecter à partir de .Net Core 1.0 s'exécutant sous Linux à un serveur SQL Server à l'aide du nom d'instance.

Vos choix semblent être:

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
Richard Blackman