Eventos
31 mar, 23 - 2 abr, 23
Evento de aprendizaje de SQL, Fabric y Power BI más grande. 31 de marzo – 2 de abril. Use el código FABINSIDER para ahorrar $400.
Regístrate hoyEste explorador ya no se admite.
Actualice a Microsoft Edge para aprovechar las características y actualizaciones de seguridad más recientes, y disponer de soporte técnico.
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.
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.
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.
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.
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.
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.
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
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
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
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
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
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
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
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. Sustituya sqlcontainer
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
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.
¿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.
Eventos
31 mar, 23 - 2 abr, 23
Evento de aprendizaje de SQL, Fabric y Power BI más grande. 31 de marzo – 2 de abril. Use el código FABINSIDER para ahorrar $400.
Regístrate hoyCursos
Módulo
Ejecución de contenedores de Docker con Azure Container Instances - Training
Obtenga información sobre cómo ejecutar aplicaciones en contenedor y solucionar sus problemas mediante contenedores de Docker con Azure Container Instances (ACI).
Documentación
Solución de problemas de contenedores de Docker de SQL Server - SQL Server
Explore las distintas técnicas de solución de problemas que puede usar para resolver errores comunes que se ven al usar contenedores de Docker de Linux con imágenes de SQL Server
Implementación y conexión a contenedores de Linux de SQL Server - SQL Server
Explore cómo se puede implementar SQL Server en contenedores de Linux y obtenga información sobre diversas herramientas para conectarse a SQL Server desde dentro y fuera del contenedor
Docker: Instalación de contenedores para SQL Server en Linux - SQL Server
En este inicio rápido se muestra cómo usar Docker para ejecutar las imágenes de contenedor de SQL Server para Linux. Conéctese a una base de datos y ejecute una consulta.