SQL Server 2025 Express en Docker sobre Windows 11: un laboratorio real paso a paso
Una instalación real con WSL2, Docker, persistencia en C:, puerto alternativo, conexión desde SSMS y restauración de respaldos.

Lic. Carlos Enrique Loria Beeche

Docker, WSL2, persistencia en disco, puertos, SQL Server Management Studio y algunos momentos “Hollywood”.

Objetivo del laboratorio: ejecutar SQL Server 2025 Express dentro de Docker Desktop sobre Windows 11, manteniendo los datos persistentes en una carpeta explícita del disco C: y conservando el acceso normal desde SQL Server Management Studio.

Durante mucho tiempo asocié SQL Server con una instalación tradicional de Windows: instalador, servicios, instancia, puertos, directorios de datos y SQL Server Management Studio. Docker cambia bastante esa forma de pensar.

Quería hacer un experimento concreto: levantar SQL Server Express en Docker sobre una computadora Windows 11, mantener los archivos de las bases de datos en una carpeta de Windows elegida por mí y poder conectarme normalmente desde SQL Server Management Studio.

Había además una razón práctica para utilizar Express: quería que el experimento tuviera sentido también desde el punto de vista de licenciamiento y no limitarme a utilizar Developer Edition simplemente porque estaba haciendo pruebas.

El equipo utilizado fue LEON, una máquina física con Windows 11.

1. Primero: ¿qué tenía ya instalado?

Antes de instalar nada, revisé WSL:

wsl --version

El resultado confirmó que WSL2 ya estaba disponible:

WSL version: 2.7.8.0
Kernel version: 6.18.33.1-1
Windows version: 10.0.26200.9168

También revisé las distribuciones:

wsl -l -v
NAME              STATE      VERSION
Ubuntu-26.04      Stopped    2
docker-desktop    Stopped    2

Docker Desktop también estaba instalado:

docker --version
Docker version 29.6.1

Sin embargo, docker info no podía conectarse al Docker Engine. La explicación era mucho menos dramática de lo que parecía: Docker Desktop simplemente no estaba arrancado.

docker desktop start

Después de eso, docker ps respondió correctamente y docker info confirmó el entorno Linux sobre WSL2.

2. Un requisito indispensable: saber dónde están mis datos

No quería que las bases importantes quedaran únicamente dentro de algún almacenamiento administrado internamente por Docker.

Quería poder abrir el Explorador de Windows y encontrar físicamente mis .mdf.ldf y .bak.

Creé esta estructura:

C:\DockerData\SQLExpress2025\
    backup\
    data\
    log\
    secrets\

Con PowerShell:

New-Item -ItemType Directory -Force -Path `
  C:\DockerData\SQLExpress2025\data, `
  C:\DockerData\SQLExpress2025\log, `
  C:\DockerData\SQLExpress2025\backup, `
  C:\DockerData\SQLExpress2025\secrets

La idea era sencilla: Docker ejecutaría SQL Server dentro de Linux, pero esas carpetas serían bind mounts hacia carpetas reales del disco C:.

WindowsContenedor Linux
C:\DockerData\SQLExpress2025\data/var/opt/mssql/data
C:\DockerData\SQLExpress2025\log/var/opt/mssql/log
C:\DockerData\SQLExpress2025\backup/var/opt/mssql/backup
C:\DockerData\SQLExpress2025\secrets/var/opt/mssql/secrets

Para mí esta separación es fundamental: el contenedor puede desaparecer; la información no tiene por qué desaparecer con él.

3. Antes de crear SQL Express apareció una sorpresa

Verifiqué si el puerto tradicional de SQL Server estaba disponible:

Get-NetTCPConnection -LocalPort 1433 -ErrorAction SilentlyContinue

Y no lo estaba.

Había un proceso escuchando en 1433. Al investigar el servicio, apareció:

MSSQLSERVER
SQL Server (MSSQLSERVER)
Running
C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\...

Es decir: LEON ya tenía SQL Server 2022 instalado como instancia predeterminada.

No había ninguna razón para tocarlo. La solución con Docker fue simplemente publicar otro puerto:

SQL Server Windows       LEON:1433
SQL Express Docker       LEON:14330

Docker recibiría conexiones en 14330 y las enviaría al 1433 interno del contenedor.

4. Momento Hollywood

