Distribuire e connettersi a contenitori Docker di SQL Server

Si applica a: sìSQL Server (tutte le versioni supportate) - Linux

Questo articolo illustra come distribuire e connettersi ai contenitori Docker di SQL Server.

Per altri scenari di distribuzione, vedere:

Nota

Questo articolo è incentrato nello specifico sull'uso dell'immagine mssql-server-linux. SQL Server distribuzioni in Windows contenitori non sono coperte dal supporto. Per lo sviluppo e il test, è possibile creare immagini del contenitore personalizzate da usare con SQL Server in Windows contenitori. I file di esempio sono disponibili in GitHub. I file di esempio sono solo a riferimento.

Importante

Prima di scegliere di eseguire un contenitore SQL Server per i casi d'uso di produzione, vedere i criteri di supporto per i contenitori SQL Server per assicurarsi che l'esecuzione avvenga in una configurazione supportata.

Questo video di 6 minuti offre un'introduzione relativa all'esecuzione di SQL Server nei contenitori:

Effettuare il pull ed eseguire l'immagine del contenitore

Per il pull e l'esecuzione delle immagini del contenitore Docker per SQL Server 2017 e SQL Server 2019, seguire i prerequisiti e i passaggi illustrati nella guida di avvio rapido seguente:

Questo articolo dedicato alla configurazione descrive altri scenari di utilizzo nelle sezioni seguenti.

Connessione ed esecuzione di query

È possibile connettersi a SQL Server ed eseguire query in un contenitore dall'esterno o dall'interno del contenitore. Nelle sezioni seguenti vengono illustrati entrambi gli scenari.

Strumenti all'esterno del contenitore

È possibile connettersi all'istanza di SQL Server nel computer che esegue Docker da uno strumento esterno Linux, Windows o macOS che supporti le connessioni SQL. Alcuni strumenti comuni includono:

Nell'esempio seguente viene usato sqlcmd per connettersi a SQL Server in esecuzione in un contenitore Docker. L'indirizzo IP nella stringa di connessione è l'indirizzo IP del computer host in cui è in esecuzione il contenitore.

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>"

Se è stato eseguito il mapping di una porta host diversa dalla porta predefinita 1433, aggiungere tale porta alla stringa di connessione. Ad esempio, se si specifica -p 1400:1433 nel comando docker run connettersi specificando in modo esplicito la porta 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>"

Strumenti all'interno del contenitore

A partire da SQL Server 2017, gli strumenti da riga di comando di SQL Server sono inclusi nell'immagine del contenitore. Se ci si connette all'immagine con un prompt dei comandi interattivo, è possibile eseguire gli strumenti localmente.

  1. Usare il comando docker exec -it per avviare una shell Bash interattiva all'interno del contenitore in esecuzione. Nell'esempio seguente e69e056c702d è l'ID del contenitore.

    docker exec -it e69e056c702d "bash"
    

    Suggerimento

    Non è sempre necessario specificare l'intero ID del contenitore. È sufficiente specificare un numero sufficiente di caratteri per identificarlo in modo univoco. In questo esempio potrebbe essere quindi sufficiente usare e6 o e69 anziché l'ID completo. Per individuare l'ID del contenitore, eseguire il comando docker ps -a.

  2. Una volta all'interno del contenitore, eseguire la connessione in locale con sqlcmd. Sqlcmd non è incluso nel percorso per impostazione predefinita, quindi occorre specificare il percorso completo.

    /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P '<YourPassword>'
    
  3. Dopo aver completato le operazioni con sqlcmd, digitare exit.

  4. Al termine delle operazioni con il prompt dei comandi interattivo, digitare exit. Dopo la chiusura della shell Bash interattiva, il contenitore continua l'esecuzione.

Controllare la versione del contenitore

Se si vuole scoprire la versione di SQL Server in un contenitore Docker in esecuzione, eseguire il comando seguente per visualizzarla. Sostituire <Container ID or name> con l'ID o il nome del contenitore di destinazione. Sostituire <YourStrong!Passw0rd> con la password di SQL Server per l'account di accesso sa.

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

È anche possibile identificare la versione di SQL Server e il numero di build per un'immagine del contenitore Docker di destinazione. Il comando seguente visualizza la versione di SQL Server e informazioni sulla build per l'immagine mcr.microsoft.com/mssql/server:2017-latest. A tale scopo, esegue un nuovo contenitore con una variabile di ambiente PAL_PROGRAM_INFO = 1. Il contenitore risultante viene chiuso immediatamente e il comando docker rm lo rimuove.

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

I comandi precedenti visualizzano informazioni sulla versione simili all'output seguente:

sqlservr
  Version 15.0.4063.15
  Build ID 8a3bb4cca325e1d0b3071b3a193f6a1d74b440fbd95d2fb18881651a5b9ec8e8
  Build Type release
  Git Version 0335c462
  Built at Fri Aug 28 04:50:27 GMT 2020

PAL
  Build ID cc5ceea1b3d294f7d0166f99932f98c7eacfaaa81bcd7cf23c6a89f785829b63
  Build Type release
  Git Version ae9d66dff
  Built at Fri Aug 28 04:46:48 GMT 2020

Packages
  system.security                         6.2.9200.10,unset,
  system.certificates                     6.2.9200.10,unset,
  secforwarderxplat                       15.0.4063.15
  sqlservr                                15.0.4063.15
  system.common                           10.0.17134.1246.202005133
  system.netfx                            4.7.2.461814
  system                                  6.2.9200.10,unset,
  sqlagent                                15.0.4063.15

Eseguire un'immagine del contenitore di SQL Server specifica

Nota

  • A partire da SQL Server 2019 CU3 è supportato Ubuntu 18.04.
  • A partire SQL Server 2019 CU10, è supportato Ubuntu 20.04.
  • È possibile recuperare un elenco di tutti i tag disponibili per mssql/server in https://mcr.microsoft.com/v2/mssql/server/tags/list.

Esistono scenari in cui è possibile che non si voglia usare la versione più recente dell'immagine del contenitore di SQL Server. Per eseguire un'immagine del contenitore di SQL Server specifica, seguire questa procedura:

  1. Identificare il tag di Docker per la versione che si vuole usare. Per visualizzare i tag disponibili, vedere la pagina mssql-server-linux dell'hub Docker.

  2. Eseguire il pull dell'immagine del contenitore di SQL Server con il tag. Ad esempio, per eseguire il pull dell'immagine 2019-CU7-ubuntu-18.04, sostituire <image_tag> nel comando seguente con 2019-CU7-ubuntu-18.04.

    docker pull mcr.microsoft.com/mssql/server:<image_tag>
    
  3. Per eseguire un nuovo contenitore con tale immagine, specificare il nome del tag nel comando docker run. Nel comando seguente sostituire <image_tag> con la versione che si vuole eseguire.

    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>
    

Questi passaggi possono essere usati anche per effettuare il downgrade di un contenitore esistente. Ad esempio, potrebbe essere necessario effettuare il rollback o il downgrade di un contenitore in esecuzione per la risoluzione dei problemi o per attività di test. Per effettuare il downgrade di un contenitore in esecuzione, è necessario usare una tecnica di persistenza per la cartella dati. Seguire la stessa procedura descritta nella sezione dedicata all'aggiornamento, ma specificare il nome del tag della versione precedente quando si esegue il nuovo contenitore.

Eseguire immagini del contenitore basate su RHEL

La documentazione dedicata alle immagini del contenitore di SQL Server per Linux si riferisce a contenitori basati su Ubuntu. A partire da SQL Server 2019, è possibile usare contenitori basati su Red Hat Enterprise Linux (RHEL). Un esempio di immagine per RHEL sarà simile a mcr.microsoft.com/mssql/rhel/server:2019-CU1-rhel-8.

Il comando seguente, ad esempio, esegue il pull del contenitore di Cumulative Update 1 per SQL Server 2019 che usa RHEL 8:

sudo docker pull mcr.microsoft.com/mssql/rhel/server:2019-CU1-rhel-8
docker pull mcr.microsoft.com/mssql/rhel/server:2019-CU1-rhel-8
docker pull mcr.microsoft.com/mssql/rhel/server:2019-CU1-rhel-8

Eseguire immagini del contenitore di produzione

