Konfigurieren und Anpassen von SQL Server Docker-Containern

Gilt für:SQL Server – Linux

In diesem Artikel wird erläutert, wie Sie SQL Server Docker-Container konfigurieren und anpassen können, z. B. zum persistenten Speichern Ihrer Daten, zum Verschieben von Dateien aus Containern und in Container sowie zum Festlegen von Standardeinstellungen.

Erstellen eines benutzerdefinierten Containers

Sie können ein eigenes Dockerfile erstellen, um einen benutzerdefinierten SQL Server-Container zu erstellen. Weitere Informationen finden Sie in dieser Demo, in der SQL Server und eine Node-Anwendung kombiniert werden. Wenn Sie ein eigenes Dockerfile erstellen, sollten Sie auf den Vordergrundprozess achten, da dieser die Lebensdauer des Containers bestimmt. Wenn dieser beendet wird, wird der Container heruntergefahren. Wenn Sie beispielsweise ein Skript ausführen und SQL Server starten möchten, sollten Sie sicherstellen, dass der SQL Server-Prozess der Befehl ganz rechts ist. Alle anderen Befehle werden im Hintergrund ausgeführt. Dies wird mit dem folgenden Befehl in einem Dockerfile veranschaulicht:

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

Wenn Sie die Befehle im vorherigen Beispiel vertauschen, wird der Container heruntergefahren, wenn das Skript „do-my-sql-commands.sh“ abgeschlossen wird.

Beibehalten von Daten

Die SQL Server-Konfigurationsänderungen und -Datenbankdateien werden im Container beibehalten, auch wenn Sie den Container mit docker stop und docker start neu starten. Wenn Sie den Container jedoch mit docker rm entfernen, werden sämtliche Inhalte des Containers gelöscht, einschließlich SQL Server und Ihrer Datenbanken. Im folgenden Abschnitt wird erläutert, wie Datenvolumes verwendet werden, um Ihre Datenbankdateien beizubehalten, auch wenn die zugeordneten Container gelöscht werden.

Wichtig

Für SQL Server ist es wichtig, sich mit der Datenpersistenz in Docker auseinanderzusetzen. Weitere Informationen finden Sie in der Docker-Dokumentation unter Verwalten von Daten in Docker-Containern.

Einbinden eines Hostverzeichnisses als Datenvolume

Die erste Option besteht darin, ein Verzeichnis auf dem Host als Datenvolume in Ihrem Container einzubinden. Verwenden Sie dazu den Befehl docker run mit der Kennzeichnung -v <host directory>:/var/opt/mssql, wobei <host directory> ein beliebiger Pfad vorhanden ist. Beispiel: C:\SQL unter Windows oder ~/sqlvolumes unter Linux. Dadurch können die Daten zwischen den Containerausführungen wiederhergestellt werden.

Hinweis

Container für SQL Server 2019 (15.x) oder neuere Versionen werden automatisch als Nicht-Stammcontainer gestartet, während SQL Server 2017-Container (14.x) standardmäßig als Stammcontainer gestartet werden. Weitere Informationen zum Ausführen von SQL Server-Containern als Nichtstammcontainer finden Sie unter Konfigurieren der Sicherheit.

Wichtig

Die Umgebungsvariable SA_PASSWORD ist veraltet. Verwenden Sie stattdessen 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

Mit dieser Methode können Sie die Dateien auch außerhalb von Docker auf dem Host freigeben und anzeigen.

Verwenden von Datenvolumecontainern

Die zweite Option besteht in der Verwendung eines Datenvolumecontainers. Sie können einen Datenvolumecontainer erstellen, indem Sie mit dem Parameter -v einen Volumenamen anstelle eines Hostverzeichnisses angeben. Im folgenden Beispiel wird ein freigegebenes Datenvolume mit dem Namen sqlvolume erstellt.

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

Hinweis

