Avvio rapido: Eseguire immagini del contenitore di SQL Server con Docker

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

In questa guida introduttiva si userà Docker per eseguire il pull ed eseguire l'immagine del contenitore SQL Server 2017, mssql-server-linux. È quindi possibile connettersi a sqlcmd per creare il primo database ed eseguire query.

Suggerimento

Se si vogliono eseguire contenitori di SQL Server 2019, vedere la versione di questo articolo relativa a SQL Server 2019.

Nota

  • A partire da SQL Server 2019 CU3 è supportato Ubuntu 18.04.
  • A partire da SQL Server 2019 CU10, è supportato Ubuntu 20.04.

Per altre informazioni sulle piattaforme supportate, vedere le note sulla versione di SQL Server 2019 in Linux.

In questa guida introduttiva si userà Docker per eseguire il pull ed eseguire l'immagine del contenitore SQL Server 2019, mssql-server-linux. È quindi possibile connettersi a sqlcmd per creare il primo database ed eseguire query.

Suggerimento

Questa guida di avvio rapido consente di creare contenitori di SQL Server 2019. Se si preferisce creare contenitori di SQL Server 2017, vedere la versione di questo articolo relativa a SQL Server 2017.

Questa immagine è costituita da SQL Server in esecuzione in Linux basato su Ubuntu 20.04. Può essere usato con il motore Docker 1.8+ in Linux.

Nota

Gli esempi illustrati di seguito usano il comando docker . Tuttavia, la maggior parte di questi comandi funziona anche con Podman, che fornisce un'interfaccia della riga di comando simile al motore Docker. Altre informazioni su Podman.

Prerequisiti

Eseguire il pull dell'immagine del contenitore 2017 ed eseguirla

Prima di iniziare i passaggi seguenti, assicurarsi di aver selezionato la shell preferita (bash, PowerShell o cmd) nella parte superiore di questo articolo.

  1. Eseguire il pull dell'immagine del contenitore di SQL Server 2017 in Linux dal Registro Container Microsoft.

    sudo docker pull mcr.microsoft.com/mssql/server:2017-latest
    
    docker pull mcr.microsoft.com/mssql/server:2017-latest
    
    docker pull mcr.microsoft.com/mssql/server:2017-latest
    

    Suggerimento

    Se si vogliono eseguire contenitori di SQL Server 2019, vedere la versione di questo articolo relativa a SQL Server 2019.

    Il comando riportato sopra esegue il pull dell'immagine del contenitore di SQL Server 2017 più recente. Se si vuole eseguire il pull di un'immagine specifica, aggiungere un segno di due punti e il nome del tag (ad esempio mcr.microsoft.com/mssql/server:2017-GA-ubuntu). Per visualizzare tutte le immagini disponibili, vedere la pagina dell'hub Docker su mssql-server.

    Per i comandi Bash in questo articolo, si usa sudo. Se non si vuole usare sudo per eseguire Docker, è possibile configurare un gruppo Docker e aggiungere utenti a tale gruppo. Per altre informazioni, vedere Post-installation steps for Linux (Passaggi post-installazione per Linux).

  2. Per eseguire l'immagine del contenitore con Docker, è possibile usare il comando seguente da una shell bash o da un prompt dei comandi di PowerShell con privilegi elevati.

    sudo docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=<YourStrong@Passw0rd>" \
       -p 1433:1433 --name sql1 --hostname sql1 \
       -d \
       mcr.microsoft.com/mssql/server:2017-latest
    

    Nota

    Se si usa PowerShell Core, sostituire le virgolette doppie con virgolette singole.

    docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=<YourStrong@Passw0rd>" `
       -p 1433:1433 --name sql1 --hostname sql1 `
       -d `
       mcr.microsoft.com/mssql/server:2017-latest
    
    docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=<YourStrong@Passw0rd>" `
       -p 1433:1433 --name sql1 --hostname sql1 `
       -d `
       mcr.microsoft.com/mssql/server:2017-latest
    

    Nota

    La password deve essere conforme ai criteri password predefiniti di SQL Server, altrimenti il contenitore non potrà configurare SQL Server e smetterà di funzionare. Per impostazione predefinita, la password deve contenere almeno 8 caratteri, appartenenti a tre dei quattro set seguenti: lettere maiuscole, lettere minuscole, cifre in base 10 e simboli. È possibile esaminare il log degli errori eseguendo il comando docker logs.

    Per impostazione predefinita, viene creato un contenitore con l'edizione Developer di SQL Server 2017. Il processo di esecuzione delle edizioni di produzione nei contenitori è leggermente diverso. Per altre informazioni, vedere Run production container images (Eseguire immagini del contenitore di produzione).

    La tabella seguente offre una descrizione dei parametri dell'esempio docker run precedente:

    Parametro Descrizione
    -e "ACCEPT_EULA=Y" Impostare la variabile ACCEPT_EULA su qualsiasi valore per confermare l'accettazione del contratto di licenza End-User. Impostazione obbligatoria per l'immagine di SQL Server.
    -e "SA_PASSWORD=<YourStrong@Passw0rd>" Specificare una password complessa che sia di almeno otto caratteri e soddisfi i requisiti SQL Server password. Impostazione obbligatoria per l'immagine di SQL Server.
    -p 1433:1433 Eseguire il mapping di una porta TCP nell'ambiente host (primo valore) con una porta TCP nel contenitore (secondo valore). In questo esempio SQL Server è in ascolto sulla porta TCP 1433 nel contenitore e questo è esposto alla porta 1433 nell'host.
    --name sql1 Specificare un nome personalizzato per il contenitore, invece di un nome generato in modo casuale. Se si eseguono più contenitori, non è possibile riutilizzare lo stesso nome.
    --hostname sql1 Usato per impostare in modo esplicito il nome host del contenitore. Se non si specifica il nome host, per impostazione predefinita viene specificato l'ID contenitore, ovvero un GUID di sistema generato in modo casuale.
    -d Eseguire il contenitore in background (daemon)
    mcr.microsoft.com/mssql/server:2017-latest Immagine del contenitore di SQL Server 2017 su Linux.
  3. Per visualizzare i contenitori di Docker, usare il comando docker ps.

    sudo docker ps -a
    
    docker ps -a
    
    docker ps -a
    

    L'output risultante dovrebbe essere simile allo screenshot seguente:

    Docker ps command output

  4. Se nella colonna STATUS è impostato lo statoUp, SQL Server è in esecuzione nel contenitore e in ascolto sulla porta specificata nella colonna PORTS. Se la colonna STATUS del contenitore di SQL Server è impostata su Exited, vedere la sezione relativa alla risoluzione dei problemi della guida alla configurazione. Sarà pronto per la connessione, quando i log degli errori di SQL Server visualizzano il messaggio: SQL Server is now ready for client connections. This is an informational message; no user action is required. È possibile esaminare il log degli errori SQL Server all'interno del contenitore usando il comando :

    docker exec -t sql1 cat /var/opt/mssql/log/errorlog | grep connection
    

Il --hostname parametro, come illustrato in precedenza, modifica il nome interno del contenitore in un valore personalizzato. È il nome che viene restituito nella query Transact-SQL seguente:

SELECT @@SERVERNAME,
    SERVERPROPERTY('ComputerNamePhysicalNetBIOS'),
    SERVERPROPERTY('MachineName'),
    SERVERPROPERTY('ServerName')

L'impostazione di --hostname e --name sullo stesso valore è un buon modo per identificare facilmente il contenitore di destinazione.

  1. Come passaggio finale, cambiare la password dell'amministratore di sistema, perché il valore di SA_PASSWORD è visibile nell'output di ps -eax e viene archiviato nella variabile di ambiente con lo stesso nome. Vedere i passaggi seguenti.

Eseguire il pull dell'immagine del contenitore 2019 ed eseguirla

Prima di iniziare i passaggi seguenti, assicurarsi di aver selezionato la shell preferita (bash, PowerShell o cmd) nella parte superiore di questo articolo.

  1. Eseguire il pull dell'immagine del contenitore di SQL Server 2019 in Linux dal Registro Container Microsoft.

    sudo docker pull mcr.microsoft.com/mssql/server:2019-latest
    

    Nota

    Se si usa PowerShell Core, sostituire le virgolette doppie con virgolette singole.

    docker pull mcr.microsoft.com/mssql/server:2019-latest
    
    docker pull mcr.microsoft.com/mssql/server:2019-latest
    

    Suggerimento

    Questa guida di avvio rapido usa l'immagine Docker di SQL Server 2019. Se si vuole eseguire l'immagine di SQL Server 2017, vedere la versione di questo articolo relativa a SQL Server 2017.

    Il comando precedente esegue il pull dell'immagine del contenitore di SQL Server 2019 basata su Ubuntu. Per usare invece immagini del contenitore basate su RedHat, vedere Eseguire immagini del contenitore basate su RHEL. Per vedere tutte le immagini disponibili, vedere la pagina mssql-server-linux dell'hub Docker.

    Per i comandi Bash in questo articolo, si usa sudo. Se non si vuole usare sudo per eseguire Docker, è possibile configurare un gruppo Docker e aggiungere utenti a tale gruppo. Per altre informazioni, vedere Post-installation steps for Linux (Passaggi post-installazione per Linux).

  2. Per eseguire l'immagine del contenitore con Docker, è possibile usare il comando seguente da una shell bash o da un prompt dei comandi di PowerShell con privilegi elevati.

    sudo docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=<YourStrong@Passw0rd>" \
       -p 1433:1433 --name sql1 --hostname sql1 \
       -d mcr.microsoft.com/mssql/server:2019-latest
    
    docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=<YourStrong@Passw0rd>" `
       -p 1433:1433 --name sql1 --hostname sql1 `
       -d mcr.microsoft.com/mssql/server:2019-latest
    
    docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=<YourStrong@Passw0rd>" `
       -p 1433:1433 --name sql1 --hostname sql1 `
       -d mcr.microsoft.com/mssql/server:2019-latest
    

    Nota

    La password deve essere conforme ai criteri password predefiniti di SQL Server, altrimenti il contenitore non potrà configurare SQL Server e smetterà di funzionare. Per impostazione predefinita, la password deve contenere almeno 8 caratteri, appartenenti a tre dei quattro set seguenti: lettere maiuscole, lettere minuscole, cifre in base 10 e simboli. È possibile esaminare il log degli errori eseguendo il comando docker logs.

    Per impostazione predefinita, viene creato un contenitore con l'edizione Developer di SQL Server 2019.

    La tabella seguente offre una descrizione dei parametri dell'esempio docker run precedente:

    Parametro Descrizione
    -e "ACCEPT_EULA=Y" Impostare la variabile ACCEPT_EULA su qualsiasi valore per confermare l'accettazione del contratto di licenza End-User. Impostazione obbligatoria per l'immagine di SQL Server.
    -e "SA_PASSWORD=<YourStrong@Passw0rd>" Specificare una password complessa che sia di almeno otto caratteri e soddisfi i requisiti SQL Server password. Impostazione obbligatoria per l'immagine di SQL Server.
    -p 1433:1433 Eseguire il mapping di una porta TCP nell'ambiente host (primo valore) con una porta TCP nel contenitore (secondo valore). In questo esempio SQL Server è in ascolto sulla porta TCP 1433 nel contenitore e questo è esposto alla porta 1433 nell'host.
    --name sql1 Specificare un nome personalizzato per il contenitore, invece di un nome generato in modo casuale. Se si eseguono più contenitori, non è possibile riutilizzare lo stesso nome.
    --hostname sql1 Usato per impostare in modo esplicito il nome host del contenitore. Se non si specifica il nome host, per impostazione predefinita viene specificato l'ID contenitore, ovvero un GUID di sistema generato in modo casuale.
    mcr.microsoft.com/mssql/server:2019-latest Immagine del contenitore di SQL Server 2019 su Ubuntu Linux.
  3. Per visualizzare i contenitori di Docker, usare il comando docker ps.

    sudo docker ps -a
    
    docker ps -a
    
    docker ps -a
    

    L'output risultante dovrebbe essere simile allo screenshot seguente:

    Docker ps command output

  4. Se nella colonna STATUS è impostato lo statoUp, SQL Server è in esecuzione nel contenitore e in ascolto sulla porta specificata nella colonna PORTS. Se la colonna STATUS del contenitore di SQL Server è impostata su Exited, vedere la sezione relativa alla risoluzione dei problemi della guida alla configurazione. Sarà pronto per la connessione, quando i log degli errori di SQL Server visualizzano il messaggio: SQL Server is now ready for client connections. This is an informational message; no user action is required. È possibile esaminare il log degli errori SQL Server all'interno del contenitore usando il comando :

    docker exec -t sql1 cat /var/opt/mssql/log/errorlog | grep connection
    

Il --hostname parametro, come illustrato in precedenza, modifica il nome interno del contenitore in un valore personalizzato. Cambia il nome interno del contenitore sostituendolo con un valore personalizzato. È il nome che viene restituito nella query Transact-SQL seguente:

SELECT @@SERVERNAME,
    SERVERPROPERTY('ComputerNamePhysicalNetBIOS'),
    SERVERPROPERTY('MachineName'),
    SERVERPROPERTY('ServerName')

L'impostazione di -h e --name sullo stesso valore è un buon modo per identificare facilmente il contenitore di destinazione.

  1. Come passaggio finale, cambiare la password dell'amministratore di sistema, perché il valore di SA_PASSWORD è visibile nell'output di ps -eax e viene archiviato nella variabile di ambiente con lo stesso nome. Vedere i passaggi seguenti.

Cambiare la password dell'amministratore di sistema

L'account SA è un amministratore di sistema dell'istanza di SQL Server creato durante l'installazione. Dopo aver creato il contenitore SQL Server, la variabile di ambiente SA_PASSWORD specificata diventa individuabile eseguendo echo $SA_PASSWORD nel contenitore. Per motivi di sicurezza, modificare la password dell'amministratore di sistema.

  1. Scegliere una password complessa da usare per l'utente SA.

  2. Usare docker exec per eseguire sqlcmd per modificare la password usando Transact-SQL. Nell'esempio seguente le password precedenti e nuove vengono lette dall'input dell'utente.

    sudo docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd \
    -S localhost -U SA \
     -P "$(read -sp "Enter current SA password: "; echo "${REPLY}")" \
     -Q "ALTER LOGIN SA WITH PASSWORD=\"$(read -sp "Enter new SA password: "; echo "${REPLY}")\""
    
    
  1. Scegliere una password complessa da usare per l'utente SA.

  2. Nell'esempio seguente sostituire la vecchia password, <YourStrong@Passw0rd>, e la nuova password, <YourNewStrong@Passw0rd>, con le password personali.

    docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd `
       -S localhost -U SA -P "<YourStrong@Passw0rd>" `
       -Q "ALTER LOGIN SA WITH PASSWORD='<YourNewStrong@Passw0rd>'"
    
  1. Scegliere una password complessa da usare per l'utente SA.

  2. Nell'esempio seguente sostituire la vecchia password, <YourStrong@Passw0rd>, e la nuova password, <YourNewStrong@Passw0rd>, con le password personali.

    docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd `
       -S localhost -U SA -P "<YourStrong@Passw0rd>" `
       -Q "ALTER LOGIN SA WITH PASSWORD='<YourNewStrong@Passw0rd>'"
    

Connessione a SQL Server

La procedura seguente usa lo strumento da riga di comando di SQL Server, sqlcmd, all'interno del contenitore per stabilire la connessione a SQL Server.

  1. Usare il comando docker exec -it per avviare una shell Bash interattiva all'interno del contenitore in esecuzione. Nell'esempio seguente sql1 è il nome specificato dal parametro --namequando è stato creato il contenitore.

    sudo docker exec -it sql1 "bash"
    
    docker exec -it sql1 "bash"
    
    docker exec -it sql1 "bash"
    
  2. Una volta all'interno del contenitore, connettersi in locale con sqlcmd, usando il percorso completo.

    /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "<YourNewStrong@Passw0rd>"
    

    Suggerimento

    È possibile omettere la password nella riga di comanda perché sia richiesto di essere immessa.

  3. Se la connessione viene eseguita correttamente, il prompt dei comandi sqlcmd sarà: 1>.

Creare i dati e recuperarli tramite query

Nelle sezioni seguenti viene descritto l'uso di sqlcmd e Transact-SQL per creare un nuovo database, aggiungere dati ed eseguire una query.

Creare un nuovo database

La seguente procedura consente di creare un nuovo database denominato TestDB.

  1. Dal prompt dei comandi sqlcmd incollare il comando seguente di Transact-SQL per creare un database di test:

    CREATE DATABASE TestDB
    
  2. Nella riga successiva scrivere una query perché vengano restituiti i nomi di tutti database nel server:

    SELECT Name from sys.Databases
    
  3. I due comandi precedenti non sono stati eseguiti immediatamente. Digitare GO in una nuova riga per eseguire i comandi precedenti:

    GO
    

Inserire i dati

Creare poi una nuova tabella Inventory e inserire due nuove righe.

  1. Dal prompt dei comandi sqlcmd spostare il contesto nel nuovo database TestDB:

    USE TestDB
    
  2. Creare una nuova tabella denominata Inventory:

    CREATE TABLE Inventory (id INT, name NVARCHAR(50), quantity INT)
    
  3. Inserire i dati nella nuova tabella:

    INSERT INTO Inventory VALUES (1, 'banana', 150); INSERT INTO Inventory VALUES (2, 'orange', 154);
    
  4. Digitare GO per eseguire i comandi precedenti:

    GO
    

Selezionare i dati

A questo punto, eseguire una query per restituire i dati dalla tabella Inventory.

  1. Dal prompt dei comandi sqlcmd immettere una query che restituisca le righe dalla tabella Inventory che ne contiene oltre 152:

    SELECT * FROM Inventory WHERE quantity > 152;
    
  2. Eseguire il comando seguente:

    GO
    

Uscire dal prompt dei comandi sqlcmd

  1. Per terminare la sessione sqlcmd, digitare QUIT:

    QUIT
    
  2. Per uscire dal prompt dei comandi interattivo nel contenitore, digitare exit. Dopo la chiusura della shell Bash interattiva, il contenitore continua l'esecuzione.

Eseguire la connessione dall'esterno del contenitore

È anche 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.

La procedura seguente usa sqlcmd all'esterno del contenitore per stabilire la connessione a SQL Server in esecuzione nel contenitore. Questa procedura presuppone che gli strumenti da riga di comando di SQL Server siano già installati all'esterno del contenitore. Gli stessi principi valgono quando si usano altri strumenti, ma il processo di connessione è specifico di ogni strumento.

  1. Trovare l'indirizzo IP per il computer host del contenitore usando ifconfig o ip addr.

  2. Per questo esempio, installare lo strumento sqlcmd nel computer client. Per altre informazioni, vedere Installare sqlcmd in Windows o Installare sqlcmd in Linux.

  3. Eseguire sqlcmd specificando l'indirizzo IP e la porta mappata alla porta 1433 nel contenitore. In questo esempio si tratta della stessa porta, la 1433, nel computer host. Se si è specificata una porta con mapping diverso nel computer host, è possibile usarla qui. È anche necessario aprire la porta in ingresso appropriata nel firewall per consentire la connessione.

    sqlcmd -S <ip_address>,1433 -U SA -P "<YourNewStrong@Passw0rd>"
    
    sqlcmd -S <ip_address>,1433 -U SA -P "<YourNewStrong@Passw0rd>"
    
    sqlcmd -S <ip_address>,1433 -U SA -P "<YourNewStrong@Passw0rd>"
    
  4. Eseguire i comandi Transact-SQL. Al termine, digitare QUIT.

Altri strumenti usati comunemente per connettersi a SQL Server sono:

Rimuovere il contenitore

Se si vuole rimuovere il contenitore di SQL Server usato in questa esercitazione, eseguire i comandi seguenti:

sudo docker stop sql1
sudo docker rm sql1
docker stop sql1
docker rm sql1
docker stop sql1
docker rm sql1

Avviso

Se si arresta e si rimuove un contenitore, i dati di SQL Server eventualmente presenti nel contenitore vengono eliminati in modo definitivo. Se occorre conservare i dati, creare un file di backup e copiarlo all'esterno del contenitore oppure usare una tecnica di persistenza dei dati del contenitore.

Demo di Docker

Se, dopo aver provato a usare l'immagine del contenitore di SQL Server per Docker, si vuole sapere come si può usare questo strumento per migliorare le attività di sviluppo e test, il video seguente illustra l'uso di Docker in uno scenario di integrazione continua e distribuzione.

Passaggi successivi

Per un'esercitazione sul ripristino dei file di backup di database in un contenitore, vedere Restore a SQL Server database in a Linux Docker container (Ripristinare un database di SQL Server in un contenitore Docker Linux). Esplorare altri scenari, ad esempio l'esecuzione di più contenitori, la persistenza dei dati e la risoluzione dei problemi.

Nel repository GitHub mssql-docker sono inoltre disponibili risorse, feedback e documentazione su problemi noti.