Le istruzioni di avvio rapido nella sezione precedente prevedono l'uso dell'edizione Developer gratuita di SQL Server da Docker Hub. La maggior parte delle informazioni è comunque applicabile per l'esecuzione di immagini del contenitore di produzione, ad esempio per le edizioni Enterprise, Standard o Web. Esistono tuttavia alcune differenze descritte di seguito.

  • È possibile usare SQL Server in un ambiente di produzione solo se è disponibile una licenza valida. Qui è possibile ottenere una licenza di produzione per SQL Server Express gratuita. Le licenze delle edizioni SQL Server Standard ed Enterprise sono disponibili tramite Microsoft Volume Licensing.

  • È possibile configurare l'immagine del contenitore Developer anche per eseguire le edizioni di produzione. Per eseguire le edizioni di produzione, seguire questa procedura:

Esaminare i requisiti e ed eseguire le procedure in questo avvio rapido. È necessario specificare l'edizione di produzione con la variabile di ambiente MSSQL_PID. L'esempio seguente mostra come eseguire la versione più recente dell'immagine del contenitore di SQL Server 2017 per l'edizione Enterprise:

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

Importante

Passando il valore Y alla variabile di ambiente ACCEPT_EULA e un valore di edizione a MSSQL_PID, si conferma la disponibilità di una licenza valida ed esistente per l'edizione e la versione di SQL Server che si intende usare. Si accetta anche che l'uso del software SQL Server in un'immagine del contenitore Docker sarà disciplinato dalle condizioni della licenza di SQL Server.

Nota

Per un elenco completo dei valori possibili per MSSQL_PID, vedere Configurare le impostazioni di SQL Server con le variabili di ambiente in Linux.

Eseguire più contenitori di SQL Server

Docker prevede un modo per eseguire più contenitori di SQL Server nello stesso computer host. Usare questo approccio per gli scenari che richiedono più istanze di SQL Server nello stesso host. Ogni contenitore deve essere esposto su una porta diversa.

Nell'esempio seguente vengono creati due contenitori di SQL Server 2017 e ne viene eseguito il mapping alle porte 1401 e 1402 nel computer 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

L'esempio seguente crea due contenitori di SQL Server 2019 ed esegue il mapping di questi alle porte 1401 e 1402 nel computer 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

Sono ora disponibili due istanze di SQL Server in esecuzione in contenitori separati. I client possono connettersi a ogni istanza di SQL Server usando l'indirizzo IP dell'host Docker e il numero di porta per il contenitore.

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>"

Aggiornare SQL Server nei contenitori

Per aggiornare l'immagine del contenitore con Docker, identificare prima di tutto il tag per la versione per l'aggiornamento. Eseguire il pull di questa versione dal Registro di sistema con il comando docker pull:

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

L'immagine di SQL Server viene così aggiornata per tutti i nuovi contenitori creati, ma SQL Server non viene aggiornato in alcun contenitore in esecuzione. A tale scopo, è necessario creare un nuovo contenitore con l'immagine del contenitore di SQL Server più recente ed eseguire la migrazione dei dati al nuovo contenitore.

  1. Assicurarsi di usare una delle tecniche di persistenza dei dati per il contenitore di SQL Server esistente. In questo modo è possibile avviare un nuovo contenitore con gli stessi dati.

  2. Arrestare il contenitore di SQL Server con il comando docker stop.

  3. Creare un nuovo contenitore di SQL Server con docker run e specificare una directory host mappata o un contenitore di volumi di dati. Assicurarsi di usare il tag specifico per l'aggiornamento di SQL Server. Il nuovo contenitore usa ora una nuova versione di SQL Server con i dati di SQL Server esistenti.

    Importante

    L'aggiornamento è supportato solo tra le versioni RC1, RC2 e GA al momento.

  4. Verificare i database e i dati nel nuovo contenitore.

  5. Facoltativamente, rimuovere il contenitore precedente con docker rm.

Passaggi successivi

  • Per informazioni introduttive sull'uso delle immagini del contenitore di SQL Server 2017 in Docker, vedere questo articolo di avvio rapido
  • Per informazioni introduttive sull'uso delle immagini del contenitore di SQL Server 2019 in Docker, vedere questo articolo di avvio rapido