Configuración y personalización de contenedores de Linux de SQL Server

Se aplica a: SQL Server - Linux

En este artículo se explica cómo configurar y personalizar contenedores de Linux de SQL Server mediante Docker. Puede conservar los datos, mover archivos entre contenedores y cambiar la configuración predeterminada.

Sugerencia

Puede usar sqlcmd (Go) para crear una nueva instancia de SQL Server en un contenedor con fines de desarrollo. Para obtener más información, consulte Creación y consulta de un contenedor de SQL Server.

Creación de un contenedor personalizado

Puede crear su propio Dockerfile para compilar un contenedor de SQL Server personalizado. Para obtener más información, vea una demostración que combina SQL Server y una aplicación de nodo. Si crea su propio Dockerfile, tenga en cuenta el proceso en primer plano, ya que este proceso controla la vida del contenedor. Si existe, el contenedor se apagará. Por ejemplo, si desea ejecutar un script e iniciar SQL Server, asegúrese de que el proceso de SQL Server sea el más adecuado. Todos los demás comandos se ejecutan en segundo plano. El comando siguiente ilustra esto dentro de un Dockerfile:

/usr/src/app/do-my-sql-commands.sh & /opt/mssql/bin/sqlservr

Si en el ejemplo anterior ha invertido los comandos, el contenedor se cerrará cuando se complete el script do-my-sql-commands.sh.

Conservación de los datos

Los cambios de configuración de SQL Server y los archivos de base de datos se conservan en el contenedor aunque se reinicie el contenedor con docker stop y docker start. Pero si quita el contenedor con docker rm, se elimina todo el contenedor, incluidos SQL Server y las bases de datos. En la siguiente sección se explica cómo usar volúmenes de datos para conservar los archivos de base de datos incluso si se eliminan los contenedores asociados.

Importante

En el caso de SQL Server, es fundamental que comprenda la persistencia de los datos en Docker. Además de la explicación de esta sección, consulte la documentación de Docker sobre cómo administrar datos en contenedores de Docker.

Montaje de un directorio host como volumen de datos

La primera opción consiste en montar un directorio en el host como un volumen de datos en el contenedor. Para ello, use el comando docker run con la marca -v <host directory>:/var/opt/mssql, donde <host directory> es cualquier ruta de acceso determinada. Por ejemplo: C:\SQL en Windows o ~/sqlvolumes en Linux. Esto permite restaurar los datos entre las ejecuciones del contenedor.

Nota

Los contenedores de SQL Server 2019 (15.x) y versiones posteriores se inician automáticamente como no raíz, mientras que los contenedores de SQL Server 2017 (14.x) se inician como raíz de manera predeterminada. Para obtener más información sobre cómo ejecutar contenedores de SQL Server para que no sean raíz, consulte Seguridad de los contenedores de Linux de SQL Server.

Importante

La variable de entorno SA_PASSWORD está en desuso. En su lugar, use MSSQL_SA_PASSWORD.

docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \
-p 1433:1433 \
-v <host directory>/data:/var/opt/mssql/data \
-v <host directory>/log:/var/opt/mssql/log \
-v <host directory>/secrets:/var/opt/mssql/secrets \
-d mcr.microsoft.com/mssql/server:2017-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
-p 1433:1433 `
-v <host directory>/data:/var/opt/mssql/data `
-v <host directory>/log:/var/opt/mssql/log `
-v <host directory>/secrets:/var/opt/mssql/secrets `
-d mcr.microsoft.com/mssql/server:2017-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" ^
-p 1433:1433 ^
-v <host directory>/data:/var/opt/mssql/data ^
-v <host directory>/log:/var/opt/mssql/log ^
-v <host directory>/secrets:/var/opt/mssql/secrets ^
-d mcr.microsoft.com/mssql/server:2017-latest
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \
-p 1433:1433 \
-v <host directory>/data:/var/opt/mssql/data \
-v <host directory>/log:/var/opt/mssql/log \
-v <host directory>/secrets:/var/opt/mssql/secrets \
-d mcr.microsoft.com/mssql/server:2019-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
-p 1433:1433 `
-v <host directory>/data:/var/opt/mssql/data `
-v <host directory>/log:/var/opt/mssql/log `
-v <host directory>/secrets:/var/opt/mssql/secrets `
-d mcr.microsoft.com/mssql/server:2019-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" ^
-p 1433:1433 ^
-v <host directory>/data:/var/opt/mssql/data ^
-v <host directory>/log:/var/opt/mssql/log ^
-v <host directory>/secrets:/var/opt/mssql/secrets ^
-d mcr.microsoft.com/mssql/server:2019-latest
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \
-p 1433:1433 \
-v <host directory>/data:/var/opt/mssql/data \
-v <host directory>/log:/var/opt/mssql/log \
-v <host directory>/secrets:/var/opt/mssql/secrets \
-d mcr.microsoft.com/mssql/server:2022-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
-p 1433:1433 `
-v <host directory>/data:/var/opt/mssql/data `
-v <host directory>/log:/var/opt/mssql/log `
-v <host directory>/secrets:/var/opt/mssql/secrets `
-d mcr.microsoft.com/mssql/server:2022-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" ^
-p 1433:1433 ^
-v <host directory>/data:/var/opt/mssql/data ^
-v <host directory>/log:/var/opt/mssql/log ^
-v <host directory>/secrets:/var/opt/mssql/secrets ^
-d mcr.microsoft.com/mssql/server:2022-latest

Esta técnica también le permite compartir y ver los archivos en el host fuera de Docker.

Uso de contenedores de volúmenes de datos

La segunda opción consiste en usar un contenedor de volúmenes de datos. Puede crear un contenedor de volúmenes de datos especificando un nombre de volumen en lugar de un directorio host con el parámetro -v. En el ejemplo siguiente se crea un volumen de datos compartidos denominado sqlvolume.

docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \
-p 1433:1433 \
-v sqlvolume:/var/opt/mssql \
-d mcr.microsoft.com/mssql/server:2017-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
-p 1433:1433 `
-v sqlvolume:/var/opt/mssql `
-d mcr.microsoft.com/mssql/server:2017-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" ^
-p 1433:1433 ^
-v sqlvolume:/var/opt/mssql ^
-d mcr.microsoft.com/mssql/server:2017-latest
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \
-p 1433:1433 \
-v sqlvolume:/var/opt/mssql \
-d mcr.microsoft.com/mssql/server:2019-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
-p 1433:1433 `
-v sqlvolume:/var/opt/mssql `
-d mcr.microsoft.com/mssql/server:2019-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" ^
-p 1433:1433 ^
-v sqlvolume:/var/opt/mssql ^
-d mcr.microsoft.com/mssql/server:2019-latest
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \
-p 1433:1433 \
-v sqlvolume:/var/opt/mssql \
-d mcr.microsoft.com/mssql/server:2022-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
-p 1433:1433 `
-v sqlvolume:/var/opt/mssql `
-d mcr.microsoft.com/mssql/server:2022-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" ^
-p 1433:1433 ^
-v sqlvolume:/var/opt/mssql ^
-d mcr.microsoft.com/mssql/server:2022-latest

Nota:

Esta técnica para crear de forma implícita un volumen de datos en el comando de ejecución no funciona con versiones anteriores de Docker. En ese caso, use los pasos explícitos que se describen en la documentación de Docker, Creación y montaje de un contenedor de volúmenes de datos.

Incluso si detiene y quita este contenedor, el volumen de datos se conserva. Puede verlo con el comando docker volume ls.

docker volume ls

Si después crea otro contenedor con el mismo nombre de volumen, el nuevo contenedor usará los mismos datos de SQL Server contenidos en el volumen.

Para quitar un contenedor de volúmenes de datos, use el comando docker volume rm.

Advertencia

Si elimina el contenedor de volúmenes de datos, todos los datos de SQL Server del contenedor se eliminarán de forma permanente.

Copia de seguridad y restauración

