Краткое руководство. Запуск образов контейнеров SQL Server на Linux с помощью Docker

  • Михаил
  • 12 мин. на прочтение
  • 57
  • 07 Aug 2022
  • 07 Aug 2022

В этом кратком руководстве вы научитесь использовать Docker для извлечения и запуска образа контейнера SQL Server 2019 (15.x) на Linux, mssql-server-linux. Затем вы сможете подключиться с помощью sqlcmd, чтобы создать первую базу данных и выполнять запросы.

Дополнительные сведения о поддерживаемых платформах см. в заметках о выпуске SQL Server 2019 для Linux.

Совет

В этом кратком руководстве создаются контейнеры SQL Server 2019 (15.x). Если вы хотите создать контейнеры на Linux для других версий SQL Server, ознакомьтесь с версиями этой статьи SQL Server 2017 (14.x) или Предварительная версия SQL Server 2022 (16.x).

Этот образ содержит экземпляр SQL Server, выполняющийся в системе Linux на основе Ubuntu 20.04. Он может использоваться с Dосker Engine 1.8 и более поздних версий на Linux.

В примерах этой статьи используются команды docker. Однако большинство этих команд также работают с Podman. Podman предоставляет интерфейс командной строки, аналогичный подсистеме Docker. Дополнительные сведения о Podman см. здесь.

Предварительные требования

Docker Engine 1.8 и более поздних версий на любом поддерживаемом дистрибутиве Linux. Дополнительные сведения см. в разделе Установка Docker.

Дополнительные сведения о требованиях к аппаратному обеспечению и поддерживаемых процессорах см. в следующих источниках:

Драйвер хранилища overlay2 Docker. По умолчанию этот драйвер используется большинством пользователей. Если вы не используете этот поставщик хранилища и хотите изменить его, см. инструкции и предупреждения в документации по настройке overlay2 для Docker.

Не менее 2 ГБ места на диске.

Не менее 2 ГБ ОЗУ.

Требования к системе для SQL Server на Linux.

Извлечение и запуск образа контейнера SQL Server на Linux

Перед выполнением следующих действий убедитесь, что вы выбрали предпочтительную оболочку (bash, PowerShell или cmd) в начале этой статьи.

Извлеките образ контейнера SQL Server 2019 (15.x) на Linux из Реестра контейнеров Майкрософт.

BashКопировать

 

sudo docker pull mcr.microsoft.com/mssql/server:2019-latest

Совет

В этом кратком руководстве создаются контейнеры SQL Server 2019 (15.x). Если вы хотите создать контейнеры на Linux для других версий SQL Server, ознакомьтесь с версиями этой статьи SQL Server 2017 (14.x) или Предварительная версия SQL Server 2022 (16.x).

Предыдущая команда извлекает последнюю версию образа контейнера SQL Server 2019 (15.x) на Linux. Если вы хотите извлечь конкретный образ, добавьте после двоеточия название метки, например mcr.microsoft.com/mssql/server:2019-GA-ubuntu. Список всех доступных образов см. на странице mssql-server Docker Hub.

Для команд Bash в этой статье используется sudo. Если вы не хотите использовать sudo для запуска Docker, можно настроить группу docker и добавить в нее пользователей. Дополнительные сведения см. в статье Действия после установки для Linux.

Чтобы запустить образ контейнера на Linux с помощью Docker, выполните следующую команду в оболочке bash или в командной строке PowerShell с повышенными привилегиями.

BashКопировать

 

sudo docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=<YourStrong@Passw0rd>"    -p 1433:1433 --name sql1 --hostname sql1    -d    mcr.microsoft.com/mssql/server:2019-latest

Ваш пароль должен удовлетворять политике паролей SQL Server по умолчанию, в противном случае контейнер не сможет настроить SQL Server и прекратит работу. По умолчанию пароль должен быть не короче восьми символов и содержать три вида символов из следующих: прописные буквы, строчные буквы, десятичные цифры, специальные символы. Проверить журнал ошибок можно, используя команду docker logs.

По умолчанию в этом кратком руководстве создается контейнер с выпуском SQL Server Developer. Процесс запуска контейнера с производственными выпусками немного отличается. Дополнительные сведения см. в разделе Запуск образов контейнеров с производственными выпусками.

Следующая таблица содержит описание параметров запуска команды docker run из предыдущего примера.