Llegó entonces una de esas partes que, aunque técnicamente sencillas, siempre lucen bien en una pantalla negra:

docker pull mcr.microsoft.com/mssql/server:2025-latest
La descarga de capas: técnicamente normal, visualmente bastante “Matrix”.

Uno sabe perfectamente que Docker simplemente está descargando capas de una imagen. Pero hay que reconocerlo: por algunos segundos aquello parece una escena de Hollywood en la que uno está entrando en la Matrix.

La imagen terminó de descargarse correctamente. El mensaje de Docker Scout es una sugerencia informativa, no un error.

Al terminar apareció:

Status: Downloaded newer image for
mcr.microsoft.com/mssql/server:2025-latest

Docker también mostró:

What's next:
View a summary of image vulnerabilities and recommendations
→ docker scout quickview ...

A primera vista puede parecer un warning, pero no lo es. Es simplemente Docker sugiriendo utilizar Docker Scout para revisar vulnerabilidades y recomendaciones sobre la imagen.

5. Ahora sí: SQL Server Express

Para evitar escribir la contraseña de sa directamente en el comando:

$env:MSSQL_SA_PASSWORD = Read-Host "Digite la contraseña para sa"

Después creé el contenedor:

docker run `
  --name sqlexpress2025 `
  --hostname sqlexpress2025 `
  -e "ACCEPT_EULA=Y" `
  -e "MSSQL_PID=Express" `
  -e MSSQL_SA_PASSWORD `
  -e "TZ=America/Costa_Rica" `
  -p 14330:1433 `
  -v "C:\DockerData\SQLExpress2025\data:/var/opt/mssql/data" `
  -v "C:\DockerData\SQLExpress2025\log:/var/opt/mssql/log" `
  -v "C:\DockerData\SQLExpress2025\secrets:/var/opt/mssql/secrets" `
  -v "C:\DockerData\SQLExpress2025\backup:/var/opt/mssql/backup" `
  --restart unless-stopped `
  -d `
  mcr.microsoft.com/mssql/server:2025-latest

El parámetro decisivo era:

MSSQL_PID=Express

No quería asumir que aquello era Express. Quería comprobarlo.

6. El contenedor estaba vivo

docker ps -a

La salida mostró:

IMAGE
mcr.microsoft.com/mssql/server:2025-latest

STATUS
Up

PORTS
0.0.0.0:14330->1433/tcp

NAMES
sqlexpress2025

Ya teníamos:

Windows 11
    ↓
WSL2
    ↓
Docker Desktop
    ↓
Linux
    ↓
SQL Server 2025 Express

7. Comprobándolo desde SQL Server Management Studio

Desde SQL Server Management Studio me conecté utilizando:

IP-DE-LEON,14330

Y funcionó.

Ejecuté:

SELECT
    @@SERVERNAME AS ServerName,
    SERVERPROPERTY('Edition') AS Edition,
    SERVERPROPERTY('ProductVersion') AS ProductVersion,
    SERVERPROPERTY('ProductLevel') AS ProductLevel,
    SERVERPROPERTY('EngineEdition') AS EngineEdition;

Resultado:

ServerName       sqlexpress2025
Edition          Express Edition (64-bit)
ProductVersion   17.0.4075.5
ProductLevel     RTM
EngineEdition    4

Ahí quedó eliminada cualquier duda: era realmente SQL Server Express.

8. ¿Y dónde estaban físicamente las bases?

Desde SQL Server:

SELECT
    DB_NAME(database_id) AS DatabaseName,
    type_desc,
    physical_name
FROM sys.master_files
ORDER BY database_id, type;

Aparecieron rutas Linux como:

master  /var/opt/mssql/data/master.mdf
master  /var/opt/mssql/data/mastlog.ldf

tempdb  /var/opt/mssql/data/tempdb.mdf
tempdb  /var/opt/mssql/data/templog.ldf

model   /var/opt/mssql/data/model.mdf
model   /var/opt/mssql/data/modellog.ldf

msdb    /var/opt/mssql/data/MSDBData.mdf
msdb    /var/opt/mssql/data/MSDBLog.ldf

Eso es lo que SQL Server ve desde Linux.

Pero en Windows:

Get-ChildItem C:\DockerData\SQLExpress2025\data

mostraba físicamente:

