Настройка и настройка контейнеров SQL Server Linux

Применимо к:SQL Server — Linux

В этой статье объясняется, как настроить и настроить контейнеры SQL Server Linux с помощью Docker. Вы можете сохранять данные, перемещать файлы из контейнеров и изменять параметры по умолчанию.

Совет

Sqlcmd (Go) можно использовать для создания нового экземпляра SQL Server в контейнере для целей разработки. Дополнительные сведения см. в статье "Создание и запрос контейнера SQL Server".

Создание настраиваемого контейнера

Вы можете создать собственный файл Dockerfile для создания настраиваемого контейнера SQL Server. Дополнительные сведения см. в демонстрации совместной работы SQL Server и приложения Node. При создании Dockerfile обратите внимание на процесс переднего плана, который управляет жизненным циклом контейнера. Если он завершает работу, контейнер завершает работу. Например, если вы хотите выполнить скрипт и запустить SQL Server, процесс SQL Server должен указываться в команде в крайней правой позиции. Все остальные команды выполняются в фоновом режиме. Это демонстрируется на примере следующей команды в Dockerfile:

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

Если отменить команды в предыдущем примере, контейнер закроется после выполнения скрипта do-my-sql-commands.sh.

Сохранение данных

Изменения в конфигурации SQL Server и файлы базы данных сохраняются в контейнере даже в том случае, если он был перезапущен с использованием команд docker stop и docker start. Тем не менее, если удалить контейнер с помощью команды docker rm, будет удалено все его содержимое, включая SQL Server и ваши базы данных. В следующем разделе описывается, как можно использовать тома данных для сохранения файлов базы данных даже в случае удаления связанных контейнеров.

Внимание

Для SQL Server важно понимать сохраняемость данных в Docker. Помимо этого раздела, мы также рекомендуем вам ознакомиться с информацией об управлении данными в контейнерах Docker в документации по Docker.

Подключение каталога узла в качестве тома данных

Первый способ состоит в подключении каталога на вашем узле в качестве тома данных для контейнера. Для этого используйте docker run команду с флагом -v <host directory>:/var/opt/mssql , где <host directory> находится любой заданный путь. Например, C:\SQL в Windows или ~/sqlvolumes Linux. Такой подход позволяет восстанавливать данные в перерывах между выполнениями контейнера.

Примечание.

Контейнеры для SQL Server 2019 (15.x) и более поздних версий автоматически запускались как не корневые, а контейнеры SQL Server 2017 (14.x) запускались как корневые по умолчанию. Дополнительные сведения о запуске контейнеров SQL Server в качестве не корневых, см. в разделе "Безопасные контейнеры SQL Server Linux".

Внимание

Переменная среды SA_PASSWORD является нерекомендуемой. Вместо этого используйте 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

Кроме того, этот способ позволяет предоставлять общий доступ к файлам на узле и просматривать их за пределами Docker.

Использование контейнеров томов данных

Второй способ подразумевает использование контейнеров томов данных. Чтобы создать контейнер тома данных, укажите имя тома вместо каталога узла с параметром -v. В следующем примере создается общий том данных с именем 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

Примечание.

Этот метод для неявного создания тома данных в команде выполнения не работает с более старыми версиями Docker. В таком случае следует явно выполнить действия, которые описываются в разделе Создание и подключение контейнера тома данных документации по Docker.

Даже если вы остановите и удалите этот контейнер, том данных будет сохранен. Вы сможете просмотреть его с помощью команды docker volume ls.

docker volume ls

Если затем создать другой контейнер с тем же именем тома, в новом контейнере будут использоваться данные SQL Server, располагающиеся на этом томе.

Чтобы удалить контейнер тома данных, воспользуйтесь командой docker volume rm.

Предупреждение

Если вы удалите контейнер тома данных, все содержащиеся в нем данные SQL Server будут удалены без возможности восстановления.

Резервное копирование и восстановление

Помимо этих способов, вы также можете использовать стандартные методы резервного копирования и восстановления SQL Server. Резервные копии файлов можно использовать для защиты данных или их переноса на другой экземпляр SQL Server. Дополнительные сведения см. в статье Резервное копирование и восстановление баз данных SQL Server на Linux.

Предупреждение

Обратите внимание, что создаваемые резервные копии должны размещаться за пределами контейнера. В противном случае при удалении контейнера файлы резервных копий также будут удалены.

Включение резервного копирования и восстановления VDI в контейнерах