Dieses Verfahren zum impliziten Erstellen eines Datenvolumes im run-Befehl funktioniert nicht mit älteren Docker-Versionen. Wenden Sie in diesem Fall die expliziten Schritte an, die in der Docker-Dokumentation zum Erstellen und Einbinden eines Datenvolumecontainers beschrieben werden.

Auch wenn Sie diesen Container anhalten und entfernen, bleibt das Datenvolume erhalten. Sie können es mit dem Befehl docker volume ls anzeigen.

docker volume ls

Wenn Sie dann einen weiteren Container mit dem gleichen Volumenamen erstellen, verwendet der neue Container die gleichen SQL Server-Daten, die auch im Volume enthalten sind.

Verwenden Sie den Befehl docker volume rm, um einen Datenvolumecontainer zu entfernen.

Warnung

Wenn Sie den Datenvolumecontainer löschen, werden alle SQL Server-Daten im Container dauerhaft gelöscht.

Sichern und Wiederherstellen

Zusätzlich zu diesen Containerverfahren können Sie auch SQL Server-Standardverfahren für die Sicherung und Wiederherstellung anwenden. Sie können Sicherungsdateien verwenden, um Ihre Daten zu schützen oder die Daten auf eine andere SQL Server-Instanz zu verschieben. Weitere Informationen finden Sie unter Sichern und Wiederherstellen von SQL Server-Datenbanken unter Linux.

Warnung

Wenn Sie Sicherungen erstellen, stellen Sie sicher, dass die Sicherungsdateien außerhalb des Containers erstellt oder kopiert werden. Andernfalls werden die Sicherungsdateien gelöscht, wenn der Container entfernt wird.

Aktivieren der VDI-Sicherung und -Wiederherstellung in Containern

VDI-Sicherungs- und Wiederherstellungsvorgänge (Virtual Device Interface) werden jetzt in SQL Server-Containerbereitstellungen ab CU15 für SQL Server 2019 und CU28 für SQL Server 2017 unterstützt. Führen Sie die folgenden Schritte aus, um VDI-basierte Sicherungen oder Wiederherstellungen für SQL Server zu aktivieren:

  1. Verwenden Sie beim Bereitstellen von SQL Server-Containern die Option --shm-size. Legen Sie zunächst die Größe auf 1 GB fest, wie im folgenden Beispielbefehl gezeigt:

    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
    

    Mit der Option --shm-size können Sie die Größe des freigegebenen Speicherverzeichnisses (/dev/shm) im Container konfigurieren, die standardmäßig auf 64 MB festgelegt ist. Diese Standardgröße des freigegebenen Arbeitsspeichers reicht nicht aus, um VDI-Sicherungen zu unterstützen. Sie sollten dies auf mindestens 1 GB konfigurieren, wenn Sie SQL Server-Container bereitstellen und VDI-Sicherungen unterstützen möchten.

  2. Sie müssen auch den neuen Parameter memory.enablecontainersharedmemory in mssql.conf im Container aktivieren. Sie können „mssql.conf“ bei der Bereitstellung des Containers mithilfe der im Abschnitt Beibehalten von Daten beschriebenen -v-Option oder nach der Bereitstellung des Containers durch manuelles Aktualisieren von „mssql.conf“ im Container einbinden. Hier sehen Sie eine Beispieldatei für „mssql.conf“, bei der die Einstellung memory.enablecontainersharedmemory auf TRUE festgelegt ist.

    [memory]
    enablecontainersharedmemory = true
    

Kopieren von Dateien aus einem Container

Verwenden Sie den folgenden Befehl, um eine Datei aus dem Container zu kopieren:

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

Die Container-ID können Sie durch Ausführen des Befehls docker ps -a abrufen.

Beispiel:

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

Kopieren von Dateien in einen Container

Verwenden Sie den folgenden Befehl, um eine Datei in den Container zu kopieren:

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

Beispiel:

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

Konfigurieren der Zeitzone

