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