ПараметрОписание
-e "ACCEPT_EULA=Y"Присвойте переменной ACCEPT_EULA любое значение, чтобы подтвердить свое согласие с лицензионным соглашением. Обязательный параметр для образа SQL Server.
-e "SA_PASSWORD=<YourStrong@Passw0rd>"Укажите свой надежный пароль длиной не меньше восьми символов, соответствующий требованиям к паролям в SQL Server. Обязательный параметр для образа SQL Server.
-p 1433:1433Сопоставление TCP-порта среды узла (первое значение) с TCP-портом в контейнере (второе значение). В этом примере SQL Server ожидает передачи данных из TCP-порта 1433 в контейнере, который перенаправляется на TCP-порт 1433 на узле.
--name sql1Укажите свое имя для контейнера вместо сгенерированного случайным образом. При запуске нескольких контейнеров нельзя использовать одинаковые имена.
--hostname sql1Используется для явного указания имени узла контейнера. Если имя узла не указано, по умолчанию используется идентификатор контейнера, который является случайным системным идентификатором GUID.
-dЗапустите контейнер в фоновом режиме (управляющая программа).
mcr.microsoft.com/mssql/server:2019-latestОбраз контейнера SQL Server на Linux.

Для просмотра ваших контейнеров Docker используйте команду docker ps.

BashКопировать

 

sudo docker ps -a

Выходные данные должны иметь следующий вид.

Выходные данныеКопировать

 

CONTAINER ID   IMAGE                                        COMMAND                    CREATED         STATUS         PORTS                                       NAMES
d4a1999ef83e   mcr.microsoft.com/mssql/server:2019-latest   "/opt/mssql/bin/perm..."   2 minutes ago   Up 2 minutes   0.0.0.0:1433->1433/tcp, :::1433->1433/tcp   sql1

Если в столбце STATUS (состояние) отображается состояние Up (запущен), то SQL Server выполняется в контейнере и прослушивает порт, указанный в столбце PORTS (порты). Если в столбце STATUS контейнера с SQL Server отображается Exited (завершен), см.руководство Устранение неполадок конфигурации. Сервер будет готов к подключению, когда журналы ошибок SQL Server отобразят сообщение: SQL Server is now ready for client connections. This is an informational message; no user action is required. Чтобы просмотреть журнал ошибок SQL Server, выполните внутри контейнера следующую команду:

BashКопировать

 

Параметр --hostname, как указано выше, позволяет изменить внутреннее имя контейнера на пользовательское значение. Это значение отображается при выполнении следующего запроса Transact-SQL.

SQLКопировать

 

Установка параметров --hostname и --name равными позволяет легко идентифицировать целевой контейнер.

SELECT @@SERVERNAME,
    SERVERPROPERTY('ComputerNamePhysicalNetBIOS'),
    SERVERPROPERTY('MachineName'),
    SERVERPROPERTY('ServerName');
docker exec -t sql1 cat /var/opt/mssql/log/errorlog | grep connection

В качестве последнего шага измените пароль SA, так как SA_PASSWORD отображается в выходных данных ps -eax и хранится в переменной среды с тем же именем. См. действия ниже.

Изменение пароля системного администратора

Учетная запись SA обладает правами администратора на экземпляре SQL Server, создаваемом во время установки. После создания контейнера SQL Server указанную вами переменную среды SA_PASSWORD можно обнаружить, запустив echo $SA_PASSWORD в контейнере. В целях безопасности смените пароль SA.

Назначьте для пользователя SA надежный пароль.

Используйте docker exec для запуска sqlcmd, чтобы изменить пароль с помощью Transact-SQL. В следующем примере старый и новый пароли считываются из вводимых пользователем данных.

BashКопировать

 

sudo docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd -S localhost -U SA  -P "$(read -sp "Enter current SA password: "; echo "${REPLY}")"  -Q "ALTER LOGIN SA WITH PASSWORD=\"$(read -sp "Enter new SA password: "; echo "${REPLY}")\""

Подключение к SQL Server

На следующем шаге воспользуемся средством командной строки SQL Server sqlcmd внутри контейнера для подключения к SQL Server.

Выполните команду docker exec -it, чтобы запустить интерактивную оболочку bash внутри запущенного контейнера. В следующем примере sql1 — это имя, заданное в параметре --name при создании контейнера.

BashКопировать

 

sudo docker exec -it sql1 "bash"

В контейнере подключитесь локально с помощью sqlcmd, используя полный путь.

BashКопировать

 

Совет

Вы можете опустить пароль в командной строке. В этом случае вы получите приглашение для его ввода.

/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "<YourNewStrong@Passw0rd>"

Если все сработает должным образом, вы перейдете к приглашению команды sqlcmd: 1>.

Создание и запрос данных

В следующих разделах приведено пошаговое руководство по созданию базы данных, добавлению данных и запуску запроса с использованием sqlcmd и Transact-SQL.

Создание базы данных

Выполните следующие шаги, чтобы создать базу данных TestDB.

В приглашении команды sqlcmd вставьте следующую команду Transact-SQL, чтобы создать тестовую базу данных:

SQLКопировать

 

CREATE DATABASE TestDB;

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

SQLКопировать

 

SELECT Name from sys.databases;

Две предыдущие команды не были выполнены сразу. Введите GO на новой строке, чтобы выполнить предыдущие команды:

SQLКопировать

 

GO

Добавление данных

Теперь создайте таблицу Inventory и вставьте две новых строки.

В приглашении команды sqlcmd переключите контекст на новую базу данных TestDB:

SQLКопировать

 

USE TestDB;

Создайте таблицу Inventory:

SQLКопировать

 

CREATE TABLE Inventory (id INT, name NVARCHAR(50), quantity INT);

Вставьте данные в новую таблицу:

SQLКопировать

 

INSERT INTO Inventory VALUES (1, 'banana', 150); INSERT INTO Inventory VALUES (2, 'orange', 154);

Введите GO, чтобы выполнить предыдущие команды:

SQLКопировать

 

GO

Выбор данных

Теперь выполните запрос, чтобы вернуть данные из таблицы Inventory.

В приглашении команды sqlcmd введите запрос, который должен вернуть из таблицы Inventory строки, где количество превышает 152:

SQLКопировать

 

SELECT * FROM Inventory WHERE quantity > 152;

Выполните приведенную ниже команду.

SQLКопировать

 

GO

Выход из приглашения команды sqlcmd

Чтобы завершить сеанс sqlcmd, введите QUIT:

SQLКопировать

 

QUIT

Чтобы выйти из интерактивной командной строки в контейнере, введите команду exit. Контейнер продолжит работать после выхода из интерактивной оболочки bash.

Подключение из-за пределов контейнера

Подключиться к экземпляру SQL Server на компьютере Docker можно также с помощью любого внешнего инструмента в macOS, Windows или Linux, поддерживающего подключения SQL.

В следующем примере используется sqlcmd вне контейнера для подключения к SQL Server, запущенному в контейнере. В этом примере предполагается, что в среде вне контейнера, из которой происходит подключение, уже установлены средства командной строки SQL Server. При использовании других средств действует тот же принцип, но процесс подключения является уникальным для каждого средства.

Найдите IP-адрес хост-компьютера своего контейнера с помощью ifconfig или ip addr.

В этом примере установите средство sqlcmd на клиентском компьютере. Дополнительные сведения см. в статье Установка sqlcmd в Windows или Установка sqlcmd в Linux.

Запустите sqlcmd, указав IP-адрес и порт, сопоставленный с портом 1433 в контейнере. В этом примере это тот же порт, что и порт 1433 на хост-компьютере. Если на хост-компьютере был указан другой сопоставленный порт, используйте его здесь. Кроме того, чтобы разрешить подключение, необходимо открыть соответствующий входящий порт в брандмауэре.

BashКопировать

 

sqlcmd -S <ip_address>,1433 -U SA -P "<YourNewStrong@Passw0rd>"

Выполните команды языка Transact-SQL. По завершении введите QUIT.

Другие распространенные средства для подключения к SQL Server:

Удаление контейнера

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

BashКопировать

 

sudo docker stop sql1
sudo docker rm sql1

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

Остановка и удаление контейнера безвозвратно удаляет все данные SQL Server в контейнере. Чтобы сохранить данные, создайте и скопируйте файл резервной копии за пределы контейнера или используйте метод постоянного хранения данных контейнера.

Демонстрация возможностей Docker

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

 

Lальнейшие действия

Кроме того, в репозитории GitHub mssql docker вы найдете ресурсы, отзывы и известные проблемы.