Um SQL Server in einem Linux-Container mit einer bestimmten Zeitzone auszuführen, konfigurieren Sie die TZ-Umgebungsvariable (siehe Konfigurieren der Zeitzone unter Linux für weitere Informationen). Führen Sie den Befehl tzselect über eine Linux-Bash-Eingabeaufforderung aus, um den richtigen Zeitzonenwert zu ermitteln:

tzselect

Nachdem Sie eine Zeitzone ausgewählt haben, zeigt tzselect in etwa folgende Ausgabe an:

The following information has been given:

        United States
        Pacific

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

Sie können diese Informationen verwenden, um die gleiche Umgebungsvariable in Ihrem Linux-Container festzulegen. Im folgenden Beispiel wird veranschaulicht, wie SQL Server in einem Container in der Zeitzone Americas/Los_Angeles ausgeführt wird:

sudo docker run -e 'ACCEPT_EULA=Y' -e 'A_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

Ändern des tempdb-Pfads

Es empfiehlt sich, Ihre tempdb-Datenbank von Ihren Benutzerdatenbanken getrennt zu halten.

  1. Stellen Sie eine Verbindung mit der SQL Server-Instanz her, und führen Sie dann das folgende T-SQL-Skript (Transact-SQL) aus. Wenn tempdb weitere Dateien zugeordnet sind, müssen Sie diese ebenfalls verschieben.

    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. Stellen Sie anhand des folgenden T-SQL-Skripts sicher, dass der Dateispeicherort von tempdb geändert wurde:

    SELECT *
    FROM sys.sysaltfiles
    WHERE dbid = 2;
    
  3. Sie müssen den SQL Server-Container neu starten, damit die Änderungen wirksam werden.

    docker stop sql1
    docker start sql1
    
    docker stop sql1
    docker start sql1
    
    docker stop sql1
    docker start sql1
    
  4. Öffnen Sie eine interaktive bash-Sitzung, um eine Verbindung mit dem Container herzustellen.

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

    Wenn die Verbindung mit der interaktiven Shell besteht, führen den folgenden Befehl aus, um den Speicherort von tempdb zu überprüfen:

    ls /var/opt/mssql/tempdb/
    

    Wenn die Verschiebung erfolgreich war, ähnelt die Ausgabe der folgenden Abbildung:

    tempdb.mdf templog.ldf
    

Ändern des Standardspeicherorts der Datei

Fügen Sie die Variable MSSQL_DATA_DIR hinzu, um Ihr Datenverzeichnis in Ihrem docker run-Befehl zu ändern, und stellen Sie dann ein Volume an dem Speicherort bereit, auf den der Benutzer Ihres Containers Zugriff hat.

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

Beispiele für benutzerdefinierte Docker-Container

Beispiele für benutzerdefinierte Docker-Container, siehe https://github.com/microsoft/mssql-docker/tree/master/linux/preview/examples. Die Beispiele umfassen Folgendes:

Informationen zum Erstellen und Ausführen von Docker-Containern mit Dockerfiles finden Sie unter https://github.com/microsoft/mssql-docker/tree/master/linux/preview/examples/mssql-mlservices.

  • Der Schnellstart erleichtert Ihnen den Einstieg in die Verwendung von SQL Server 2017-Containerimages in Docker.
  • Der Schnellstart erleichtert Ihnen den Einstieg in die Verwendung von SQL Server 2019-Containerimages in Docker.
  • Erste Schritte mit SQL Server 2022-Containerimages in Docker mithilfe des Schnellstarts

Zur SQL-Dokumentation beitragen

Wussten Sie schon, dass Sie SQL-Inhalte selbst bearbeiten könnten? Hierdurch helfen Sie nicht nur mit, unsere Dokumentation zu verbessern, sondern Sie werden auch als Mitwirkender an der Seite aufgeführt.

Weitere Informationen finden Sie unter Mitwirken an der SQL Server-Dokumentation.