Mútiples instancias de Sql Server en Linux con Docker.

Desplegar una base de datos Sql Server en Azure es cuestión de un par de clicks de ratón. Realmente es sencillo y rápido. Además la plataforma Azure es fiable y escalable. Puedes empezar con pocos recursos y si tu proyecto tiene éxito, aumentar los recursos que la base de datos necesita.

Sin embargo, tanta facilidad de uso tiene un coste oculto: tras el periodo de prueba para los nuevos usuarios, todos los servicios de Azure tienen un coste mensual.

Si bien es justo y honrado que Microsoft quiera ganar dinero con su servicio en la nube, también es cierto que para programadores indie o pequeños equipos de programadores los costes pueden ser un problema.

Cada base de datos se factura de forma independiente, y no es extraño llegar a tener decenas de bases de datos diferentes con fines de prueba, que en caso de ser facturadas supondría un coste inasumible.

Bueno sin mas rodeos, la solución que propongo es instalar Sql Server en un servidor Linux. Por una fracción del precio de una instancia de base de datos en Azure, podemos contratar un VPS Linux, y tener varias tantas instancias de Sql Server como queramos (dependiendo de las capacidades del servidor, claro está).

Seamos claros, el hospedaje en un servidor VPS Linux que administremos personalmente, es infinitamente más barato que en la plataforma Azure, e incluso puede que ofrezca un rendimiento mejor.

Sql Server para Linux

En el año 2016 sorprendentemente Microsoft anunció que su motor de base de datos Sql Server estaría disponible para el sistema operativo Linux. Y tras tres años de este anuncio, hay que reconocer que efectivamente, funciona, y además muy bien.

En este artículo usaremos un servidor Ubuntu 18.04. Puede ser un VPS que tengas contratado para tus proyectos, una máquina virtual en tu PC de desarrollo, si lo prefieres, generada con Vagrant. Los requisitos de Sql Server son al menos Ubuntu 16.04, y 2Gb de ram (por instancia).

Es posible instalar Sql Server en Linux descargando el paquete de instalación y siguiendo un proceso de instalación estándar.

Sin embargo esto nos dejaría con un única instancia de sql server en el servidor. En Linux, a fecha de hoy, todavía no es posible instalar diferentes instancias de sql server en el mismo servidor, como si es en windows.

Resulta muy útil tener varias instancias de Sql Server en la misma máquina, y afortunadamente con la ayuda de Docker, podemos conseguirlo.

Lo primero, instalar Docker.

Ejecuta en la consola de linux, los siguientes comandos:

Estos comandos instalarán docker, lo arrancan, y configuran el servicio para que se inicie automáticamente al reiniciar el sistema operativo.

Instala un contenedor Sql Server con Docker.

Para ello, ejecuta el siguiente comando en la consola:

El comando anterior creará y arrancará un contenedor con Sql Server, que escuchará las peticiones a través del puerto 1041, redirigiendolas al puerto 1433 del contenedor.

La primera vez que ejecutes este comando, se descargará la imagen de docker necesaria, y esto puede tardar un poco dependiendo de tu velocidad de conexión.

Comprobar que el contenedor ha arrancado.

Ya deberíamos tener un contenedor de docker con sql server 2017 funcionando en nuestro servidor Ubuntu. Podemos comprobar que el contenedor está arrancado con el comando:

El comando anterior solo muestra los contenedores activos. Si por algún problema nuestro contenedor con Sql no ha arrancado, podemos obtener su id con:

Y tratar de arrancarlo manualmente para ver que errores produce con

En mi caso, durante las pruebas mientras escribía este artículo, me olvidé configurar la máquina virtual con 2Gb de ram, y por lo tanto Sql Server no arrancaba.

Si el contenedor ha arrancado bien, podemos conectarnos con Sql Server Management Studio, conociendo la ip del servidor en el que lo hemos instalado y a través del puerto 1401:

Nos conectamos a Sql Server 2017 instalado en Linux Ubuntu 18, gracias a docker.

Arrancar el contenedor al inicio

Los contenedores de Docker no se arrancan al inicio por defecto, con lo cual si reiniciamos el servidor podemos llevarnos un susto. Para que el contenedor se arranque al inicio, usaremos el siguiente comando:

Donde ID es la id de nuestro contenedor docker.

Múltiples instancias de bases de datos

Repitiendo el proceso anterior, podemos instalar múltiples instancias de bases de datos Sql Server. El límite lo determinará la cantidad de ram que tenga nuestro servidor, Tan solo tendremos que tener en cuenta que hay que elegir un puerto nuevo para cada contenedor docker:

Nótese que en el comando anterior, hemos cambiado el puerto del contenedor docker a 1402, porque el puerto 1401 ya está siendo usado por el contenedor anterior.

Conclusión

Hemos visto cómo instalar múltiples instancias de Sql Server en Linux, con la ayuda de Docker. De esta forma podemos disminuir los costes que supondría desplegar instancias de bases de datos en Azure, sin comprometer el rendimiento ni la fiabilidad.

Enlaces útiles