Implementación y conexión a contenedores de Linux de SQL Server

Se aplica a: SQL Server - Linux

En este artículo se explica cómo implementar y conectarse a contenedores de Linux de SQL Server.

Para otros escenarios de implementación, consulte:

Nota:

En este artículo, nos centraremos específicamente en el uso de la imagen mssql-server-linux. Las implementaciones de SQL Server en contenedores de Windows no están cubiertas por el soporte técnico. Con fines de desarrollo y prueba, puede crear sus propias imágenes de contenedor personalizadas para trabajar con SQL Server en contenedores de Windows. Los archivos de ejemplo están disponibles en GitHub. Los archivos de ejemplo son solo para referencia.

Importante

Antes de elegir la ejecución de un contenedor de SQL Server para casos de uso de producción, revise la directiva de compatibilidad de contenedores de SQL Server para garantizar que se ejecuta una configuración compatible.

En este vídeo de 6 minutos se muestra una introducción a la ejecución de SQL Server en contenedores:

Extraer y ejecutar la imagen de contenedor

Para extraer y ejecutar las imágenes de contenedor de Docker para SQL Server, siga los requisitos previos y los pasos descritos en las siguientes guías de inicio rápido:

En este artículo de configuración se proporcionan escenarios de uso adicionales en las secciones siguientes.

Conexión y consultas

Puede conectarse a SQL Server y realizar consultas en un contenedor desde fuera o desde dentro del contenedor. En las siguientes secciones se explican ambos escenarios.

Herramientas fuera del contenedor

Puede conectarse a la instancia de SQL Server en el host de contenedor desde cualquier herramienta externa de Linux, Windows o macOS que admita conexiones de SQL. Algunas herramientas comunes son:

En el ejemplo siguiente se usa sqlcmd para conectarse a una instancia de SQL Server que se ejecuta en un contenedor. La dirección IP de la cadena de conexión es la dirección IP del equipo host que ejecuta el contenedor.

Nota:

Las versiones más recientes de sqlcmd (enmssql-tools18) están protegidas de manera predeterminada. Si usa la versión 18 o posterior, debe agregar la opción No a sqlcmd para especificar que el cifrado es opcional, no obligatorio.

sqlcmd -S 10.3.2.4 -U SA -P '<YourPassword>'
sqlcmd -S 10.3.2.4 -U SA -P "<YourPassword>"
sqlcmd -S 10.3.2.4 -U SA -P "<YourPassword>"

Si asignó un puerto de host distinto del valor predeterminado 1433, agréguelo a la cadena de conexión. Por ejemplo, si especificó -p 1400:1433 en el comando docker run, establezca de forma explícita el puerto 1400.

sqlcmd -S 10.3.2.4,1400 -U SA -P '<YourPassword>'
sqlcmd -S 10.3.2.4,1400 -U SA -P "<YourPassword>"
sqlcmd -S 10.3.2.4,1400 -U SA -P "<YourPassword>"

Herramientas dentro del contenedor

A partir de SQL Server 2017 (14.x), las herramientas de línea de comandos de SQL Server se incluyen en la imagen de contenedor. Si se asocia a la imagen con un símbolo del sistema interactivo, puede ejecutar las herramientas de forma local.

  1. Use el comando docker exec -it para iniciar un shell de Bash interactivo dentro de su contenedor en ejecución. En el ejemplo siguiente, e69e056c702d es el identificador del contenedor.

    docker exec -it e69e056c702d "bash"
    

    Sugerencia

    No siempre tiene que especificar el id. completo del contenedor. Solo tiene que especificar suficientes caracteres para identificarlo de forma única. Por tanto, en este ejemplo, podría ser suficiente usar e6 o e69 en lugar del id. completo. Para averiguar el id. del contenedor, ejecute el comando docker ps -a.

  2. Una vez dentro del contenedor, conéctese localmente con sqlcmd mediante su ruta de acceso completa.

    /opt/mssql-tools18/bin/sqlcmd -S localhost -U SA -P '<YourPassword>'
    

    Nota

    Las versiones más recientes de sqlcmd están protegidas de manera predeterminada. Para obtener más información sobre el cifrado de conexión, consulte Utilidad de sqlcmd para Windows y Conexión con sqlcmd para Linux y macOS. Si la conexión no se realiza correctamente, puede agregar la opción -No a sqlcmd para especificar que el cifrado es opcional, no obligatorio.

  3. Cuando termine con sqlcmd, escriba exit.

  4. Cuando termine con el símbolo del sistema interactivo, escriba exit. El contenedor continuará ejecutándose después de salir del shell de Bash interactivo.

