
Eseguire SQL Server in Docker
Una delle cose che apprezzo di più della virtualizzazione con Docker, è la possibilità di creare ambiente di sviluppo e test ordinati e replicabili con pochissimo sforzo, senza dover installare nulla.
Inoltre, lavorando su progetti e stack diversi, è spesso necessario che nella macchina di sviluppo convivano versioni diverse dello stesso servizio o dello stesso database server, cosa che diventa quasi impossibile installando direttamente tali prodotti.
Docker di fatto risolve tutti questi problemi, e anche tirare su un database server di classe enterprise come Microsoft SQL Server è semplice come digitare questo comando nella shell:
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password_sa>" -p 1433:1433 --name sql-2022 --hostname sql-2022 -v /mnt/c/SqlServerData:/var/opt/mssql/data -u root -d mcr.microsoft.com/mssql/server:2022-latest
Questo comando chiede a Docker di:
- Utilizzare un’immagine di SQL Server 2022 ultima versione
- Eseguire il database server con il nome host “sql-2022”
- Impostare la password dell’utente SA
- Montare una cartella locale come volume persistente per ospitare i file dei database creati
In pochi istanti avrete tutto pronto per iniziare a lavorare sul database server.

È anche possibile creare un file YAML docker-compose per evitare ogni volta di dover inserire un comando così lungo, per orchestrare il database con altri container o per inserire configurazioni più raffinate:
version: '3.9'
services:
sql-2022:
container_name: sql-2022
hostname: sql-2022
image: mcr.microsoft.com/mssql/server:2022-latest
user: root
volumes:
- /mnt/c/SqlServerData/data:/var/opt/mssql/data
- /mnt/c/SqlServerLog:/var/opt/mssql/log
- /mnt/c/SqlServerSecrets:/var/opt/mssql/secrets
ports:
- 1433:1433
environment:
- ACCEPT_EULA=Y
- MSSQL_SA_PASSWORD=<password>
- MSSQL_PID=Express
restart: unless-stopped
healthcheck:
test:
[
"CMD-SHELL",
"/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P <password> -Q 'SELECT 1' || exit 1"
]
interval: 10s
retries: 10
start_period: 10s
timeout: 3s
Il file YAML così creato è eseguibile in maniera molto più semplice inserendo da shell il seguente comando:
docker-compose -f file.yml up
In aggiunta a quanto visto per il comando diretto, in questo esempio docker-compose ho aggiunto:
- La mappatura dei volumi per ospitare i log e i secrets
- Il riavvio automatico del server (se dovesse crashare o riavviarsi per qualsiasi motivo)
- L’utilizzo della versione Express di SQL Server 2022
- Un controllo healtcheck per permettere a docker-compose di valutare lo stato di salute del container, e intraprendere azioni qualora sia degradato

In questo caso specifico il controllo healtcheck utilizza l’utility sqlcmd per lanciare una semplicissima query ad intervalli regolari di 10 secondi; nella colonna Status dei processi Docker attivi è ora visualizzato anche lo stato di salute del container, e non solo l’uptime/downtime.
Approfondimenti
- Quickstart: Run SQL Server Linux container images with Docker (learn.microsoft.com)
- Configure and customize SQL Server Docker containers (learn.microsoft.com)
- Restore a SQL Server database in a Linux container (learn.microsoft.com)
- Docker Compose file version 3 reference – HEALTCHECK (docs.docker.com)
- Microsoft SQL Server – Ubuntu based images (mcr.microsoft.com)
Photo by Paul Teysen on Unsplash