Restaurar backups en Docker con SQL Server 2017 Linux en Windows

Photo by Rye Jessen

Docker se ha convertido en una pieza importante dentro del ambito del desarrollo debido a que facilita la automatización de despliegue de aplicaciones. En este post no pretendo dar una introducción a Docker, tal vez en un post posterior lo haga, hoy solo voy a presentar un ejemplo de los beneficios que nos proporciona el uso de Docker en los desarrollos que realizamos cada día.
El escenario es el siguiente: Se necesita restaurar de manera rápida una base de datos, crear un usuario y concederle permisos para accederla. Esto es simple si solo lo haces una vez y si ya cuentas con la instalación necesaria para la base de datos pero que pasa si no cuentas o no deseas instalar el software para dicho fin y que además no cuentas con el motor de base de datos instalado y configurado?  Bueno ahora te planteo esto, imagina que con la ejecución de 2 líneas de comando puedes restuar tu ambiente con tu base de datos y todo sin la necesidad de tener SQL Server instalado y configurado.
En este ejemplo vamos a utilizar Windows 10 Pro como host y una imagen en Linux con SQL Server 2017 sobre la que se restaurara un backup y se creará una nueva imagen. Finalmente lanzaremos un contenedor con la imagen creada y podremos acceder a la base de datos restaurada desde nuestra aplicación o desde el SQL Management Studio.

Requerimientos técnicos

Ten encuenta que Docker requiere Hyper-V y este solo esta disponible en la versión PRO de Windows 10. Adicional a ello si tienes Virtual Box este no es es compatible con Hyper-V, así que no podrás ejecutar los simultaneamente. Si quiere más detalle revisa aquí.  A continuación que se requiere para este post.

Los comandos serán ejecutado utilizando PowerShell en modo Administrador.

Configurando Docker

Aunqúe Docker te permite crear contenedores sobre Linux y Windows para SQL Sever hay algo muy importante, una imagen de SQL Server Developer para un contenedor Windows tiene un tamaño de 14GB una para Linux esta alrededor de 1.4GB. Sin embargo hay otras versiones de SQL Server para Windows como la Express que puede estar en los 6GB. En este post trabajaremos con SQL Server 2017. El primer paso será habilitar los contenedores Linux en Windows  en la interfas grafica de Docker, luego será descargar la imagen base que contiene el SQL Server en Linux.

docker pull microsoft/mssql-server-linux:2017-CU12
Pull la imagen en Docker

Creando la estructura de archivos

La estrucutra de archivos para este ejemplo es la siguiente.

En la carpeta DOCKER-SQL-SERVER-LINUX  crearemos otra carpeta para adicionar nuestro nuestro backup a restaurar, en este ejemplo usaremos AdventureWorks2017.bak. En la carpeta src esta el Restore.sh el cual tendrá los comandos para configurar la instancia de SQL Server, parametros como RAM asignada, clave y la ejecución del script RestoreDb.sql el cual tiene los comandos de restauración, creación de usuario y asignación de permisos a la base restaurada. Finalmente en la raíz estan los archivos dockerfile y README.MD; el primero con los comandos para crear la nueva imagen y el segundo con la documentación básica del proyecto.

Creando el archivo Dockerfile

El archivo dockerfile, como se apreciará a continuación utiliza la imagen base “microsoft/mssql-server-linux” , seguidamente se definen los directorios de trabajo a los cuales de copiará el backup y los archivos RestoreDb.sql y Restore.sh. Finalmente se asignan permisos de ejecución sobre Restore.sh y ejecuta el comando envíado como parametro el RestoreDb.sql.

FROM microsoft/mssql-server-linux:2017-CU12 
RUN mkdir /work 
COPY /backups/AdventureWorks2017.bak /work 
COPY /src/RestoreDb.sql /work 
COPY /src/Restore.sh /work 
WORKDIR /work 
RUN chmod 755 Restore.sh 
RUN ./Restore.sh RestoreDb.sql

