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.
1. 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.
- Window 10 Pro x64.
- Hyper-V.
- Visual Studio Code (Opcional, si quieres puedes usar Notepad++).
- Docker Community v 2.0.0 o superior.
- Al menos 2 GB aunque recomiendan 3.25GB en RAM para el contenedor.
- SQL Server Management Studio
Los comandos serán ejecutado utilizando PowerShell en modo Administrador.
2. 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.
1 |
docker pull microsoft/mssql-server-linux:2017-CU12 |

Descargando imagen SQL Server Linux
3. 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.
4. 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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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 |
5. Creado el comando de restauración en SQL
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
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 |
6. 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í,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
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 |
7. 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:
1 |
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.
1 |
docker images |

Docker images
8. 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.
1 |
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.
1 |
docker ps -a |

Docker contenedores
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.

Conexión desde SQL Server Management

Conexión desde SQL Server Management
Finalmente si ya terminastes de probar con el contenedor recuerda detenerlo para liberar recursos de tu equipo.
1 |
docker stop sql-server-container |
Descargar código fuente
Photo by Rye Jessen on Unsplash
También te puede interesar
Comments
No comments found!
Leave a Comment
Your email address will not be published.