A veces, nuestros hábitos de trabajo pueden experimentar algunos cambios interesantes, que pueden verse forzados por necesidades reales o incluso simplemente por el válido deseo de explorar nuevas formas de llevar a cabo algunas tareas. Recuerdo que en el pasado solía instalar SQL Server Developer Edition en mi portátil. No obstante, he tenido que añadir otras bases de datos, como PostgreSQL o MySQL, principalmente para la prueba de conceptos. Por lo tanto, me di cuenta de cuánto tiempo y recursos dedicaba a través del proceso convencional de instalar desde 0 nuevas versiones de estos gestores de Bases de Datos, lo que incluye tomar valiosos recursos mi ordenador. Llegados a este punto, me convencí de sustituir los antiguos estilos de trabajo relativos a las bases de datos en mi entorno de desarrollo.
La combinación correcta (al menos para mí) es una mezcla de Docker y preparar un lugar especifico para crear los volúmenes donde quiero que persistan mis bases de datos. En el caso de SQL Server, vamos a utilizar imágenes basadas en Linux SQL Server.
Para este artículo vamos a crear volúmenes, principalmente para preservar nuestros datos. Recuerde que nuestros datos (en la base de datos) no pertenecen al contenedor Docker. ¿A qué se debe? Por diferentes razones, principalmente la volatilidad asociada con los contenedores, latencia, etc. Teniendo esto en cuenta, crearemos volúmenes para persistir en nuestras bases de datos en directorios de destino, de esta manera, incluso si accidentalmente o deliberadamente destruimos los contenedores, podríamos recrearlos perfectamente y recuperar nuestras bases de datos almacenadas en los volúmenes previamente configurados.
Contenido
Requisitos
Es obligatorio obtener la última versión de la aplicación Docker. Puede encontrar más información sobre cómo instalarlo en el siguiente enlace::
https://docs.docker.com/desktop/windows/install/
Sigue las instrucciones del enlace anterior, incluido el backend de WSL 2. Mi instalación incluye Windows 11..
Configurando nuestro SQL Server a través de un contenedor de Docker
Llegados a este punto, estamos listos para empezar. Lo primero que debe hacer es localizar el repositorio de imagenes para SQL Server. En el siguiente enlace encontrará las imágenes disponibles:
https://hub.docker.com/_/microsoft-mssql-server
Una vez que haya elegido la versión deseada, debemos preparar los directorios en Windows que deben actuar como volúmenes y donde pretendemos almacenar las bases de datos. En mi caso, he creado los datos, registros y secretos de los directorios en la ruta D:/SqlVolume/
La ejecución de un comando de Docker se puede realizar a través de la aplicación Docker o, como mi caso, en Powershell, para este propósito, debe abrir PowerShell con permisos de administrador y escribir el siguiente comando para verificar que el Docker está en buen estado y listo para comenzar.
En este punto, compartiré y explicaré por sección el comando Docker para crear una nueva imagen que contenga SQL Server.
1 |
docker run --name sql2022data -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=YourStrongPa$$w0rdHere" -p 1433:1433 -v D:/SqlVolume/data:/var/opt/mssql/data/ -v D:/SqlVolume/log:/var/opt/mssql/log/ -v D:/SqlVolume/secrets:/var/opt/mssql/secrets/ -d mcr.microsoft.com/mssql/server:2022-latest |
Después de ejecutar el comando anterior, puede ingresar dentro de Docker y verificar que la imagen se esté ejecutando como se esperaba.
Además, si va a Powershell y escribe Docker -ps, puede encontrar los contenedores existentes y su estatus.
Permítame dividirlo en partes y explicarle el comando de Docker anterior.
carrera de Docker: Le permite ejecutar un comando en un contenedor nuevo.
–name: Este parámetro representa el nombre del nuevo contenedor
–e: Este parámetro nos permite establecer variables de entorno. En nuestro caso, estamos configurando dos variables, una para confirmar la aceptación del Acuerdo de Licencia de Usuario Final y la otra para definir la contraseña para el usuario SA (administrador del sistema).
–p: Es el parámetro para configurar el puerto, para simplificar, estamos uniendo el puerto 1433 (puerto predeterminado del servidor SQL) al puerto TCP de nuestra máquina (máquina host).
-v: En este parámetro, montamos un volumen y enlazamos a las carpetas de datos/registro/secretos específicas asociadas con los directorios de SQL Server dentro del contenedor (recuerde que estamos usando una imagen de Linux SQL Server). Preparando con antelación la carpeta en el sistema Windows para enlazar con los directorios predeterminados.
-d: Finalmente, en este parámetro, indicamos que el contenedor se ejecutara en background, sin ser adjuntado a cualquier flujo de entrada o salida.
Conectandonos a nuestro MS SQL Server en Linux para el motor de Docker
En este momento, estamos listos para conectarnos al nuevo SQL Server creado a través de Docker. Abra su SSMS y haga clic en el botón Conectar. En el nombre del servidor simplemente debe escribir el periodo, el puerto no es necesario porque estamos usando el mismo puerto (1433), de lo contrario, debe escribir el puerto definido. Rellenar el inicio de sesión (sa) y la contraseña que hemos utilizado en el comando de ejecución del Docker.
Ya tenemos nuestro servidor SQL listo y estamos conectados. ¿Qué más necesitamos? Bueno, para completar este artículo, me gustaría mostrarle cómo restaurar una base de datos a partir de una copia de seguridad.
Restaurando un backup dentro de nuestro MS SQL Server en Linux para el motor de Docker
¿Cuál es la diferencia entre restaurar una base de datos para un motor de Docker con respecto a MS SQL Server? En realidad, no hay diferencia, pero en términos prácticos, puede encontrar algunos pequeños problemas.
Empezamos a descargar la copia de seguridad WideWorldImporters-Full.bak del repositorio de GitHub. El siguiente paso consiste en copiar este archivo de copia de seguridad en el directorio de datos, en nuestro caso, el volumen se define como D:/SqlVolume/data:/var/opt/mssql/data/
Abra una nueva consulta en SSMS y ejecute esta declaración T-SQL para identificar los detalles de la copia de seguridad.
1 2 |
RESTORE FILELISTONLY FROM DISK=N'/var/opt/mssql/data/WideWorldImporters-Full.bak' GO |
Como puede observar, hay un grupo de nombres físicos que indican un directorio específico. Se recomienda ajustar los archivos mdf, ndf y ldf a los directorios ya predefinidos (recuerde que tenemos un contenedor Linux).
La siguiente declaración nos permitiría restaurar la copia de seguridad.
1 2 3 4 5 6 7 |
RESTORE DATABASE WideWorldImporters FROM DISK=N'/var/opt/mssql/data/WideWorldImporters-Full.bak' WITH REPLACE, MOVE 'WWI_Primary' to '/var/opt/mssql/data/WideWorldImporters.mdf', MOVE 'WWI_UserData' to '/var/opt/mssql/data/WideWorldImporters_UserData.ndf', MOVE 'WWI_Log' to '/var/opt/mssql/log/WideWorldImporters.ldf', MOVE 'WWI_InMemory_Data_1' to '/var/opt/mssql/data/WideWorldImporters_InMemory_Data_1' GO |
Y aquí está el problema que he encontrado. Probablemente reciba el siguiente error:
Después de buscar en google, encontré una solución alternativa que funcionó bien. Esta solución alternativa consiste en aplicar dos pequeños cambios, el primero podría estar relacionado con el permiso asociado con la copia de seguridad copiada, que tenía al usuario raíz como propietario. Por lo tanto, vamos a cambiar el propietario a mssql mediante este comando
1 |
docker exec -u 0 sql2022data bash -c "chown mssql /var/opt/mssql/data/WideWorldImporters-Full.bak" |
Este comando se conecta dentro del contenedor de datos sql2022 y activa bash y proporciona un comando, en este caso, chown que nos permite cambiar el propietario de un archivo/directorio. El segundo paso para completar la solución consiste en ejecutar un par de comandos bash en el contenedor, específicamente la creación de nuevos archivos vacíos que deben coincidir con los nombres y la extensión de los archivos contenidos en la copia de seguridad y enumerados anteriormente con el comando FILELISTONLY.
Tenemos que entrar en modo bash dentro del contenedor:
1 |
docker exec -it sql2022data /bin/bash |
Podemos observar que el usuario reconocido es mssql y el código después de la a es el código de contenedor que puede identificar en Docker. Los siguientes comandos crearán los archivos vacíos
Una vez que haya completado este paso, finalmente podríamos intentar restaurar la copia de seguridad y debería funcionar como se esperaba.
Por último, hemos restaurado correctamente nuestra base de datos.
Espero que este artículo sea útil para usted, considerando el gran beneficio asociado con el uso de Docker, especialmente para configurar rápidamente nuestro nuevo entorno de desarrollo. Por último, es interesante recordar que, gracias a nuestros volúmenes, independientemente de que destruyamos el contenedor, tendríamos la opción de conservar nuestras bases de datos para futuros contenedores/imágenes nuevos. ¡Happy Coding!