Configurare e personalizzare contenitori Linux di SQL Server
Si applica a: SQL Server - Linux
Questo articolo illustra come configurare e personalizzare i contenitori Linux di SQL Server usando Docker. È possibile rendere persistenti i dati, spostare i file da e verso i contenitori e modificare le impostazioni predefinite.
Suggerimento
È possibile usare sqlcmd (Go) per creare una nuova istanza di SQL Server in un contenitore a scopo di sviluppo. Per altre informazioni, vedere Creare ed eseguire query su un contenitore di SQL Server.
Creare un contenitore personalizzato
È possibile creare il proprio Dockerfile per creare un contenitore di SQL Server personalizzato. Per altre informazioni, vedere una demo che combina SQL Server e un'applicazione Node. Se si crea un Dockerfile personalizzato, tenere conto del processo in primo piano, perché questo processo controlla la durata del contenitore. Se viene chiuso, il contenitore verrà arrestato. Ad esempio, se si vuole eseguire uno script e avviare SQL Server, assicurarsi che il processo di SQL Server sia il comando più a destra. Tutti gli altri comandi vengono eseguiti in background. Il comando seguente illustra questa operazione all'interno di un Dockerfile:
/usr/src/app/do-my-sql-commands.sh & /opt/mssql/bin/sqlservr
Se si invertissero i comandi nell'esempio precedente, il contenitore verrebbe arrestato al termine dello script do-my-sql-commands.sh.
Rendere persistenti i dati
Le modifiche apportate alla configurazione del SQL Server e i file di database vengono salvati in modo permanente nel contenitore anche se il contenitore viene riavviato con docker stop
e docker start
. Tuttavia, se si rimuove il contenitore con docker rm
viene eliminato tutto il contenuto al suo interno, inclusi SQL Server e i database. La sezione seguente illustra come usare i volumi di dati per rendere persistenti i file di database anche se vengono eliminati i contenitori associati.
Importante
Per SQL Server è fondamentale comprendere la persistenza dei dati in Docker. Oltre alle informazioni in questa sezione, vedere la documentazione di Docker su come gestire i dati nei contenitori Docker.
Montare una directory host come volume di dati
La prima opzione consiste nel montare una directory nell'host come volume di dati nel contenitore. A tale scopo, usare il comando docker run
con il flag -v <host directory>:/var/opt/mssql
, dove <host directory>
è qualsiasi percorso specificato. Ad esempio: C:\SQL
in Windows o ~/sqlvolumes
in Linux. In questo modo è possibile ripristinare i dati tra le esecuzioni dei contenitori.
Nota
I contenitori di SQL Server 2019 (15.x) e versioni successive vengono avviati automaticamente come contenitori non root, mentre i contenitori di SQL Server 2017 (14.x) vengono avviati come contenitori root per impostazione predefinita. Per altre informazioni sull'esecuzione di contenitori SQL Server come contenitori non root, vedere Configurare contenitori Linux di SQL Server.
Importante
La variabile di ambiente SA_PASSWORD
è deprecata. Utilizzare invece 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
Questa tecnica consente anche di condividere e visualizzare i file nell'host all'esterno di Docker.
Usare i contenitori di volumi di dati
La seconda opzione consiste nell'usare un contenitore di volumi di dati. È possibile creare un contenitore di volumi di dati specificando un nome di volume anziché una directory host con il parametro -v
. Nell'esempio seguente viene creato un volume di dati condiviso denominato 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
Questa tecnica per la creazione implicita di un volume di dati nel comando run non funziona con le versioni precedenti di Docker. In tal caso, usare i passaggi espliciti descritti nella documentazione di Docker, in Creating and mounting a data volume container (Creazione e montaggio di un contenitore di volumi di dati).
Anche se si arresta e rimuove il contenitore, il volume di dati è persistente. È possibile visualizzarlo con il comando docker volume ls
.
docker volume ls
Se successivamente si crea un altro contenitore con lo stesso nome di volume, il nuovo contenitore userà gli stessi dati di SQL Server contenuti nel volume.
Per rimuovere un contenitore di volumi di dati, usare il comando docker volume rm
.
Avviso
Se si elimina il contenitore del volume di dati, tutti i dati di SQL Server nel contenitore verranno eliminati definitivamente.
Backup e ripristino
Oltre a queste tecniche con i contenitori, è anche possibile usare le tecniche standard di backup e ripristino di SQL Server. È possibile usare i file di backup per proteggere i dati o per spostare i dati in un'altra istanza di SQL Server. Per altre informazioni, vedere Backup e ripristino di database di SQL Server in Linux.
Avviso
Se si creano backup, assicurarsi di creare o copiare i file di backup all'esterno del contenitore. In caso contrario, se il contenitore viene rimosso, vengono eliminati anche i file di backup.
Abilitare il backup e il ripristino VDI nei contenitori
Le operazioni di backup e ripristino dell’interfaccia del dispositivo virtuale (VDI) sono ora supportate nelle distribuzioni di contenitori di SQL Server a partire dalle versioni CU15 per SQL Server 2019 (15.x) e CU28 per SQL Server 2017 (14.x). Seguire questa procedura per abilitare le operazioni di backup o ripristino basate su VDI per i contenitori di SQL Server:
Per distribuire contenitori di SQL Server, usare l'opzione
--shm-size
. Per iniziare, impostare il dimensionamento su 1 GB, come illustrato nel comando seguente: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
L'opzione
--shm-size
consente di configurare le dimensioni della directory di memoria condivisa (/dev/shm
) all'interno del contenitore, che per impostazione predefinita sono pari a 64 MB. Queste dimensioni predefinite della memoria condivisa non sono sufficienti per supportare i backup VDI. È consigliabile configurare queste dimensioni su un minimo di 1 GB quando si distribuiscono contenitori di SQL Server e si vogliono supportare i backup VDI.È anche necessario abilitare il nuovo parametro
memory.enablecontainersharedmemory
inmssql.conf
all'interno del contenitore. È possibile montaremssql.conf
al momento della distribuzione del contenitore usando l'opzione-v
descritta nella sezione Rendere persistenti i dati oppure dopo aver distribuito il contenitore aggiornando manualmentemssql.conf
all'interno del contenitore. Ecco un filemssql.conf
di esempio con l'impostazionememory.enablecontainersharedmemory
impostata sutrue
.[memory] enablecontainersharedmemory = true
Copiare file da un contenitore
Per copiare un file dal contenitore, usare il comando seguente:
docker cp <Container ID>:<Container path> <host path>
È possibile ottenere l'ID del contenitore eseguendo il comando docker ps -a
.
Esempio:
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
Copiare file in un contenitore
Per copiare un file nel contenitore, usare il comando seguente:
docker cp <Host path> <Container ID>:<Container path>
Esempio:
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
Configurare il fuso orario
Per eseguire SQL Server in un contenitore Linux con un fuso orario specifico, configurare la variabile di ambiente TZ
(per altre informazioni, vedere Configurare il fuso orario per SQL Server 2022 in Linux). Per trovare il valore del fuso orario corretto, eseguire il comando tzselect
da un prompt di Bash per Linux:
tzselect
Dopo la selezione del fuso orario, tzselect
visualizza un output simile al seguente:
The following information has been given:
United States
Pacific
Therefore TZ='America/Los_Angeles' will be used.
È possibile usare queste informazioni per impostare la stessa variabile di ambiente nel contenitore Linux. L'esempio seguente mostra come eseguire SQL Server in un contenitore nel fuso orario 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
Modificare il percorso tempdb
È consigliabile tenere il database tempdb
separato dai database utente.
Connettersi all'istanza di SQL Server e quindi eseguire lo script Transact-SQL (T-SQL) seguente. Se sono presenti più file associati a
tempdb
, sarà necessario spostare anche quelli.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
Verificare che il percorso del file
tempdb
sia stato modificato usando lo script T-SQL seguente:SELECT * FROM sys.sysaltfiles WHERE dbid = 2;
Riavviare il contenitore di SQL Server per applicare le modifiche.
docker stop sql1 docker start sql1
docker stop sql1 docker start sql1
docker stop sql1 docker start sql1
Aprire una sessione
bash
interattiva per connettersi al contenitore.docker exec -it sql1 bash
docker exec -it sql1 bash
docker exec -it sql1 bash
Una volta stabilita la connessione alla shell interattiva, eseguire il comando seguente per controllare il percorso di
tempdb
:ls /var/opt/mssql/tempdb/
Se lo spostamento è riuscito, verrà visualizzato un output simile al seguente:
tempdb.mdf templog.ldf
Modificare il percorso predefinito del file
Aggiungere la variabile MSSQL_DATA_DIR
per modificare la directory dei dati nel comando docker run
, quindi montare un volume in quel percorso a cui ha accesso l'utente del contenitore.
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
Usare mssql-config per configurare SQL Server all'interno di un contenitore
È possibile usare lo strumento mssql-conf per impostare i parametri nei contenitori di SQL Server.
Ad esempio, è possibile impostare un limite di memoria per l'istanza seguendo questa procedura:
Connettersi direttamente al contenitore usando
docker exec
come utente root. Sostituiresqlcontainer
con il nome del contenitore.docker exec -u root -it sqlcontainer "bash"
Usare mssql-conf per modificare un'impostazione. In questo esempio viene modificata l'impostazione
memory.memorylimitmb
su 2 GB (2.048 MB)./opt/mssql/bin/mssql-conf set memory.memorylimitmb 2048
Esempi di contenitori Docker personalizzati
Per esempi di contenitori Docker personalizzati, vedere https://github.com/microsoft/mssql-docker/tree/master/linux/preview/examples. Tra gli esempi sono inclusi:
- Esempio di Dockerfile con ricerca full-text
- Esempio di Dockerfile per RHEL 7 e SQL Server 2019
- Esempio di Dockerfile per RHEL 8 e SQL Server 2017
- Esempio di Dockerfile per Ubuntu 20.04 e SQL Server 2019 con ricerca full-text, PolyBase e strumenti
Per informazioni su come compilare ed eseguire contenitori Docker mediante Dockerfile, vedere Esempi di servizi ML su GitHub.
Contenuto correlato
- Per informazioni introduttive sull'uso delle immagini del contenitore di SQL Server 2017 (14.x) in Docker, vedere questo articolo di avvio rapido
- Per informazioni introduttive sull'uso delle immagini del contenitore di SQL Server 2019 (15.x) in Docker, vedere questo articolo di avvio rapido
- Per informazioni introduttive sull'uso delle immagini del contenitore di SQL Server 2022 (16.x) in Docker, vedere questo articolo di avvio rapido
Contribuire alla documentazione di SQL
Il contenuto SQL può essere modificato. L'autore delle modifiche contribuirà a migliorare la documentazione e verrà accreditato come collaboratore alla realizzazione della pagina.
Per maggiori informazioni, vedere Come contribuire alla documentazione di SQL Server