Creado el comando de restauración en  SQL

USE master
GO
PRINT 'Restoring Adventure works'
 -------------------------------------------------
--> Restoring Adventure works
-------------------------------------------------
RESTORE DATABASE AdventureWorks2017
FROM DISK =  N'/work/AdventureWorks2017.bak'
WITH FILE = 1,
     MOVE N'AdventureWorks2017'
     TO  N'/var/opt/mssql/data/AdventureWorks2017.mdf',
     MOVE N'AdventureWorks2017_log'
     TO  N'/var/opt/mssql/data/AdventureWorks2017_log.ldf',
     NOUNLOAD,
     STATS = 5;
GO
-------------------------------------------------
--> Adding user AdventureUser
-------------------------------------------------
USE master;
GO
CREATE LOGIN AdventureUser
WITH PASSWORD = N'Adventure.@2018',
     DEFAULT_DATABASE = AdventureWorks2017
GO
-------------------------------------------------
--> Adding permissions to AdventureUser
-------------------------------------------------
USE AdventureWorks2017
GO
CREATE USER AdventureUser FOR LOGIN AdventureUser
GO
USE AdventureWorks2017
GO
ALTER ROLE db_owner ADD MEMBER AdventureUser
GO

Configurando instancia con Restore.sh

En este archivo realizaremos todos las configuraciones que deseamos aplicar a nuestra instancia de SQL Server como asignar clave, configurar limite de memoria, ejecutar script de restauración.  La clave asignada al usuario SA es  Sa.@2018Password. Si desea ver más comandos de configuración ingresa aquí,

echo "Setting Environment variables."
export ACCEPT_EULA=Y
export SA_PASSWORD=Sa.@2018Password
echo "Environment variables set."
echo "Starting SqlServr"
/opt/mssql/bin/sqlservr &
sleep 60 | echo "Waiting for 60s to start Sql Server"
echo "Setting RAM to 2GB usage."
/opt/mssql/bin/mssql-conf set memory.memorylimitmb 2048
echo "Restarting to apply the changes."
systemctl restart mssql-server.service
echo "Restoring DB."
/opt/mssql-tools/bin/sqlcmd -U sa -P $SA_PASSWORD -i $1
echo "DB restored."
echo "Deleting backup files."
rm -rf /work/*.bak

Creando la imagen

En este punto ya se debe haber descargado la imagen base de SQL Server para Linux y haber creados la estructura tal como se aprecia en pasos previos. Ahora ejecutaremos los comandos necesarios para ejecutar el contenedor y poder conectarnos mediante SQL Server Management a el. Lo primero que debemo hacer es ubicarnos en la carpeta en la que se encuentra el archivo dockerfile. Luego ejecutar lo siguiente:

docker build . -t sql-server-linux
Docker build

Con este comado hemos creado una nueva imagen llamada  sql-server-linux, esta imagen ya contiene la base de datos restaurada. Al consultar con el siguiente comando debemos visualizar la 2 imágenes. La primera imagen sql-server-linux que ha sido creada a partir de la segunda mssql-server-linux.

docker images
Docker imagen

Creando el contenedor

Ahora ya tenemos una imagen que tiene restaurada la base de datos Adventure Works 2017 y podemos crear un contenedor y realizar las pruebas que deseemos.

docker run -d -p 1500:1433 --name sql-server-container sql-server-linux

Para validar si todo esta bien podemos ejecutar el siguiente comando para visualizar los contenedores creados.

docker ps -a
Ejecutando el contenedor

Ahora te puede conectar desde SQL Server Management a la base de datos con los parametros localhost, 1500 y el usuario AdventureUser con clave AdventureWorks2017.

Sql Server Management
Sql Server Management consulta

Finalmente si ya terminastes de probar con el contenedor recuerda detenerlo para liberar recursos de tu equipo.

docker stop sql-server-container

Recursos adicionales

Ver o descargar el código de esta entrada.


Deja un comentario

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