Развертывание и подключение к контейнерам SQL Server Linux

Область применения: SQL Server — Linux

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

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

Примечание.

В этой статье основное внимание уделяется использованию mssql-server-linux образа. Развертывания SQL Server в контейнерах Windows не поддерживаются. Для разработки и тестирования можно создавать пользовательские образы контейнеров для работы с SQL Server в контейнерах Windows. Примеры файлов доступны в GitHub. Примеры файлов предназначены только для справки.

Внимание

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

Это 6-минутное видео содержит введение в запуск SQL Server в контейнерах:

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

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

Эта статья посвящена настройке и содержит дополнительные сценарии использования, описываемые в следующих разделах.

Подключение и выполнение запросов

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

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

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

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

Примечание.

Более новые версии sqlcmdmssql-tools18) по умолчанию защищены. При использовании версии 18 или более поздней необходимо добавить параметр в sqlcmd, чтобы указатьNo, что шифрование является необязательным, а не обязательным.

sqlcmd -S 10.3.2.4 -U SA -P '<YourPassword>'
sqlcmd -S 10.3.2.4 -U SA -P "<YourPassword>"
sqlcmd -S 10.3.2.4 -U SA -P "<YourPassword>"

Если вы сопоставляли порт узла, который не был стандартным1433, добавьте этот порт в строка подключения. Например, если вы указали -p 1400:1433 в команде docker run, для подключения необходимо явно указать порт 1400.

sqlcmd -S 10.3.2.4,1400 -U SA -P '<YourPassword>'
sqlcmd -S 10.3.2.4,1400 -U SA -P "<YourPassword>"
sqlcmd -S 10.3.2.4,1400 -U SA -P "<YourPassword>"

Средства внутри контейнера

Начиная с SQL Server 2017 (14/x) средства командной строки SQL включены в образ контейнера. Если подключиться к образу с помощью интерактивной командной строки, можно запускать программы локально.

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

    docker exec -it e69e056c702d "bash"
    

    Совет

    Указывать идентификатор контейнера полностью во всех случаях не требуется. Достаточно указать количество символов, необходимое для его уникальной идентификации. Соответственно, вместо полного идентификатора в этом примере может использоваться форма e6 или e69. Чтобы узнать идентификатор контейнера, выполните команду docker ps -a.

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

    /opt/mssql-tools18/bin/sqlcmd -S localhost -U SA -P '<YourPassword>'
    

    Примечание.

    Более новые версии sqlcmd по умолчанию защищены. Дополнительные сведения о шифровании подключений см. в программе sqlcmd для Windows и подключении с помощью sqlcmd для Linux и macOS. Если подключение не выполнено, можно добавить параметр в sqlcmd, чтобы указать-No, что шифрование является необязательным, а не обязательным.

  3. После завершения работы с sqlcmd введите exit.

  4. После завершения работы с интерактивной командной строкой введите exit. Контейнер продолжит работать после выхода из интерактивной оболочки bash.

Проверка версии контейнера

Если вы хотите знать версию SQL Server в работающем контейнере, выполните следующую команду, чтобы отобразить ее. Замените <Container ID or name> на идентификатор или имя целевого контейнера. Замените <YourStrong!Passw0rd> на пароль SQL Server для учетной записи системного администратора.

docker exec -it <Container ID or name> /opt/mssql-tools/bin/sqlcmd \
-S localhost -U SA -P '<YourStrong!Passw0rd>' \
-Q 'SELECT @@VERSION'

Примечание.

Более новые версии sqlcmd по умолчанию защищены. Дополнительные сведения о шифровании подключений см. в программе sqlcmd для Windows и подключении с помощью sqlcmd для Linux и macOS. Если подключение не выполнено, можно добавить параметр в sqlcmd, чтобы указать-No, что шифрование является необязательным, а не обязательным.

docker exec -it <Container ID or name> /opt/mssql-tools/bin/sqlcmd `
-S localhost -U SA -P "<YourStrong!Passw0rd>" `
-Q "SELECT @@VERSION"

Примечание.

Более новые версии sqlcmd по умолчанию защищены. Дополнительные сведения о шифровании подключений см. в программе sqlcmd для Windows и подключении с помощью sqlcmd для Linux и macOS. Если подключение не выполнено, можно добавить параметр в sqlcmd, чтобы указать-No, что шифрование является необязательным, а не обязательным.

docker exec -it <Container ID or name> /opt/mssql-tools/bin/sqlcmd ^
-S localhost -U SA -P "<YourStrong!Passw0rd>" ^
-Q "SELECT @@VERSION"

Примечание.

Более новые версии sqlcmd по умолчанию защищены. Дополнительные сведения о шифровании подключений см. в программе sqlcmd для Windows и подключении с помощью sqlcmd для Linux и macOS. Если подключение не выполнено, можно добавить параметр в sqlcmd, чтобы указать-No, что шифрование является необязательным, а не обязательным.

Вы также можете определить версию SQL Server и номер сборки для целевого образа контейнера. Следующая команда выводит сведения о версии и номере сборки SQL Server для образа mcr.microsoft.com/mssql/server:2022-latest. Это делается путем запуска нового контейнера с переменной PAL_PROGRAM_INFO=1среды. Полученный контейнер моментально закрывается, а команда docker rm удаляет его.

docker run -e PAL_PROGRAM_INFO=1 --name sqlver \
-ti mcr.microsoft.com/mssql/server:2022-latest && \
docker rm sqlver
docker run -e PAL_PROGRAM_INFO=1 --name sqlver `
-ti mcr.microsoft.com/mssql/server:2022-latest; `
docker rm sqlver
docker run -e PAL_PROGRAM_INFO=1 --name sqlver ^
-ti mcr.microsoft.com/mssql/server:2022-latest && ^
docker rm sqlver

При выполнении указанных выше команд возвращаются сведения о версии примерно следующего вида:

sqlservr
  Version 16.0.1000.6
  Build ID d81e9b6de06534e649bd57dd609aa3050f5e380f361b7f8a80a80eeb71e7422c
  Build Type release
  Git Version 2aede92f
  Built at Tue Nov 01 06:11:40 GMT 2022

PAL
  Build ID 754097e8f0db68f559e1cbc9d46952ac9fd518b5da9f12964ef40fc9033720e3
  Build Type release
  Git Version d88e3e1130
  Built at Tue Nov 01 06:08:02 GMT 2022

Packages
  system.security                         mssql-16.0.1000.6_26_official-release
  system.certificates                     mssql-16.0.1000.6_26_official-release
  sqlagent                                16.0.1000.6
  system.wmi                              10.0.17763.2061.202107231
  system.netfx                            4.7.0.0.202104262
  system                                  mssql-16.0.1000.6_26_official-release
  system.common                           10.0.17763.2061.202107231
  sqlservr                                16.0.1000.6
  secforwarderxplat                       16.0.1000.6

Запуск определенного образа контейнера SQL Server

Примечание.

  • Начиная с SQL Server 2019 (15.x) с накопительным пакетом обновления 3 (CU3), теперь поддерживается Ubuntu 18.04.
  • Начиная с SQL Server 2019 (15.x) с накопительным пакетом обновления 3 (CU10), поддерживается Ubuntu 20.04.
  • Список всех доступных тегов для mssql/server можно найти на странице https://mcr.microsoft.com/v2/mssql/server/tags/list.

В некоторых сценариях не требуется использовать последнюю версию образа контейнера с SQL Server. Чтобы запустить определенный образ контейнера с SQL Server, выполните следующие действия:

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

  2. Извлеките образ контейнера с SQL Server по соответствующему тегу. Например, чтобы извлечь 2019-CU18-ubuntu-20.04 изображение, замените <image_tag> в следующей команде 2019-CU18-ubuntu-20.04на .

    docker pull mcr.microsoft.com/mssql/server:<image_tag>
    
  3. Чтобы запустить новый контейнер с этим образом, укажите название тега в команде docker run. В следующей команде замените <image_tag> на версию, которую требуется запустить.

    Внимание

    Переменная среды SA_PASSWORD является нерекомендуемой. Вместо этого используйте MSSQL_SA_PASSWORD.

    docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' -p 1401:1433 -d mcr.microsoft.com/mssql/server:<image_tag>
    
    docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1401:1433 -d mcr.microsoft.com/mssql/server:<image_tag>
    
    docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1401:1433 -d mcr.microsoft.com/mssql/server:<image_tag>
    

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

Запуск образов контейнеров на основе RHEL

Документация по образам контейнеров с Linux для SQL Server содержит информацию о контейнерах на основе Ubuntu. Начиная с SQL Server 2019 (15.x) вы можете использовать контейнеры на основе Red Hat Enterprise Linux (RHEL). Пример изображения для RHEL будет выглядеть следующим mcr.microsoft.com/mssql/rhel/server:2019-CU15-rhel-8образом.

Например, следующая команда извлекает контейнер накопительного обновления 18 для SQL Server 2019 (15.x), использующий RHEL 8:

docker pull mcr.microsoft.com/mssql/rhel/server:2019-CU18-rhel-8.4
docker pull mcr.microsoft.com/mssql/rhel/server:2019-CU18-rhel-8.4
docker pull mcr.microsoft.com/mssql/rhel/server:2019-CU18-rhel-8.4

Запуск образов рабочих контейнеров

Краткое руководство, приведенное в предыдущем разделе, запускает бесплатный выпуск SQL Server из Реестр артефактов Microsoft. Основная часть приведенных здесь сведений также применима для использования рабочих образов контейнеров, таких как выпуски Enterprise, Standard или Web. Однако между ними есть несколько различий, которые будут описываться отдельно.

  • Для использования SQL Server в рабочей среде вам потребуется действительная лицензия. Чтобы получить бесплатную рабочую лицензию SQL Server Express, воспользуйтесь этой ссылкой. Лицензии на выпуск SQL Server Standard и Enterprise доступны через корпоративное лицензирование Майкрософт.

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

