Configurer et personnaliser les conteneurs Linux de SQL Server

S’applique à : SQL Server - Linux

Cet article explique comment configurer et personnaliser des conteneurs Linux SQL Server à l’aide de Docker. Vous pouvez conserver vos données, déplacer des fichiers depuis et vers des conteneurs, et modifier les paramètres par défaut.

Conseil

Vous pouvez utiliser sqlcmd (Go) pour créer une instance de SQL Server dans un conteneur à des fins de développement. Pour plus d’informations, consultez Créer et interroger un conteneur SQL Server.

Créer un conteneur personnalisé

Vous pouvez créer votre propre Dockerfile pour créer un conteneur SQL Server personnalisé. Pour plus d’informations, consultez une démonstration qui associe SQL Server et une application Node. Si vous créez votre propre Dockerfile, tenez compte du processus de premier plan, car ce processus contrôle la durée de vie du conteneur. S’il se termine, le conteneur s’arrête. Par exemple, si vous souhaitez exécuter un script et démarrer SQL Server, assurez-vous que le processus SQL Server est la commande la plus à droite. Toutes les autres commandes sont exécutées en arrière-plan. La commande suivante illustre cela à l’intérieur d’un fichier Dockerfile :

/usr/src/app/do-my-sql-commands.sh & /opt/mssql/bin/sqlservr

Si vous avez inversé les commandes dans l’exemple précédent, le conteneur s’arrêtera à la fin du script do-my-sql-commands.sh.

Rendre vos données persistantes

Vos modifications de configuration et fichiers de base de données SQL Server sont conservés dans le conteneur même si vous redémarrez le conteneur avec docker stop et docker start. Toutefois, si vous supprimez le conteneur avec docker rm, tout ce qui se trouve dans le conteneur est supprimé, y compris SQL Server et vos bases de données. La section suivante explique comment utiliser des volumes de données pour conserver les fichiers de votre base de données même si les conteneurs associés sont supprimés.

Important

Par SQL Server, il est essentiel que vous compreniez la persistance des données dans Docker. En plus de la discussion de cette section, consultez la documentation de Docker pour savoir comment gérer les données dans les conteneurs Docker.

Monter un répertoire hôte en tant que volume de données

La première option consiste à monter un répertoire sur votre hôte en tant que volume de données dans votre conteneur. Pour ce faire, utilisez la commande docker run avec l’indicateur -v <host directory>:/var/opt/mssql, où <host directory> correspond à un chemin d’accès donné. Par exemple : C:\SQL sur Windows ou ~/sqlvolumes sur Linux. Cela permet de restaurer les données entre les exécutions de conteneur.

Notes

Les conteneurs SQL Server 2019 (15.x) et versions ultérieures démarrent automatiquement avec un compte non racine, contrairement aux conteneurs SQL Server 2017 (14.x) qui démarrent par défaut en tant qu’utilisateur racine. Pour plus d’informations sur l’exécution de conteneurs SQL Server avec un compte non racine, consultez Configuration de la sécurité.

Important

La variable d’environnement SA_PASSWORD est dépréciée. Utilisez MSSQL_SA_PASSWORD à la place.

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

Cette technique vous permet également de partager et d’afficher les fichiers sur l’ordinateur hôte en dehors de Docker.

Utiliser des conteneurs de volume de données

La deuxième option consiste à utiliser un conteneur de volume de données. Vous pouvez créer un conteneur de volume de données en spécifiant un nom de volume à la place d’un répertoire hôte avec le paramètre -v. L’exemple suivant crée un volume de données partagé nommé 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

Remarque

Cette technique pour la création implicite d’un volume de données dans la commande d’exécution ne fonctionne pas avec les versions antérieures de Docker. Dans ce cas, utilisez les étapes explicites décrites dans la documentation de Docker, Création et montage d’un conteneur de volume de données.

Même si vous arrêtez et supprimez ce conteneur, le volume de données persiste. Vous pouvez l’afficher avec la commande docker volume ls.

docker volume ls

Si vous créez ensuite un autre conteneur avec le même nom de volume, le nouveau conteneur utilise les mêmes données SQL Server contenues dans le volume.

Pour supprimer un conteneur de volume de données, utilisez la commande docker volume rm.

Avertissement

Si vous supprimez le conteneur de volume de données, toutes les données de SQL Server dans le conteneur sont définitivement supprimées.

Sauvegarde et restauration

Outre ces techniques de conteneur, vous pouvez également utiliser des techniques de sauvegarde et de restauration SQL Server standard. Vous pouvez utiliser des fichiers de sauvegarde pour protéger vos données ou déplacer les données vers une autre instance de SQL Server. Pour plus d’informations, consultez Sauvegarder et restaurer des bases de données SQL Server sur Linux.

Avertissement

Si vous créez des sauvegardes, assurez-vous de créer ou de copier les fichiers de sauvegarde en dehors du conteneur. Dans le cas contraire, si le conteneur est supprimé, les fichiers de sauvegarde sont également supprimés.

Activer la sauvegarde et la restauration VDI dans les conteneurs