Además de estas técnicas de contenedor, también puede usar las técnicas estándar de copia de seguridad y restauración de SQL Server. Puede usar archivos de copia de seguridad para proteger los datos o para trasladarlos a otra instancia de SQL Server. Para obtener más información, vea Copia de seguridad y restauración de bases de datos de SQL Server en Linux.

Advertencia

Si crea copias de seguridad, asegúrese de crear o copiar los archivos de copia de seguridad fuera del contenedor. De lo contrario, si se quita el contenedor, también se eliminarán los archivos de copia de seguridad.

Habilitación de la copia de seguridad y restauración de VDI en contenedores

Las operaciones de copia de seguridad y restauración de la interfaz de dispositivo virtual (VDI) ahora se admiten en implementaciones de contenedores de SQL Server a partir de CU15 para SQL Server 2019 (15x) y CU28 para SQL Server 2017 (14x). Siga estos pasos para habilitar copias de seguridad o restauraciones basadas en VDI para contenedores de SQL Server:

  1. Al implementar contenedores de SQL Server, use la opción --shm-size. Para empezar, establezca el tamaño en 1 GB, tal como se muestra en el comando siguiente:

    docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=Mystr0ngP@ssw0rd!" \
    --shm-size 1g \
    -p 1433:1433 \
    --name sql19 \
    --hostname sql19 \
    -d mcr.microsoft.com/mssql/server:2019-latest
    

    La opción --shm-size permite configurar el tamaño del directorio de memoria compartida (/dev/shm) dentro del contenedor, que se establece en 64 MB de forma predeterminada. Este tamaño predeterminado de la memoria compartida no es suficiente para admitir copias de seguridad de VDI. Se recomienda configurar esto en un mínimo de 1 GB si implementa contenedores de SQL Server y desea admitir copias de seguridad de VDI.

  2. También debe habilitar el nuevo parámetro memory.enablecontainersharedmemory en mssql.conf dentro del contenedor. Puede montar mssql.conf en la implementación del contenedor mediante la opción -v, tal como se describe en la sección Conservar los datos, o después de haber implementado el contenedor actualizando manualmente mssql.conf dentro del contenedor. Este es un archivo de ejemplo mssql.conf con la configuración memory.enablecontainersharedmemory establecida en true.

    [memory]
    enablecontainersharedmemory = true
    

Copia de archivos desde un contenedor

Para copiar un archivo del contenedor, use el siguiente comando:

docker cp <Container ID>:<Container path> <host path>

Puede obtener el id. de contenedor si ejecuta el comando docker ps -a.

Ejemplo:

docker cp d6b75213ef80:/var/opt/mssql/log/errorlog /tmp/errorlog
docker cp d6b75213ef80:/var/opt/mssql/log/errorlog C:\Temp\errorlog
docker cp d6b75213ef80:/var/opt/mssql/log/errorlog C:\Temp\errorlog

Copia de archivos en un contenedor

Para copiar un archivo en el contenedor, use el siguiente comando:

docker cp <Host path> <Container ID>:<Container path>

Ejemplo:

docker cp /tmp/mydb.mdf d6b75213ef80:/var/opt/mssql/data
docker cp C:\Temp\mydb.mdf d6b75213ef80:/var/opt/mssql/data
docker cp C:\Temp\mydb.mdf d6b75213ef80:/var/opt/mssql/data

Configuración de la zona horaria

Para ejecutar SQL Server en un contenedor de Linux con una zona horaria específica, configure la variable de entorno TZ (para obtener más información, consulte Configuración de la zona horaria en Linux para SQL Server 2022). Para encontrar el valor de zona horaria correcto, ejecute el comando tzselect desde un símbolo del sistema de Bash de Linux:

tzselect

Después de seleccionar la zona horaria, tzselect muestra una salida similar a la siguiente:

The following information has been given:

    United States
    Pacific

Therefore TZ='America/Los_Angeles' will be used.

Puede usar esta información para establecer la misma variable de entorno en el contenedor de Linux. En el ejemplo siguiente se muestra cómo ejecutar SQL Server en un contenedor en la zona horaria de Americas/Los_Angeles:

sudo docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \
-p 1433:1433 --name sql1 \
-e 'TZ=America/Los_Angeles' \
-d mcr.microsoft.com/mssql/server:2017-latest
sudo docker run -e 'ACCEPT_EULA=Y' -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
-p 1433:1433 --name sql1 `
-e "TZ=America/Los_Angeles" `
-d mcr.microsoft.com/mssql/server:2017-latest
sudo docker run -e 'ACCEPT_EULA=Y' -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" ^
-p 1433:1433 --name sql1 ^
-e "TZ=America/Los_Angeles" ^
-d mcr.microsoft.com/mssql/server:2017-latest
sudo docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \
-p 1433:1433 --name sql1 \
-e 'TZ=America/Los_Angeles' \
-d mcr.microsoft.com/mssql/server:2019-latest
sudo docker run -e 'ACCEPT_EULA=Y' -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
-p 1433:1433 --name sql1 `
-e "TZ=America/Los_Angeles" `
-d mcr.microsoft.com/mssql/server:2019-latest
sudo docker run -e 'ACCEPT_EULA=Y' -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
-p 1433:1433 --name sql1 `
-e "TZ=America/Los_Angeles" `
-d mcr.microsoft.com/mssql/server:2019-latest
sudo docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \
-p 1433:1433 --name sql1 \
-e 'TZ=America/Los_Angeles' \
-d mcr.microsoft.com/mssql/server:2022-latest
sudo docker run -e 'ACCEPT_EULA=Y' -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
-p 1433:1433 --name sql1 `
-e "TZ=America/Los_Angeles" `
-d mcr.microsoft.com/mssql/server:2022-latest
sudo docker run -e 'ACCEPT_EULA=Y' -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" ^
-p 1433:1433 --name sql1 ^
-e "TZ=America/Los_Angeles" ^
-d mcr.microsoft.com/mssql/server:2022-latest

Cambio de la ruta de acceso de tempdb

Se recomienda mantener la base de datos tempdb independiente de las bases de datos de usuario.

  1. Conéctese a la instancia de SQL Server y, luego, ejecute el siguiente script de Transact-SQL (T-SQL). Si hay más archivos asociados con tempdb, también deberá moverlos.

    ALTER DATABASE tempdb MODIFY FILE (
       NAME = tempdev, FILENAME = '/var/opt/mssql/tempdb/tempdb.mdf'
    );
    GO
    
    ALTER DATABASE tempdb MODIFY FILE (
        NAME = templog, FILENAME = '/var/opt/mssql/tempdb/templog.ldf'
    );
    GO
    
  2. Compruebe que se ha modificado la ubicación del archivo tempdb mediante el siguiente script de T-SQL:

    SELECT *
    FROM sys.sysaltfiles
    WHERE dbid = 2;
    
  3. Debe reiniciar el contenedor de SQL Server para que estos cambios surtan efecto.

    docker stop sql1
    docker start sql1
    
    docker stop sql1
    docker start sql1
    
    docker stop sql1
    docker start sql1
    
  4. Abra una sesión interactiva de bash para conectarse al contenedor.

    docker exec -it sql1 bash
    
    docker exec -it sql1 bash
    
    docker exec -it sql1 bash
    

    Una vez conectado al shell interactivo, ejecute el siguiente comando para comprobar la ubicación de tempdb:

    ls /var/opt/mssql/tempdb/
    

    Si el movimiento es correcto, verá una salida similar a esta:

    tempdb.mdf templog.ldf
    

Cambio de la ubicación predeterminada del archivo

Agregue la variable MSSQL_DATA_DIR para cambiar el directorio de datos en el comando docker run y, después, monte un volumen en esa ubicación a la que tenga acceso el usuario del contenedor.

docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=MyStrongPassword' \
-e 'MSSQL_DATA_DIR=/my/file/path' \
-v /my/host/path:/my/file/path \
-p 1433:1433 \
-d mcr.microsoft.com/mssql/server:2017-latest
docker run -e 'ACCEPT_EULA=Y' -e "MSSQL_SA_PASSWORD=MyStrongPassword" `
-e "MSSQL_DATA_DIR=/my/file/path" `
-v /my/host/path:/my/file/path `
-p 1433:1433 `
-d mcr.microsoft.com/mssql/server:2017-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=MyStrongPassword" ^
-e "MSSQL_DATA_DIR=/my/file/path" ^
-v /my/host/path:/my/file/path ^
-p 1433:1433 ^
-d mcr.microsoft.com/mssql/server:2017-latest
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=MyStrongPassword' \
-e 'MSSQL_DATA_DIR=/my/file/path' \
-v /my/host/path:/my/file/path \
-p 1433:1433 \
-d mcr.microsoft.com/mssql/server:2019-latest
docker run -e 'ACCEPT_EULA=Y' -e "MSSQL_SA_PASSWORD=MyStrongPassword" `
-e "MSSQL_DATA_DIR=/my/file/path" `
-v /my/host/path:/my/file/path `
-p 1433:1433 `
-d mcr.microsoft.com/mssql/server:2019-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=MyStrongPassword" ^
-e "MSSQL_DATA_DIR=/my/file/path" ^
-v /my/host/path:/my/file/path ^
-p 1433:1433 ^
-d mcr.microsoft.com/mssql/server:2019-latest
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=MyStrongPassword' \
-e 'MSSQL_DATA_DIR=/my/file/path' \
-v /my/host/path:/my/file/path \
-p 1433:1433 \
-d mcr.microsoft.com/mssql/server:2022-latest
docker run -e 'ACCEPT_EULA=Y' -e "MSSQL_SA_PASSWORD=MyStrongPassword" `
-e "MSSQL_DATA_DIR=/my/file/path" `
-v /my/host/path:/my/file/path `
-p 1433:1433 `
-d mcr.microsoft.com/mssql/server:2022-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=MyStrongPassword" ^
-e "MSSQL_DATA_DIR=/my/file/path" ^
-v /my/host/path:/my/file/path ^
-p 1433:1433 ^
-d mcr.microsoft.com/mssql/server:2022-latest

Uso de mssql-config para configurar SQL Server dentro de un contenedor

Puede usar la herramienta mssql-conf para establecer parámetros en contenedores de SQL Server.

Por ejemplo, puede establecer un límite de memoria para la instancia mediante los pasos siguientes:

  1. Conéctese directamente al contenedor mediante docker exec como usuario raíz. Sustituya sqlcontainer por un nombre de contenedor.

    docker exec -u root -it sqlcontainer "bash"
    
  2. Use mssql-conf para cambiar una configuración. En este ejemplo se cambia la configuración memory.memorylimitmb a 2 GB (2048 MB).

    /opt/mssql/bin/mssql-conf set memory.memorylimitmb 2048
    

Ejemplos de contenedores de Docker personalizados

Para obtener ejemplos de contenedores Docker personalizados, consulte https://github.com/microsoft/mssql-docker/tree/master/linux/preview/examples. Algunos ejemplos son:

Para obtener información sobre cómo compilar y ejecutar contenedores de Docker mediante Dockerfiles, consulte Ejemplos de servicios de ML en GitHub.

  • Para empezar a trabajar con imágenes de contenedor de SQL Server 2017 (14.x) en Docker, revise el inicio rápido
  • Para empezar a trabajar con imágenes de contenedor de SQL Server 2019 (15.x) en Docker, revise el inicio rápido
  • Para empezar a trabajar con imágenes de contenedor de SQL Server 2022 (16.x) en Docker, revise el inicio rápido

Contribuya a la documentación de SQL

¿Sabía que puede editar el contenido de SQL usted mismo? Si lo hace, no solo contribuirá a mejorar la documentación, sino que también se le reconocerá como colaborador de la página.

Para más información, vea Cómo colaborar en la documentación de SQL Server.