Настройка и настройка контейнеров 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:
При развертывании контейнеров 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.Необходимо также включить новый параметр
memory.enablecontainersharedmemory
вmssql.conf
контейнере. Вы можете подключитьсяmssql.conf
к развертыванию контейнера с помощью-v
параметра, как описано в разделе "Сохранение данных " или после развертывания контейнера вручнуюmssql.conf
. Ниже приведен примерmssql.conf
файла с заданным параметромmemory.enablecontainersharedmemory
true
.[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
отдельно от пользовательских баз данных.
Подключитесь к экземпляру 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
Убедитесь, что расположение файла
tempdb
изменено, используя следующий скрипт T-SQL:SELECT * FROM sys.sysaltfiles WHERE dbid = 2;
Вы должны перезапустить контейнер SQL Server, чтобы эти изменения вступили в силу.
docker stop sql1 docker start sql1
docker stop sql1 docker start sql1
docker stop sql1 docker start sql1
Создайте интерактивный сеанс
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.
Например, можно задать ограничение памяти для экземпляра, выполнив следующие действия:
Подключитесь непосредственно к контейнеру, используя
docker exec
его в качестве корневого пользователя. Заменитеsqlcontainer
именем контейнера.docker exec -u root -it sqlcontainer "bash"
Чтобы изменить параметр, используйте 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. Примеры:
- Пример Dockerfile с полнотекстовым поиском
- Пример Dockerfile для RHEL 7 и SQL Server 2019
- Пример Dockerfile для RHEL 8 и SQL Server 2017
- Пример Dockerfile для Ubuntu 20.04 и SQL Server 2019 с полнотекстовым поиском, PolyBase и средствами
Сведения о создании и запуске контейнеров 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.