Les opérations de sauvegarde et restauration de l'interface de dispositif virtuel (VDI) sont désormais prises en charge dans les déploiements de conteneurs SQL Server à partir de CU15 pour SQL Server 2019 (15.x) et CU28 pour SQL Server 2017 (14.x). Suivez ces étapes pour activer la sauvegarde ou la restauration basée sur VDI pour les conteneurs SQL Server :

  1. Lors du déploiement de conteneurs SQL Server, utilisez l'option --shm-size. Pour commencer, définissez le dimensionnement à 1 Go, comme indiqué dans la commande suivante :

    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'option --shm-size vous permet de configurer la taille du répertoire de mémoire partagée (/dev/shm) à l'intérieur du conteneur, qui est fixée à 64 Mo par défaut. Cette taille par défaut de la mémoire partagée est insuffisante pour prendre en charge les sauvegardes VDI. Nous vous recommandons de configurer cette valeur à 1 Go minimum lorsque vous déployez des conteneurs SQL Server et souhaitez prendre en charge les sauvegardes VDI.

  2. Vous devez également activer le nouveau paramètre memory.enablecontainersharedmemory dans mssql.conf à l'intérieur du conteneur. Vous pouvez monter mssql.conf au moment du déploiement du conteneur en utilisant l'option -v comme décrit dans la section Persister vos données, ou après avoir déployé le conteneur en mettant à jour manuellement mssql.conf à l'intérieur du conteneur. Voici un exemple de fichier mssql.conf avec le paramètre memory.enablecontainersharedmemory réglé sur true.

    [memory]
    enablecontainersharedmemory = true
    

Copier des fichiers à partir d’un conteneur

Pour copier un fichier hors du conteneur, utilisez la commande suivante :

docker cp <Container ID>:<Container path> <host path>

Vous pouvez obtenir l’ID du conteneur en exécutant la commande docker ps -a.

Exemple :

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

Copier des fichiers dans un conteneur

Pour copier un fichier dans le conteneur, utilisez la commande suivante :

docker cp <Host path> <Container ID>:<Container path>

Exemple :

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

Configurer le fuseau horaire

Pour exécuter SQL Server dans un conteneur Linux avec un fuseau horaire spécifique, configurez la variable d’environnement TZ (Pour plus d’informations, consultez Configurer le fuseau horaire pour SQL Server 2022 sur Linux). Pour trouver la valeur de fuseau horaire appropriée, exécutez la commande tzselect à partir d’une invite Bash Linux :

tzselect

Après avoir sélectionné le fuseau horaire, tzselect affiche une sortie similaire à l’exemple suivant :

The following information has been given:

    United States
    Pacific

Therefore TZ='America/Los_Angeles' will be used.

Vous pouvez utiliser ces informations pour définir la même variable d’environnement dans votre conteneur Linux. L’exemple suivant montre comment exécuter SQL Server dans un conteneur dans le fuseau horaire 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

Modifier le chemin d’accès tempdb

Il est recommandé de séparer votre base de données tempdb de vos bases de données utilisateur.

  1. Connectez-vous à l’instance SQL Server, puis exécutez le script Transact-SQL (T-SQL) suivant. Si d'autres fichiers sont associés à tempdb, vous devez également les déplacer.

    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
    
  2. Vérifiez que l’emplacement du fichier tempdb a été modifié à l’aide du script T-SQL suivant :

    SELECT *
    FROM sys.sysaltfiles
    WHERE dbid = 2;
    
  3. Vous devez redémarrer le conteneur SQL Server pour que ces modifications prennent effet.

    docker stop sql1
    docker start sql1
    
    docker stop sql1
    docker start sql1
    
    docker stop sql1
    docker start sql1
    
  4. Ouvrez une session bash interactive pour vous connecter au conteneur.

    docker exec -it sql1 bash
    
    docker exec -it sql1 bash
    
    docker exec -it sql1 bash
    

    Une fois connecté à l’interpréteur de commandes interactif, exécutez la commande suivante pour vérifier l’emplacement de tempdb :

    ls /var/opt/mssql/tempdb/
    

    Si le déplacement a réussi, vous verrez une sortie similaire :

    tempdb.mdf templog.ldf
    

Modifier l’emplacement des fichiers par défaut

Ajoutez la variable MSSQL_DATA_DIR pour modifier votre répertoire de données dans votre commande docker run, puis montez un volume à cet emplacement auquel l’utilisateur de votre conteneur a accès.

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

Utiliser mssql-config pour configurer SQL Server à l’intérieur d’un conteneur

Vous pouvez utiliser le mssql-conf pour définir des paramètres dans des conteneurs SQL Server.

Par exemple, vous pouvez définir une limite de mémoire pour l’instance en procédant comme suit :

  1. Connectez-vous directement au conteneur en utilisant docker exec en tant qu'utilisateur racine. Remplacez sqlcontainer par le nom de votre conteneur.

    docker exec -u root -it sqlcontainer "bash"
    
  2. Utilisez mssql-conf pour modifier un paramètre. Cet exemple montre comment modifier le paramètre memory.memorylimitmb sur 2 Go (2 048 Mo).

    /opt/mssql/bin/mssql-conf set memory.memorylimitmb 2048
    

Exemples de conteneurs Docker personnalisés

Exemples de conteneurs Docker personnalisés, consultez https://github.com/microsoft/mssql-docker/tree/master/linux/preview/examples. Il s’agit des scénarios suivants :

Pour plus d'informations sur la construction et l'exécution de conteneurs Docker à l'aide de Dockerfiles, consultez les exemples ML Services sur GitHub.

  • Bien démarrer avec les images conteneur SQL Server 2017 (14.x) sur Docker en suivant le démarrage rapide
  • Bien démarrer avec les images conteneur SQL Server 2019 (15.x) sur Docker en suivant le démarrage rapide

Contribuer à la documentation SQL

Saviez-vous que vous pouvez modifier le contenu SQL vous-même ? Dans ce cas, non seulement vous nous aidez à améliorer notre documentation, mais vous êtes également cité en tant que contributeur à la page.

Pour plus d’informations, consultez Guide pratique pour contribuer à la documentation SQL Server