paint-brush
Una guía para ejecutar ASP.NET Core y SQL Server desde Dockerpor@samwalpole
8,669 lecturas
8,669 lecturas

Una guía para ejecutar ASP.NET Core y SQL Server desde Docker

por Sam Walpole11m2021/01/03
Read on Terminal Reader
Read this story w/o Javascript

Demasiado Largo; Para Leer

Recientemente comencé a usar Docker en mi ciclo de desarrollo y realmente disfruto de lo maravillosa que es esta herramienta. Una cosa que siempre solía ser una molestia era configurar un servidor de desarrollo para ejecutar SQL Server. Ahora, con Docker, puedo activar un contenedor de Docker e instantáneamente tengo un servidor SQL listo para usar.

Companies Mentioned

Mention Thumbnail
Mention Thumbnail
featured image - Una guía para ejecutar ASP.NET Core y SQL Server desde Docker
Sam Walpole HackerNoon profile picture

Recientemente comencé a usar Docker en mi ciclo de desarrollo y realmente disfruto de lo maravillosa que es esta herramienta. Una cosa que siempre solía ser una molestia era configurar un servidor de desarrollo para ejecutar SQL Server. Ahora, con Docker, puedo activar un contenedor de Docker e instantáneamente tengo un servidor SQL listo para usar.

Recientemente escribí un blog sobre Primeros pasos con Docker . Si aún no lo has leído, te recomiendo que lo revises primero.

En este tutorial, primero le mostraré cómo configurar ASP.NET Core para que se ejecute en Docker y luego cómo configurar SQL Server en Docker. Finalmente, lo guiaré a través de una aplicación CRUD simple basada en esta configuración y usando EF Core como el ORM de la base de datos.

Configuración de ASP.NET Core para Docker

Visual Studio proporciona una gran cantidad de herramientas para configurar automáticamente su aplicación ASP.NET Core para usar Docker, por lo que usaré eso para configurar el lado ASP.NET Core de las cosas.

Primero, comience creando una nueva aplicación web ASP.NET Core. Para el propósito de este tutorial, elegí la plantilla API. Cuando se le solicite, asegúrese de que la casilla Habilitar compatibilidad con Docker esté marcada.

Si tiene un proyecto existente, aún puede habilitar la compatibilidad con la ventana acoplable haciendo clic con el botón derecho en su proyecto y seleccionando la opción desde allí.

A continuación, dado que queremos que el contenedor de ASP.NET Core y el contenedor de SQL Server se ejecuten juntos, debemos crear un proyecto de Docker Compose. Nuevamente con Visual Studio esto es muy simple.

Haga clic con el botón derecho en su proyecto y seleccione Compatibilidad con orquestación de contenedores. Cuando aparezcan los cuadros de diálogo, seleccione Docker Compose y luego use Linux como sistema operativo de destino.

Esto creará un proyecto de Docker Compose, que usaremos para coordinar la ejecución del contenedor ASP.NET Core y el contenedor de SQL Server. Si configura el proyecto Docker Compose como el proyecto de inicio y hace clic en ejecutar, ahora debería ejecutar correctamente el contenedor ASP.NET Core.

Configuración de SQL Server en Docker

Si abre su archivo docker-compose.yml, actualmente debería verse así:

 version: '3.4' services: dockersqlserver: image: ${DOCKER_REGISTRY-}dockersqlserver build: context: . dockerfile: DockerSqlServer/Dockerfile

Esta es la configuración de Docker Compose para la aplicación ASP.NET Core. Para agregar un contenedor de SQL Server, modifique el archivo YAML para que se vea así:

 version: '3.4' services: db: image: "mcr.microsoft.com/mssql/server:2017-latest" environment: - ACCEPT_EULA=Y - SA_PASSWORD=1Secure*Password1 dockersqlserver: image: ${DOCKER_REGISTRY-}dockersqlserver build: context: . dockerfile: DockerSqlServer/Dockerfile depends_on: - db

Aquí hemos agregado un nuevo contenedor llamado db que usa la imagen oficial de SQL Server Docker. La propiedad principal que debe preocuparle es SA_PASSWORD, que debe cambiar a su propia contraseña segura.

TENGA EN CUENTA : el campo SA_PASSWORD parece tener algunos criterios estrictos sobre lo que debe contener la contraseña. No pude encontrar los requisitos exactos, pero sería recomendable usar una contraseña larga usando mayúsculas, minúsculas, números y caracteres especiales.