master.mdf
mastlog.ldf
model.mdf
modellog.ldf
msdbdata.mdf
msdblog.ldf
tempdb.mdf
templog.ldf

Este era uno de los objetivos principales de la prueba.

Los datos no estaban escondidos dentro del contenedor. Estaban exactamente donde yo había decidido ponerlos.

9. Restaurar un backup: otra pequeña trampa conceptual

Copié varios respaldos reales a:

C:\DockerData\SQLExpress2025\backup

Por ejemplo:

Aristoteles01n_20260105_084903.bak
Aristoteles02n_20260105_084726.bak
Aristoteles11n_20260105_091019.bak
Aristoteles12n_20260105_110500.bak

Luego fui a SSMS → Restore Database → localizar backup.

Y no aparecía C:\DockerData\SQLExpress2025\backup.

La razón es sencilla una vez que se entiende el modelo: SSMS está hablando con SQL Server, y SQL Server está ejecutándose en Linux, no en Windows.

Por tanto, para SQL Server la carpeta se llama:

/var/opt/mssql/backup

Mientras que Windows la ve como:

C:\DockerData\SQLExpress2025\backup

Es exactamente la misma información vista desde dos sistemas de archivos diferentes.

10. No todo fue perfecto

Durante la primera inicialización aparecieron algunos errores transitorios relacionados con la creación de tempdb y acceso al dispositivo.

El contenedor volvió a intentar el arranque y finalmente SQL Server creó tempdb, completó la recuperación y quedó disponible para conexiones.

Lección útil: en un laboratorio real conviene revisar siempre docker logs sqlexpress2025. Que el contenedor aparezca como “Up” no sustituye revisar el arranque del motor.

No escondería este detalle en un artículo técnico. Los laboratorios reales tienen precisamente ese valor: muestran también las situaciones que uno debe vigilar, especialmente cuando se utilizan carpetas de Windows montadas directamente dentro de un contenedor Linux.

11. ¿Qué me deja este experimento?

Docker no convierte SQL Server en algo distinto. Sigue siendo SQL Server.

Lo que cambia es cómo desplegamos y aislamos el motor.

En una sola computadora puedo tener mi SQL Server 2022 tradicional escuchando en:

1433

y simultáneamente otro SQL Server completamente independiente:

SQL Server 2025 Express
Docker
Puerto 14330

sin instalar una segunda instancia tradicional de SQL Server en Windows.

El contenedor encapsula el motor y sus dependencias. Los bind mounts me permiten decidir dónde viven realmente mis datos.

Y para un desarrollador acostumbrado durante décadas al modelo tradicional de instalación de SQL Server, ese cambio de perspectiva resulta bastante interesante.

12. Esto apenas comienza

El siguiente experimento será más importante que la instalación misma: restaurar bases reales de nuestros sistemas y utilizarlas desde las aplicaciones.

Ahí podremos evaluar compatibilidad, limitaciones reales de Express, rendimiento, procedimientos almacenados, funciones y comportamiento de aplicaciones .NET.

Y posteriormente quiero repetir una prueba equivalente en Azure SQL, porque la pregunta final no es simplemente si SQL Server Express puede ejecutarse en Docker.

Ya sabemos que puede.

¿Cuál es la arquitectura más conveniente para desplegar una base pequeña: SQL Server Express en Docker administrado por nosotros, o una base administrada como Azure SQL?

Eso merece otro capítulo.

Artículo elaborado a partir de una instalación real realizada en Windows 11 con WSL2, Docker Desktop, SQL Server 2025 Express y SQL Server Management Studio.

Adenda: SQL Server Express ya no es tan pequeño

Durante muchos años, al hablar de SQL Server Express aparecía inmediatamente una limitación muy conocida: el tamaño máximo de 10 GB por base de datos. En SQL Server 2025 Express ese límite aumentó a 50 GB por base de datos relacional. Microsoft además eliminó la antigua edición separada “Express with Advanced Services” e incorporó esas capacidades dentro de la edición Express unificada.

Esto cambia bastante el escenario para pequeñas y medianas empresas. Una base de datos de 50 GB no es necesariamente pequeña cuando se trata de un sistema administrativo, contable, de inventarios, facturación, punto de venta o una aplicación departamental. Muchas aplicaciones empresariales pueden permanecer durante años muy por debajo de ese tamaño, especialmente cuando documentos, fotografías y otros archivos binarios se almacenan fuera de la base de datos.