Операции резервного копирования и восстановления интерфейса виртуального устройства (VDI) теперь поддерживаются в развертываниях контейнеров SQL Server, начиная с накопительного пакета обновления 15 для SQL Server 2019 (15.x) и CU28 для SQL Server 2017 (14.x). Выполните следующие действия, чтобы включить резервное копирование или восстановление на основе VDI для контейнеров SQL Server:

  1. При развертывании контейнеров SQL Server используйте параметр --shm-size. Чтобы начать, задайте размер 1 ГБ, как показано в следующей команде:

    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
    

    Параметр --shm-size позволяет настроить размер каталога общей памяти (/dev/shm) в контейнере, для которого по умолчанию установлено значение 64 МБ. Этот размер по умолчанию для общей памяти недостаточен для поддержки резервного копирования VDI. Рекомендуется настроить для размера минимальное значение, равное 1 ГБ, при развертывании контейнеров SQL Server, а также при необходимости поддержки резервного копирования в VDI.

  2. Необходимо также включить новый параметр memory.enablecontainersharedmemory в mssql.conf контейнере. Вы можете подключиться mssql.conf к развертыванию контейнера с помощью -v параметра, как описано в разделе "Сохранение данных " или после развертывания контейнера вручную mssql.conf . Ниже приведен пример mssql.conf файла с заданным параметром memory.enablecontainersharedmemorytrue.

    [memory]
    enablecontainersharedmemory = true
    

Копирование файлов из контейнера

Чтобы скопировать файл из контейнера, выполните следующую команду:

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

Идентификатор контейнера можно получить, выполнив команду docker ps -a.

Пример:

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

Копирование файлов в контейнер

Чтобы скопировать файл в контейнер, выполните следующую команду:

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

Пример:

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

Настройка часового пояса

Чтобы запустить SQL Server в контейнере Linux с определенным часовным поясом, настройте TZ переменную среды (дополнительные сведения см. в разделе "Настройка часового пояса для SQL Server 2022 в Linux "). Чтобы определить соответствующее значение часового пояса, выполните команду tzselect из командной строки Bash в Linux:

tzselect

После выбора часового пояса tzselect отображаются выходные данные, аналогичные следующему примеру:

The following information has been given:

    United States
    Pacific

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

Эти сведения можно использовать для установки соответствующей переменной среды в контейнере с Linux. В следующем примере демонстрируется, как запустить SQL Server в контейнере с часовым поясом 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

tempdb Изменение пути

Лучше всего хранить базу данных tempdb отдельно от пользовательских баз данных.

  1. Подключитесь к экземпляру SQL Server и запустите следующий скрипт Transact-SQL (T-SQL). Если есть больше файлов, связанных с tempdbними, их также необходимо переместить.

    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. Убедитесь, что расположение файла tempdb изменено, используя следующий скрипт T-SQL:

    SELECT *
    FROM sys.sysaltfiles
    WHERE dbid = 2;
    
  3. Вы должны перезапустить контейнер SQL Server, чтобы эти изменения вступили в силу.

    docker stop sql1
    docker start sql1
    
    docker stop sql1
    docker start sql1
    
    docker stop sql1
    docker start sql1
    
  4. Создайте интерактивный сеанс bash для подключения к контейнеру.

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

    Подключившись к интерактивной оболочке, выполните следующую команду, чтобы проверить расположение tempdb:

    ls /var/opt/mssql/tempdb/
    

    Если перемещение выполнено успешно, вы увидите аналогичные выходные данные:

    tempdb.mdf templog.ldf
    

Изменение расположения файла по умолчанию

MSSQL_DATA_DIR Добавьте переменную, чтобы изменить каталог данных в docker run команде, а затем подключите том к этому расположению, к которому имеет доступ пользователь контейнера.

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

Использование mssql-config для настройки SQL Server в контейнере

Средство mssql-conf можно использовать для задания параметров в контейнерах SQL Server.

Например, можно задать ограничение памяти для экземпляра, выполнив следующие действия:

  1. Подключение непосредственно в контейнер, используя docker exec его в качестве корневого пользователя. Замените sqlcontainer именем контейнера.

    docker exec -u root -it sqlcontainer "bash"
    
  2. Чтобы изменить параметр, используйте mssql-conf . В этом примере параметр изменяется memory.memorylimitmb на 2 ГБ (2048 МБ).

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

Примеры пользовательских контейнеров Docker

Примеры пользовательских контейнеров Docker представлены в разделе https://github.com/microsoft/mssql-docker/tree/master/linux/preview/examples. Примеры:

Сведения о создании и запуске контейнеров Docker с помощью Dockerfile см. в примерах служб машинного обучения на GitHub.

  • Сведения о начале работы с образами контейнеров с SQL Server 2017 (14.x) в Docker можно найти в кратком руководстве
  • Сведения о начале работы с образами контейнеров с SQL Server 2019 (15.x) в Docker можно найти в кратком руководстве
  • Начало работы с образами контейнеров SQL Server 2022 (16.x) в Docker, выполнив краткое руководство.

Примите участие в разработке документации по SQL

Знаете ли вы, что содержимое SQL можно изменить самостоятельно? Это не только улучшит нашу документацию, но и даст вам статус участника в создании этой страницы.

Дополнительные сведения см. в разделе Участие в работе над документацией по SQL Server.