Comprobación de la versión de contenedor

Si quiere conocer la versión de SQL Server en un contenedor en ejecución, ejecute el siguiente comando para mostrarla. Reemplace <Container ID or name> por el identificador o el nombre del contenedor de destino. Reemplace <YourStrong!Passw0rd> por la contraseña de SQL Server de la cuenta del administrador del sistema.

docker exec -it <Container ID or name> /opt/mssql-tools/bin/sqlcmd \
-S localhost -U SA -P '<YourStrong!Passw0rd>' \
-Q 'SELECT @@VERSION'

Nota

Las versiones más recientes de sqlcmd están protegidas de manera predeterminada. Para obtener más información sobre el cifrado de conexión, consulte Utilidad de sqlcmd para Windows y Conexión con sqlcmd para Linux y macOS. Si la conexión no se realiza correctamente, puede agregar la opción -No a sqlcmd para especificar que el cifrado es opcional, no obligatorio.

docker exec -it <Container ID or name> /opt/mssql-tools/bin/sqlcmd `
-S localhost -U SA -P "<YourStrong!Passw0rd>" `
-Q "SELECT @@VERSION"

Nota:

Las versiones más recientes de sqlcmd están protegidas de manera predeterminada. Para obtener más información sobre el cifrado de conexión, consulte Utilidad de sqlcmd para Windows y Conexión con sqlcmd para Linux y macOS. Si la conexión no se realiza correctamente, puede agregar la opción -No a sqlcmd para especificar que el cifrado es opcional, no obligatorio.

docker exec -it <Container ID or name> /opt/mssql-tools/bin/sqlcmd ^
-S localhost -U SA -P "<YourStrong!Passw0rd>" ^
-Q "SELECT @@VERSION"

Nota:

Las versiones más recientes de sqlcmd están protegidas de manera predeterminada. Para obtener más información sobre el cifrado de conexión, consulte Utilidad de sqlcmd para Windows y Conexión con sqlcmd para Linux y macOS. Si la conexión no se realiza correctamente, puede agregar la opción -No a sqlcmd para especificar que el cifrado es opcional, no obligatorio.

También puede identificar la versión de SQL Server y el número de compilación de una imagen de contenedor de destino. El siguiente comando muestra la versión de SQL Server y la información de compilación de la imagen mcr.microsoft.com/mssql/server:2022-latest. Para ello, ejecuta un nuevo contenedor con una variable de entorno PAL_PROGRAM_INFO=1. El contenedor resultante se cierra al instante y el comando docker rm lo quita.

docker run -e PAL_PROGRAM_INFO=1 --name sqlver \
-ti mcr.microsoft.com/mssql/server:2022-latest && \
docker rm sqlver
docker run -e PAL_PROGRAM_INFO=1 --name sqlver `
-ti mcr.microsoft.com/mssql/server:2022-latest; `
docker rm sqlver
docker run -e PAL_PROGRAM_INFO=1 --name sqlver ^
-ti mcr.microsoft.com/mssql/server:2022-latest && ^
docker rm sqlver

Los comandos anteriores muestran información de versión similar a la siguiente salida:

sqlservr
  Version 16.0.1000.6
  Build ID d81e9b6de06534e649bd57dd609aa3050f5e380f361b7f8a80a80eeb71e7422c
  Build Type release
  Git Version 2aede92f
  Built at Tue Nov 01 06:11:40 GMT 2022

PAL
  Build ID 754097e8f0db68f559e1cbc9d46952ac9fd518b5da9f12964ef40fc9033720e3
  Build Type release
  Git Version d88e3e1130
  Built at Tue Nov 01 06:08:02 GMT 2022

Packages
  system.security                         mssql-16.0.1000.6_26_official-release
  system.certificates                     mssql-16.0.1000.6_26_official-release
  sqlagent                                16.0.1000.6
  system.wmi                              10.0.17763.2061.202107231
  system.netfx                            4.7.0.0.202104262
  system                                  mssql-16.0.1000.6_26_official-release
  system.common                           10.0.17763.2061.202107231
  sqlservr                                16.0.1000.6
  secforwarderxplat                       16.0.1000.6

Ejecución de una imagen de contenedor de SQL Server determinada

Nota

  • A partir de SQL Server 2019 (15.x) CU3, se admite Ubuntu 18.04.
  • A partir de SQL Server 2019 (15.x) CU10, se admite Ubuntu 20.04.
  • Puede recuperar una lista de todas las etiquetas disponibles para mssql/server en https://mcr.microsoft.com/v2/mssql/server/tags/list.