Y hay un detalle fundamental: Express es gratuito también para producción. No estamos hablando de Developer Edition, cuya licencia está limitada a desarrollo y pruebas. Microsoft presenta SQL Server 2025 Express como una edición gratuita apropiada para aplicaciones de escritorio, web y pequeños servidores en ambientes productivos.

Pero 50 GB no cuentan toda la historia

El tamaño de la base no es la única restricción. SQL Server 2025 Express puede utilizar como máximo el menor entre un socket o cuatro núcleos, y dispone de 1.410 MB para el buffer pool del motor. También existen límites específicos para Columnstore e In-Memory OLTP.

En la práctica esto significa que una base podría estar muy por debajo de los 50 GB y, sin embargo, una carga con muchos usuarios concurrentes, consultas analíticas pesadas o un working set grande podría comenzar a encontrar el límite de memoria o CPU antes que el límite de almacenamiento.

Express tampoco incluye SQL Server Agent, Resource Governor ni Database Tuning Advisor. La ausencia del Agent es especialmente importante en producción: respaldos programados, mantenimiento y otros procesos periódicos deben resolverse mediante mecanismos externos, por ejemplo Windows Task Scheduler, un Worker Service de .NET, herramientas de orquestación o servicios equivalentes.

Una opción particularmente interesante para PYMES

Precisamente por eso veo SQL Server Express como una alternativa interesante, no como un sustituto indiscriminado de Standard o Enterprise.

Una PYME podría tener una aplicación con una base de 3, 8, 15 o 25 GB, relativamente pocos usuarios simultáneos y requerimientos perfectamente compatibles con Express. En ese escenario, disponer de SQL Server 2025, gratuitamente licenciado para producción, con hasta 50 GB por base de datos, puede ser económicamente muy atractivo.

Docker agrega otra dimensión. Como vimos en este laboratorio, podemos encapsular el motor, asignarle un puerto definido, mantener los archivos persistentes fuera del contenedor y reproducir con mucha precisión la instalación. La contrapartida es que Docker no elimina las responsabilidades operativas: alguien continúa siendo responsable de los respaldos, actualizaciones, seguridad, monitoreo y recuperación ante fallos.

Esto deja planteada una comparación que quiero hacer posteriormente: SQL Server Express en Docker frente a Azure SQL Database. En un caso obtenemos mucho control y eliminamos el costo de licencia del motor; en el otro trasladamos buena parte de la administración de la plataforma a Microsoft. La decisión correcta dependerá más de la carga, disponibilidad requerida, administración y costo total que de una preferencia tecnológica.

Lecturas y descargas recomendadas

  • SQL Server 2025 Express — descarga oficial. Microsoft identifica Express como la edición gratuita para desarrollo y producción de aplicaciones pequeñas. Descargar SQL Server 2025 Express
  • Límites y características de cada edición. Esta es probablemente la referencia más importante antes de decidir si Express es suficiente: incluye 50 GB, CPU, memoria y las funcionalidades disponibles o ausentes. Ediciones y características de SQL Server 2025
  • Novedades de SQL Server 2025. Incluye específicamente los cambios realizados a Express en esta versión. Novedades de SQL Server 2025
  • SQL Server Management Studio. Actualmente Microsoft distribuye SSMS 22 mediante el Visual Studio Installer; sigue siendo la herramienta principal para administrar SQL Server y Azure SQL. Descargar e instalar SQL Server Management Studio 22
  • SQL Server 2025 en Docker. Es el quickstart oficial de Microsoft y documenta precisamente la imagen mcr.microsoft.com/mssql/server:2025-latest, MSSQL_SA_PASSWORD, puertos y creación del contenedor. Ejecutar SQL Server 2025 con Docker
  • Docker Desktop sobre Windows y WSL2. Útil para complementar la parte inicial de nuestro laboratorio. Instalar Docker Desktop en Windows
  • AdventureWorks 2025. Incluye los .bak oficiales para OLTP, DW y LT y las instrucciones de restauración. Descargar e instalar AdventureWorks2025
  • Repositorio oficial de ejemplos SQL de Microsoft. Contiene AdventureWorks, WideWorldImporters y otros laboratorios para SQL Server y Azure SQL. Microsoft SQL Server Samples en GitHub

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *