En versiones anteriores a SQL Server 2017, normalmente se solía correr SQL
Server en servidores dedicados o en maquinas virtuales, pero ante la creciente
incremento de la contenerización, eso se convierte en una necesidad empresarial,
entonces Microsoft entendió y preparó para poder correr Instancias SQL Server en
contenedores docker, para ello hay varios formas de desplegar, en este Post
veremos como desplegar de forma fácil.
Descargar la imagen SQL Server 2017
docker pull mcr.microsoft.com/mssql/server:2017-latest
Una vez descargado la imagen, necesitamos completar algunos parámetros para
desplegar.
docker run -d -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=SQL3032$" -p 1433:1433 -d mcr.microsoft.com/mssql/server:2017-latest
Las variables ACCEPT_EULA, es para aceptar el término de la licencia, y
MSSQL_SA_PASSWORD es para asignar la contraseña al usuario por defecto
"sa", con ello ya podremos tener SQL Server 2017 en ejecución.
Ejecutamos "docker ps" para ver el contenedor en ejecución.
Ahora abriremos SQL Management Studio para conectarnos a la base de datos en
ejecución.
Como se puede ver, se puede crear las bases de datos que consideremos
necesarias, pero recordar que en cuanto eliminemos el contenedor también se
eliminarán las bases de datos creados, por lo que ahora configuraremos un
volumen para que SQL Server almacene los datos fuera del contenedor y que
cuando se elimine el contenedor no se pierdan los datos previamente
configurados.
Para mantener los datos en un directorio externo al contenedor, debemos
configurar de la siguiente forma:
Ejemplo en Linux
docker run -d \
-e "ACCEPT_EULA=Y" \
-e "MSSQL_SA_PASSWORD=SQL3032$" \
-e "MSSQL_PID=Express" \
-p 1433:1433 \
-v /opt/sql_server_2017/data:/var/opt/mssql/data \
-v /opt/sql_server_2017/log:/var/opt/mssql/log \
-v /opt/sql_server_2017/secrets:/var/opt/mssql/secrets \
-d mcr.microsoft.com/mssql/server:2017-latest
Ejemplo en Windows
docker run -d -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=SQL3032$" -e "MSSQL_PID=Express" -p 1433:1433 -v C:\sql_server_2017/data:/var/opt/mssql/data -v C:\sql_server_2017/log:/var/opt/mssql/log -v C:\sql_server_2017/secrets:/var/opt/mssql/secrets -d mcr.microsoft.com/mssql/server:2017-latest
Las variables que le pasamos son:
ACCEPT_EULA: Aceptación de término de licencia
MSSQL_SA_PASSWORD: Contraseña del usuario sa
MSSQL_PID: Versión de SQL Server, si no ponemos este versión por defecto nos
levanta la versión Developer. estas son valores que se puede configurar:
Developer: Esto ejecutará el contenedor usando Developer Edition
(este es el valor predeterminado si no se proporciona una variable de
entorno MSSQL_PID)
Express: Esto ejecutará el contenedor usando Express Edition
Estándar: Esto ejecutará el contenedor usando la Edición Estándar
Enterprise: Esto ejecutará el contenedor usando Enterprise Edition
EnterpriseCore: Esto ejecutará el contenedor utilizando Enterprise
Edition Core
Una vez ejecutado el comando docker, si hacemos "docker ps" veremos los
siguiente:
Como la ejecución lo estamos realizando en windows, vemos el contenido de la
carpeta asignado como volumen:
Creamos 3 bases de datos:
Ahora vemos si se encuentra en la carpeta "data":
Como se puede ver, los datos y configuraciones de SQL Server, lo guarda en una
carpeta externa al contenedor que al momento de iniciar el contenedor se les
pasó como parámetro.
Esto es recomendable usar en entornos de producción, donde si por alguna razón
tenemos alguna falla en el contenedor, los datos no se pierdan y podremos
iniciar otra instancia en un nuevo contenedor y podremos ver los datos
nuevamente.
Adicionalmente si queremos habilitar el Agente para los Backups programados,
debemos hacerlo mediante un archivo Dockerfile, para ello, creamos un archivo
Dockerfile con el siguiente contenido:
FROM mcr.microsoft.com/mssql/server:2017-latest
USER root
RUN /opt/mssql/bin/mssql-conf set sqlagent.enabled true
Ejecutamos el comando:
docker build -t mssql-server:2017-latest .
Ahora ejecutamos, la versión Developer, por que en la versión Express, no se
puede habilitar la característica del agente de SQL Server.
Ejecutamos el siguiente comando:
docker run -d -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=SQL3032$" -e "MSSQL_PID=Developer" -p 1433:1433 -v C:\sql_server_2017/data:/var/opt/mssql/data -v C:\sql_server_2017/log:/var/opt/mssql/log -v C:\sql_server_2017/secrets:/var/opt/mssql/secrets -d mssql-server:2017-latest
Y nuevamente nos conectamos:
Como se puede ver, se tiene habilitado el SQL Server Agent.
Es relativamente práctico trabajar con contenedores, esto puede facilitar al
desarrollador a que pueda crear su base de datos sin necesidad de requerir un
ambiente extra y para los administradores, tener múltiples instancias en múltiples versiones en un mismo servidor.
Saludos.