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:
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.También debe habilitar el nuevo parámetro
memory.enablecontainersharedmemory
enmssql.conf
dentro del contenedor. Puede montarmssql.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 manualmentemssql.conf
dentro del contenedor. Este es un archivo de ejemplomssql.conf
con la configuraciónmemory.enablecontainersharedmemory
establecida entrue
.[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.
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
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;
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
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:
Conéctese directamente al contenedor mediante
docker exec
como usuario raíz. Sustituyasqlcontainer
por un nombre de contenedor.docker exec -u root -it sqlcontainer "bash"
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:
- Ejemplo de Dockerfile con búsqueda de texto completo
- Ejemplo de Dockerfile para RHEL 7 y SQL Server 2019
- Ejemplo de Dockerfile para RHEL 8 y SQL Server 2017
- Ejemplo de Dockerfile para Ubuntu 20.04 y SQL Server 2019 con búsqueda de texto completo, PolyBase y Herramientas
Para obtener información sobre cómo compilar y ejecutar contenedores de Docker mediante Dockerfiles, consulte Ejemplos de servicios de ML en GitHub.
Contenido relacionado
- 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.