A los efectos de seguir este tutorial, la contraseña que he proporcionado cumple estos criterios. Si su contraseña no cumple con los requisitos, más adelante, cuando ejecute el contenedor, obtendrá una SQLException quejándose de que la aplicación no pudo iniciar sesión como usuario de SA. Si obtiene esta excepción, intente modificar la contraseña y vuelva a intentarlo.

Además, tenga en cuenta que se agregaron las siguientes líneas al contenedor de la aplicación ASP.NET Core:

 depends_on: - db

Esto le dice a Docker Compose que el contenedor de ASP.NET Core depende del contenedor de SQL Server, por lo que el contenedor de SQL Server debe ser el primero en ejecutarse cuando se ejecuta el proyecto de Docker Compose.

Lo último que debemos hacer para configurar los dos contenedores es agregar la cadena de conexión a la aplicación appsettings.json de ASP.NET Core:

 "ConnectionStrings" : { "AppDbContext" : "Server=db;Database=AppDbContext;User=sa;Password=1Secure*Password1;" }

La solución ahora está completamente configurada para usar la base de datos contenedora de SQL Server en su aplicación ASP.NET Core. Ahora puede conectarse a la base de datos y usarla como lo haría normalmente dentro de cualquier otra aplicación. Para ver un ejemplo de cómo hacer esto para una aplicación CRUD simple que usa EF Core, continúe leyendo.

Aplicación CRUD en contenedores con EF Core

Una aplicación CRUD es aquella que tiene la funcionalidad básica para crear, leer , actualizar y eliminar . En esta aplicación, crearemos un modelo básico de Note y crearemos una API REST básica para realizar estas funciones CRUD. Usaremos EF Core para interactuar con el contenedor Docker de SQL Server.

La solución de trabajo completa se puede encontrar en este repositorio de Github .

Primero, asegúrese de tener los contenedores de Docker configurados como se describe anteriormente. Luego comenzaremos creando el modelo Note:

 // Models/Note.cs namespace DockerSqlServer.Models { public class Note { public int Id { get ; set ; } public string Text { get ; set ; } } }

Luego, debemos crear la clase de contexto de la base de datos, que define cómo interactúa EF Core con nuestro contenedor Docker de SQL Server. Si no ha trabajado antes con EF Core, le recomiendo que lea esta guía de introducción .

Necesitamos instalar los siguientes paquetes NuGet:

 Microsoft.EntityFrameworkCore Microsoft.EntityFrameworkCore.SqlServer Microsoft.EntityFrameworkCore.Design Microsoft.EntityFrameworkCore.Tools

A continuación se muestra la clase ApplicationDbContext, que es muy básica para este ejemplo y solo incluye el conjunto de bases de datos para nuestro modelo Note.

 using DockerSqlServer.Models; using Microsoft.EntityFrameworkCore; namespace DockerSqlServer { public class AppDbContext : DbContext { public AppDbContext ( DbContextOptions options ) : base ( options ) { } public DbSet<Note> Notes { get ; set ; } } }

También necesitamos agregar las siguientes líneas al método ConfigureServices de Startup.cs:

 services.AddDbContext<AppDbContext>(options => options .UseSqlServer(Configuration.GetConnectionString( "AppDbContext" )));

Esto obtendrá la cadena de conexión de appsettings.json, que configuramos anteriormente en este artículo.

Para decirle a la base de datos que queremos crear la tabla de Notas. Hacemos esto generando una migración , que es solo un archivo de código generado automáticamente que especifica los comandos de base de datos necesarios para actualizar la base de datos. Para generar una migración, asegúrese de que su proyecto de aplicación web esté configurado como el proyecto de inicio (no el proyecto de Docker Compose), luego ejecute el siguiente comando desde la consola del Administrador de paquetes:

 add-migration AddNoteEntity

También necesitamos modificar el método Main del archivo Program.cs para que se vea así:

 public async static Task Main ( string [] args ) { var host = CreateHostBuilder(args).Build(); using var scope = host.Services.CreateScope(); var services = scope.ServiceProvider; try { var dbContext = services.GetRequiredService<AppDbContext>(); if (dbContext.Database.IsSqlServer()) { dbContext.Database.Migrate(); } } catch (Exception ex) { var logger = scope.ServiceProvider.GetRequiredService<ILogger<Program>>(); logger.LogError(ex, "An error occurred while migrating or seeding the database." ); throw ; } await host.RunAsync(); }