Чтобы запустить выпуск рабочей среды, ознакомьтесь с требованиями и процедурами выполнения в кратком руководстве. Необходимо указать рабочий выпуск с переменной MSSQL_PID среды. В следующем примере показано, как запустить последний образ контейнера SQL Server 2022 (16.x) для выпуска Enterprise Core.

docker run --name sqlenterprise \
-e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \
-e 'MSSQL_PID=EnterpriseCore' -p 1433:1433 \
-d mcr.microsoft.com/mssql/server:2022-latest
docker run --name sqlenterprise `
-e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
-e "MSSQL_PID=EnterpriseCore" -p 1433:1433 `
-d "mcr.microsoft.com/mssql/server:2022-latest"
docker run --name sqlenterprise ^
-e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" ^
-e "MSSQL_PID=EnterpriseCore" -p 1433:1433 ^
-d "mcr.microsoft.com/mssql/server:2022-latest"

Внимание

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

Примечание.

Полный список возможных значений MSSQL_PIDсм. в разделе "Настройка параметров SQL Server" с переменными среды в Linux.

Запуск нескольких контейнеров SQL Server

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

В следующем примере создаются два контейнера SQL Server 2017 (14.x) и сопоставляют их с портами 1401 и 1402 на хост-компьютере.

docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' -p 1401:1433 -d mcr.microsoft.com/mssql/server:2017-latest
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' -p 1402:1433 -d mcr.microsoft.com/mssql/server:2017-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1401:1433 -d mcr.microsoft.com/mssql/server:2017-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1402:1433 -d mcr.microsoft.com/mssql/server:2017-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1401:1433 -d mcr.microsoft.com/mssql/server:2017-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1402:1433 -d mcr.microsoft.com/mssql/server:2017-latest

В следующем примере создаются два контейнера SQL Server 2019 (15.x) и сопоставляют их с портами 1401 и 1402 на хост-компьютере.

docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' -p 1401:1433 -d mcr.microsoft.com/mssql/server:2019-latest
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' -p 1402:1433 -d mcr.microsoft.com/mssql/server:2019-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1401:1433 -d mcr.microsoft.com/mssql/server:2019-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1402:1433 -d mcr.microsoft.com/mssql/server:2019-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1401:1433 -d mcr.microsoft.com/mssql/server:2019-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1402:1433 -d mcr.microsoft.com/mssql/server:2019-latest

В следующем примере создаются два контейнера SQL Server 2022 (16.x) и сопоставляется с портами 1401 и 1402 на хост-компьютере.

docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' -p 1401:1433 -d mcr.microsoft.com/mssql/server:2022-latest
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' -p 1402:1433 -d mcr.microsoft.com/mssql/server:2022-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1401:1433 -d mcr.microsoft.com/mssql/server:2022-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1402:1433 -d mcr.microsoft.com/mssql/server:2022-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1401:1433 -d mcr.microsoft.com/mssql/server:2022-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1402:1433 -d mcr.microsoft.com/mssql/server:2022-latest

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

Примечание.

Более новые версии sqlcmdmssql-tools18) по умолчанию защищены. При использовании версии 18 или более поздней необходимо добавить параметр в sqlcmd, чтобы указатьNo, что шифрование является необязательным, а не обязательным.

sqlcmd -S 10.3.2.4,1401 -U SA -P '<YourPassword>'
sqlcmd -S 10.3.2.4,1402 -U SA -P '<YourPassword>'
sqlcmd -S 10.3.2.4,1401 -U SA -P "<YourPassword>"
sqlcmd -S 10.3.2.4,1402 -U SA -P "<YourPassword>"
sqlcmd -S 10.3.2.4,1401 -U SA -P "<YourPassword>"
sqlcmd -S 10.3.2.4,1402 -U SA -P "<YourPassword>"

Обновление SQL Server в контейнерах

Чтобы выполнить обновление образа контейнера Docker, сначала необходимо определить тег, соответствующий нужному выпуску. Чтобы извлечь эту версию из реестра, используйте команду docker pull:

docker pull mcr.microsoft.com/mssql/server:<image_tag>

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

  1. Убедитесь, что в отношении существующего контейнера с SQL Server применяется один из методов обеспечения сохраняемости данных. Таким образом, вы можете запустить новый контейнер с теми же данными.

  2. Остановите контейнер с SQL Server с помощью команды docker stop.

  3. Создайте новый контейнер с SQL Server с помощью команды docker run и укажите сопоставленный каталог узла или контейнер тома данных. Обратите внимание на необходимость использовать тег, соответствующий обновлению SQL Server. В новом контейнере будет использоваться новая версия SQL Server с существующими данными SQL Server.

    Внимание

    На данный момент поддерживается обновление между версиями RC1, RC2 и общедоступной версией.

  4. Убедитесь, что базы данных и данные перенесены в новый контейнер.

  5. При необходимости удалите старый контейнер с помощью команды docker rm.

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

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

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

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