Поделиться через


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

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

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

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

Примечание.

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

Внимание

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

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

Загрузка и запуск образа контейнера

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

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

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

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

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

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

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

Примечание.

Более новые версии sqlcmdmssql-tools18) по умолчанию защищены. При использовании версии 18 или более поздней необходимо добавить параметр 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. Если подключение не выполнено, можно добавить параметр -No, чтобы указать, что шифрование является необязательным, а не обязательным.

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

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

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

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

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

Примечание.

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

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

Примечание.

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

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

Примечание.

Более новые версии sqlcmd по умолчанию защищены. Дополнительные сведения о шифровании подключений см. в разделе утилита sqlcmd для Windows и Подключение с помощью sqlcmd для Linux и macOS. Если подключение не выполнено, можно добавить параметр -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) CU3, поддерживается Ubuntu 18.04.
  • Начиная с SQL Server 2019 (15.x) с накопительным пакетом обновления 10 (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> на версию, которую требуется запустить. Пароль должен соответствовать политике паролей по умолчанию SQL Server. По умолчанию пароль должен быть не короче восьми символов и содержать три вида символов из следующих: прописные буквы, строчные буквы, десятичные цифры, специальные символы. Пароли могут иметь длину до 128 символов. Рекомендуется использовать максимально длинные и сложные пароли.

    Внимание

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

    docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<password>' -p 1401:1433 -d mcr.microsoft.com/mssql/server:<image_tag>
    
    docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" -p 1401:1433 -d mcr.microsoft.com/mssql/server:<image_tag>
    
    docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" -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 Artifact. Большая часть информации по-прежнему применима, если вы хотите использовать производственные контейнерные образы, например, выпуски Enterprise, Standard или Web. Однако между ними есть несколько различий, которые будут описываться отдельно.

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

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

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

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

docker run --name sqlenterprise \
-e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<password>' \
-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=<password>" `
-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=<password>" ^
-e "MSSQL_PID=EnterpriseCore" -p 1433:1433 ^
-d "mcr.microsoft.com/mssql/server:2022-latest"

Внимание

Передав значение 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=<password>' -p 1401:1433 -d mcr.microsoft.com/mssql/server:2017-latest
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<password>' -p 1402:1433 -d mcr.microsoft.com/mssql/server:2017-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" -p 1401:1433 -d mcr.microsoft.com/mssql/server:2017-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" -p 1402:1433 -d mcr.microsoft.com/mssql/server:2017-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" -p 1401:1433 -d mcr.microsoft.com/mssql/server:2017-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" -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=<password>' -p 1401:1433 -d mcr.microsoft.com/mssql/server:2019-latest
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<password>' -p 1402:1433 -d mcr.microsoft.com/mssql/server:2019-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" -p 1401:1433 -d mcr.microsoft.com/mssql/server:2019-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" -p 1402:1433 -d mcr.microsoft.com/mssql/server:2019-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" -p 1401:1433 -d mcr.microsoft.com/mssql/server:2019-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" -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=<password>' -p 1401:1433 -d mcr.microsoft.com/mssql/server:2022-latest
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<password>' -p 1402:1433 -d mcr.microsoft.com/mssql/server:2022-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" -p 1401:1433 -d mcr.microsoft.com/mssql/server:2022-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" -p 1402:1433 -d mcr.microsoft.com/mssql/server:2022-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" -p 1401:1433 -d mcr.microsoft.com/mssql/server:2022-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" -p 1402:1433 -d mcr.microsoft.com/mssql/server:2022-latest

Внимание

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

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

Примечание.

Более новые версии sqlcmdmssql-tools18) по умолчанию защищены. При использовании версии 18 или более поздней необходимо добавить параметр 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 и GA.

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

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

  • Чтобы начать работу с образами контейнеров SQL Server 2022 (16.x) в Docker, прочитайте краткое руководство.

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

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

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