Cuando se inicia la aplicación, comprobará si es necesario realizar algún cambio en la base de datos y la actualizará si es necesario. Sin Docker, normalmente solo haría esto con el comando de la línea de comando: actualizar-base de datos. Sin embargo, no podemos hacer eso aquí porque necesitamos que el contenedor Docker de SQL Server se esté ejecutando antes de intentar actualizarlo.

La clase final que debemos crear es NoteController, que actuará como la API CRUD REST para nuestro modelo Note. No entraré en muchos detalles sobre cómo funciona porque el objetivo de este tutorial es configurar los contenedores de Docker. Si necesita información adicional sobre la creación de controladores CRUD, consulte esta guía .

 // Controllers/NotesController.cs using DockerSqlServer.Models; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using System.Threading.Tasks; namespace DockerSqlServer.Controllers { [ ApiController ] [ Route( "[controller]" ) ] public class NotesController { private readonly AppDbContext _db; public NotesController ( AppDbContext db ) { _db = db; } [ HttpGet ] public async Task<IActionResult> Get ( ) { var notes = await _db.Notes.ToListAsync(); return new JsonResult(notes); } [ HttpGet( "{id}" ) ] public async Task<IActionResult> Get ( int id ) { var note = await _db.Notes.FirstOrDefaultAsync(n => n.Id == id); return new JsonResult(note); } [ HttpPost ] public async Task<IActionResult> Post ( Note note ) { _db.Notes.Add(note); await _db.SaveChangesAsync(); return new JsonResult(note.Id); } [ HttpPut ] public async Task<IActionResult> Put ( int id, Note note ) { var existingNote = await _db.Notes.FirstOrDefaultAsync(n => n.Id == id); existingNote.Text = note.Text; var success = ( await _db.SaveChangesAsync()) > 0 ; return new JsonResult(success); } [ HttpDelete ] public async Task<IActionResult> Delete ( int id ) { var note = await _db.Notes.FirstOrDefaultAsync(n => n.Id == id); _db.Remove(note); var success = ( await _db.SaveChangesAsync()) > 0 ; return new JsonResult(success); } } }

Y eso es todo lo que necesitamos para tener una API CRUD REST que funcione usando Docker tanto para la aplicación ASP.NET Core como para SQL Server. Sin embargo, para facilitar la prueba, instalé Swagger. Para lograr esto también, instale el paquete Swashbuckle.AspNetCore NuGet y modifique Startup.cs para que luzca como:

 using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; namespace DockerSqlServer { public class Startup { public Startup ( IConfiguration configuration ) { Configuration = configuration; } public IConfiguration Configuration { get ; } // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices ( IServiceCollection services ) { services.AddControllers(); services.AddDbContext<AppDbContext>(options => options .UseSqlServer(Configuration.GetConnectionString( "AppDbContext" ))); services.AddSwaggerGen(); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure ( IApplicationBuilder app, IWebHostEnvironment env ) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseSwagger(); app.UseSwaggerUI(c => { c.SwaggerEndpoint( "/swagger/v1/swagger.json" , "My API V1" ); c.RoutePrefix = string .Empty; }); } app.UseHttpsRedirection(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); } } }

Luego ejecute Docker Compose y navegue hasta la URL raíz del servidor. Luego debería ver el siguiente panel de Swagger que le permitirá probar fácilmente la funcionalidad CRUD de la API REST que hemos creado:

Conclusión

En este tutorial, le mostré cómo configurar una aplicación ASP.NET Core y una base de datos de SQL Server para que se ejecuten en contenedores Docker. También le mostré cómo crear una API CRUD REST básica usando esta aplicación en contenedores. El repositorio para esto se puede encontrar aquí en GitHub .

Publico principalmente sobre desarrollo web full-stack .NET y Vue. Para asegurarse de no perderse ninguna publicación, siga este blog y suscríbase a mi boletín . Si te ha resultado útil esta publicación, dale me gusta y compártela. También puedes encontrarme en Twitter .

Publicado anteriormente en https://samwalpole.com/how-to-run-aspnet-core-and-sql-server-from-docker