Conéctese a la database de SQL Server desde un contenedor acoplable

Tengo un acoplador para windows instalado en mi máquina. Hay una aplicación de console orientada a .net core 1.0.0 que intenta acceder a una database de SQL Server que se ejecuta en una máquina virtual diferente. Puedo hacer ping a la VM que ejecuta SQL Server desde mi máquina.

Cuando bash ejecutar la aplicación de la console usando dotnet run desde el símbolo del sistema en mi máquina, funciona bien. Pero cuando la misma aplicación se ejecuta dentro de un contenedor acoplable, recibo un post

Se ha producido un error relacionado con la networking o específico de la instancia al establecer una connection con SQL Server. El server no se encontró o no estaba accesible. Verifique que el nombre de la instancia sea correcto y que SQL Server esté configurado para permitir conexiones remotas. (proveedor: Proveedor de TCP, error: 40 – No se pudo abrir una connection a SQL Server)

Intenté usar

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

pero eso no hizo diferencia.

Suposiciones

  • Microsoft SQL Server 2016
  • Actualización de aniversario de Windows 10
  • Contenedores de Windows
  • Aplicación ASP.NET Core

Agregue un usuario de SQL a su database SQL.

  • En MS SQL expande la database
  • Haga clic derecho en 'Seguridad / Logins'
  • Seleccione 'Nuevo inicio de session'
  • Crea un nombre de usuario y contraseña.
  • Asignar un 'Rol (es) de server' … Usé sysadmin ya que solo estoy probando
  • En 'User Mapping', agregué mi nuevo usuario a mi database y usé 'dbo' para el esquema.

Cambiar la authentication SQL para permitir el modo de authentication de SQL Server

Haga clic derecho en su database, select el button de opción 'Propiedades / Seguridad / Autenticación del server / SQL Server y Modo de authentication de Windows'. Reinicie el service MS SQL.

Actualice su appsettings.json con su nuevo nombre de usuario y contraseña

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

Asegúrese de eliminar Trusted_Connection=True .

Crear un file Docker

Mi ejemplo de file Docker

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

Publicar aplicación

Se ejecuta desde la misma location que el file Docker en una PowerShell elevada

dotnet publish

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

docker run -it aspidserver cmd

Quería ejecutar el contenedor y ver el resultado mientras se ejecutaba en PowerShell.

Una vez que el contenedor estaba funcionando en el contenedor en el símbolo del sistema, inicié mi aplicación.

dotnet nameOfApplication.dll

Si todo fue según el plan, uno debería estar en funcionamiento.

Puede ejecutar un contenedor acoplable con la configuration de networking establecida en el host . Tal contenedor compartirá la stack de networking con el host Docker y, desde el punto de vista del contenedor, localhost (o 127.0.0.1) se referirá al host docker.

 docker run --net=host ... 

Luego debe get la database de SQL Server desde el contenedor de la window acoplable como lo hace desde su host.

como en esta respuesta

Conexión de serie de instancia de SQL Server en Docker de Linux

De acuerdo con Saurabh Singh de Microsoft:

El soporte de nombre de Instancia está disponible en v 1.1 de .Net Core. En v1.0 de .Net Core, los nombres de instancia no son compatibles con SO que no sea Windows.

Así que no creo que pueda conectarse desde .Net Core 1.0 ejecutándose en Linux a un server SQL usando el nombre de la instancia.

Tus elecciones parecen ser:

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