Container

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

Photo by Paul Teysen on Unsplash

Eseguire SQL Server in Docker
Tag: