/ HOWTO

Crear imágen SQL Server para Docker personalizada.


Con la aparición en el año 2016 de Sql Server para Linux se abrió un gran abanico de posibilidades para utilizar Docker y Sql Server:

  • Entorno de desarrollo de aplicaciones.
  • Para entornos de preproducción para pruebas.
  • Realización de pruebas de integración automáticas.
  • Protipos de aplicaciones.
  • Y para un entorno de producción.

Entre las acciones que he comentado anteriormente, yo considero muy interesante la opción de crear contenedores para ejecución de pruebas de integración automáticas, por su facilidad de creación y eliminación de los contenedores. Cuando se ejecutan las pruebas de integración contra una base de datos Sql Server, se necesita una base de datos “vacía” (solamente con los datos maestros). Y cuando se vuelva a repetir la prueba necesitamos volver la base de datos al punto de partida, es decir, que este “vacía”. En este punto es donde entra Docker, cuando se inicia las pruebas se puede levantar un contenedor con una instancia de Sql Server y cuando se termina se elimina el contenedor. Así, todas las veces que se quieran realizar las pruebas. Y nos evitamos el costoso trabajo de limpiar o crear la base de datos para cada prueba.

Creación del contenedor con Sql Server

Crear un contenedor con una instancia de Sql Server es muy fácil. Primero se tiene que descargar la imagen de docker hub (https://hub.docker.com/r/microsoft/mssql-server-linux/):

docker pull microsoft.com/mssql-server-linux

Y a continuación ejecutamos el comando run pasando como parámetro: La aceptación del acuerdo de la licencia en la variable de entorno “ACCEPT_EULA”. La primera vez que se inicie el contenedor se tiene que aceptar el acuerdo de la licencia, de lo contrario el contenedor no arrancará. La password del usuario administrador en la variable de entorno “SA_PASSWORD”. El puerto por el que se puede acceder a la instancia. El nombre del contenedor.

docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=Your!Passw0rd" -p 1465:1433 --name sqlTest -d microsoft/mssql-server-linux

Una vez ejecutado, se puede comprobar que el contenedor esta arrancado

Contenedor: i2

Desde el Sql Managment Studio se puede acceder a este servidor SQL Server

Contenedor: i3

Bien, ya tenemos el servidor de Sql Server operativo para las pruebas. Ahora tenemos que crear la base de datos e introducir los datos maestros. Esto puede llegar a ser una tarea muy pesada y odiosa!!!

La solución a esta problemática es la creación de una imagen personalizada de un contenedor con:

  • La instancia de Sql Server
  • La base de datos
  • Y opcionalmente los datos maestros ya creados.

Creación de la imagen personalizada

Para poder crear la imagen personalizada de un contenedor Sql Server con su propia base de datos, tenemos que seguir los siguientes pasos:

Crear el script para la creación de base de datos (Create-database.sql)

CREATE DATABASE TEST
GO

USE TEST
GO

CREATE TABLE Usuario
(
    Id INT IDENTITY PRIMARY KEY NOT NULL,
    Nombre NVARCHAR(50) NOT NULL,
    Apellidos NVARCHAR(75) NOT NULL,
    Cumpleaños DATETIME2 NULL,
    IdProvincia TINYINT NOT NULL
)
GO

CREATE TABLE Provincia
(
    Id TINYINT PRIMARY KEY NOT NULL,
    Nombre NVARCHAR(50)
)
GO

ALTER TABLE Usuario
ADD CONSTRAINT FK_Usuario_Provincia FOREIGN KEY (IdProvincia)
REFERENCES Provincia (Id)
GO

2) El siguiente paso es crear un script de bash para iniciar la herramienta de línea de comandos de Sql Server (sqlcmd) y ejecutar el script creado en el punto anterior. (start.sh)

/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P Your!Passw0rd -d master -i Create_database.sql

3) A continuación, creamos un nuevo script de bash para que ejecute el script anterior e inicie el servidor de base de datos (entrypoint.sh)

./start.sh & /opt/mssql/bin/sqlservr

4) Por último, creamos el fichero Dockerfile para la construcción de la imagen.

FROM microsoft/mssql-server-linux
COPY ./Create_database.sql .
COPY ./start.sh .
COPY ./entrypoint.sh .
ENV ACCEPT_EULA=Y
ENV SA_PASSWORD=Your!Passw0rd
RUN chmod +x ./start.sh
CMD /bin/bash ./entrypoint.sh

En el fichero Dockerfile realizamos las siguientes acciones:

  • Indicamos la imagen base de sql Server que se va a utilizar
  • Copiamos los scripts generados en los puntos 1,2 y 3.
  • Establecemos las variables de entorno para la aceptación de la licencia y la password del usuario administrador
  • Damos permisos de ejecución al script “start.sh”
  • Se arranca la termina y se ejecuta el script de inicio “entrypoint.sh”

Una vez creado el fichero Dockerfile, podemos construir la imagen personalizada.

docker build -t cousqldatabase.

En la ejecución del comando build se puede ver como se van ejecutando los pasos uno a uno y como se van ejecutando los scripts.

Contenedor: i5

En este punto, ya podemos crear el contenedor de nuestra imagen.

docker run -d -p 1470:1433 --name mydatabasecontainer cousqldatabase

Una vez que esta arrancado el contenedor, se puede acceder servidor del contenedor con el Sql Server Managment y verificar que se ha creado la base de datos.

Contenedor: i6

Ahora que se ha visto lo sencillo que es crear la imagen personalizada, se puede realizar cualquier operación que se nos ocurra:

  • Restaurar un backup
  • Scripts de carga de datos
  • Creación de otras bases de datos
  • Etc …

Con este enfoque podemos utilizar instancias de Sql Server en contenedores Docker preconfiguradas (con bases de datos y datos) sin tener que instalar Sql Server en nuestras maquinas o servidores de desarrollo para realizar las pruebas de integración o desarrollos.

Subscríbete y recibirás los últimos artículos semanalmente en tu email.