Hay escenarios en los que es posible que no quiera usar la imagen de contenedor de SQL Server más reciente. Para ejecutar una imagen de contenedor de SQL Server determinada, siga estos pasos:

  1. Identifique la tag de Docker para la versión que quiere usar. Para ver las etiquetas disponibles, consulte el Registro de artefactos Microsoft.

  2. Extraiga la imagen de contenedor de SQL Server con la etiqueta. Por ejemplo, para extraer la imagen 2019-CU18-ubuntu-20.04, reemplace <image_tag> en el comando siguiente por 2019-CU18-ubuntu-20.04.

    docker pull mcr.microsoft.com/mssql/server:<image_tag>
    
  3. Para ejecutar un nuevo contenedor con esa imagen, especifique el nombre de la etiqueta en el comando docker run. En el siguiente comando, reemplace <image_tag> por la versión que quiere ejecutar.

    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 1401:1433 -d mcr.microsoft.com/mssql/server:<image_tag>
    
    docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1401:1433 -d mcr.microsoft.com/mssql/server:<image_tag>
    
    docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1401:1433 -d mcr.microsoft.com/mssql/server:<image_tag>
    

Estos pasos también se pueden usar para degradar un contenedor existente. Por ejemplo, puede que quiera revertir o degradar un contenedor en ejecución para solucionar problemas o realizar pruebas. Para degradar un contenedor en ejecución, debe usar una técnica de persistencia para la carpeta de datos. Siga los mismos pasos descritos en la sección de actualización, pero especifique el nombre de etiqueta de la versión anterior al ejecutar el nuevo contenedor.

Ejecución de imágenes de contenedor basadas en RHEL

La documentación sobre las imágenes de contenedor de SQL Server en Linux apunta a contenedores basados en Ubuntu. A partir de SQL Server 2019 (15.x), puede usar contenedores basados en Red Hat Enterprise Linux (RHEL). Un ejemplo de la imagen para RHEL será similar a mcr.microsoft.com/mssql/rhel/server:2019-CU15-rhel-8.

Por ejemplo, el comando siguiente extrae la actualización acumulativa 18 para el contenedor de SQL Server 2019 (15.x) que usa RHEL 8:

docker pull mcr.microsoft.com/mssql/rhel/server:2019-CU18-rhel-8.4
docker pull mcr.microsoft.com/mssql/rhel/server:2019-CU18-rhel-8.4
docker pull mcr.microsoft.com/mssql/rhel/server:2019-CU18-rhel-8.4

Ejecución de imágenes de contenedor de producción

En el inicio rápido de la sección anterior se ejecuta la edición para desarrolladores gratuita de SQL Server del Registro de artefactos Microsoft. La mayor parte de la información sigue siendo aplicable si quiere ejecutar imágenes de contenedor de producción, como las ediciones Enterprise, Standard o Web. Pero hay algunas diferencias que se describen aquí.

  • Solo puede usar SQL Server en un entorno de producción si tiene una licencia válida. Puede obtener una licencia de producción gratuita de SQL Server Express aquí. Las licencias de edición SQL Server Standard y Enterprise están disponibles mediante licencias por volumen de Microsoft.

  • La imagen de contenedor para desarrolladores también se puede configurar para que ejecute las ediciones de producción.

Para ejecutar una edición de producción, revise los requisitos y los procedimientos de ejecución en el inicio rápido. Debe especificar la edición de producción con la variable de entorno MSSQL_PID. En el ejemplo siguiente se muestra cómo ejecutar la imagen de contenedor más reciente de SQL Server 2022 (16.x) para la edición Enterprise Core.

docker run --name sqlenterprise \
-e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \
-e 'MSSQL_PID=EnterpriseCore' -p 1433:1433 \
-d mcr.microsoft.com/mssql/server:2022-latest
docker run --name sqlenterprise `
-e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
-e "MSSQL_PID=EnterpriseCore" -p 1433:1433 `
-d "mcr.microsoft.com/mssql/server:2022-latest"
docker run --name sqlenterprise ^
-e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" ^
-e "MSSQL_PID=EnterpriseCore" -p 1433:1433 ^
-d "mcr.microsoft.com/mssql/server:2022-latest"

Importante

Al pasar el valor Y a la variable de entorno ACCEPT_EULA y un valor de edición a MSSQL_PID, está expresando que tiene una licencia válida y existente para la edición y la versión de SQL Server que va a utilizar. También acepta que el uso del software de SQL Server que se ejecuta en una imagen de contenedor se regirá por los términos de la licencia de SQL Server.

Nota:

Para obtener una lista completa de los posibles valores de MSSQL_PID, vea Configuración de opciones de SQL Server con variables de entorno en Linux.

Ejecución de varios contenedores de SQL Server

Docker proporciona una manera de ejecutar varios contenedores de SQL Server en el mismo equipo host. Use este enfoque para escenarios en los que se requieran varias instancias de SQL Server en el mismo host. Cada contenedor debe exponerse en un puerto diferente.

En el ejemplo siguiente se crean dos contenedores de SQL Server 2017 (14.x) y se asignan a los puertos 1401 y 1402 en el equipo host.

docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' -p 1401:1433 -d mcr.microsoft.com/mssql/server:2017-latest
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' -p 1402:1433 -d mcr.microsoft.com/mssql/server:2017-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1401:1433 -d mcr.microsoft.com/mssql/server:2017-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1402:1433 -d mcr.microsoft.com/mssql/server:2017-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1401:1433 -d mcr.microsoft.com/mssql/server:2017-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1402:1433 -d mcr.microsoft.com/mssql/server:2017-latest

En el ejemplo siguiente se crean dos contenedores de SQL Server 2019 (15.x) y se asignan a los puertos 1401 y 1402 en el equipo host.

docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' -p 1401:1433 -d mcr.microsoft.com/mssql/server:2019-latest
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' -p 1402:1433 -d mcr.microsoft.com/mssql/server:2019-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1401:1433 -d mcr.microsoft.com/mssql/server:2019-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1402:1433 -d mcr.microsoft.com/mssql/server:2019-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1401:1433 -d mcr.microsoft.com/mssql/server:2019-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1402:1433 -d mcr.microsoft.com/mssql/server:2019-latest

En el ejemplo siguiente se crean dos contenedores de SQL Server 2022 (16.x) y se asignan a los puertos 1401 y 1402 en el equipo host.

docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' -p 1401:1433 -d mcr.microsoft.com/mssql/server:2022-latest
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' -p 1402:1433 -d mcr.microsoft.com/mssql/server:2022-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1401:1433 -d mcr.microsoft.com/mssql/server:2022-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1402:1433 -d mcr.microsoft.com/mssql/server:2022-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1401:1433 -d mcr.microsoft.com/mssql/server:2022-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1402:1433 -d mcr.microsoft.com/mssql/server:2022-latest

Ahora hay dos instancias de SQL Server que se ejecutan en contenedores independientes. Los clientes pueden conectarse a cada instancia de SQL Server mediante la dirección IP del host de contenedor y el número de puerto del contenedor.

Nota:

Las versiones más recientes de sqlcmd (enmssql-tools18) están protegidas de manera predeterminada. Si usa la versión 18 o posterior, debe agregar la opción No a sqlcmd para especificar que el cifrado es opcional, no obligatorio.

sqlcmd -S 10.3.2.4,1401 -U SA -P '<YourPassword>'
sqlcmd -S 10.3.2.4,1402 -U SA -P '<YourPassword>'
sqlcmd -S 10.3.2.4,1401 -U SA -P "<YourPassword>"
sqlcmd -S 10.3.2.4,1402 -U SA -P "<YourPassword>"
sqlcmd -S 10.3.2.4,1401 -U SA -P "<YourPassword>"
sqlcmd -S 10.3.2.4,1402 -U SA -P "<YourPassword>"

Actualización de SQL Server en contenedores

Para actualizar la imagen de contenedor con Docker, primero identifique la etiqueta de la versión de la actualización. Extraiga esta versión del registro con el comando docker pull:

docker pull mcr.microsoft.com/mssql/server:<image_tag>

Esto actualiza la imagen de SQL Server para los nuevos contenedores que cree, pero no actualiza SQL Server en ningún contenedor en ejecución. Para ello, debe crear un nuevo contenedor con la imagen de contenedor de SQL Server más reciente y migrar los datos a ese nuevo contenedor.

  1. Asegúrese de que usa una de las técnicas de persistencia de datos para el contenedor de SQL Server existente. Esto le permite iniciar un nuevo contenedor con los mismos datos.

  2. Detenga el contenedor de SQL Server con el comando docker stop.

  3. Cree un nuevo contenedor de SQL Server con docker run y especifique un directorio de host asignado o un contenedor de volúmenes de datos. Asegúrese de usar la etiqueta específica para la actualización de SQL Server. El nuevo contenedor ahora usa una nueva versión de SQL Server con los datos de SQL Server existentes.

    Importante

    La actualización solo se admite entre RC1, RC2 y GA en este momento.

  4. Compruebe las bases de datos y los datos del nuevo contenedor.

  5. Opcionalmente, quite el contenedor anterior con docker rm.

  • 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.