Настройка образов контейнеров с SQL Server в DockerConfigure SQL Server container images on Docker

Область применения:  ДаSQL Server (только в Linux) НетБаза данных SQL Azure НетХранилище данных SQL AzureНетParallel Data Warehouse APPLIES TO: yesSQL Server (Linux only) noAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

В этой статье описывается настройка образа контейнера mssql-server-linux и его использование в Docker.This article explains how to configure and use the mssql-server-linux container image with Docker. Этот образ содержит SQL Server, работающий в системе Linux, основанной на Ubuntu 16.04.This image consists of SQL Server running on Linux based on Ubuntu 16.04. Он может использоваться с Dосker Engine 1.8+ на Linux или Docker для Mac или Windows.It can be used with the Docker Engine 1.8+ on Linux or on Docker for Mac/Windows.

Примечание

В этой статье особое внимание уделяется использованию образа mssql-server-linux.This article specifically focuses on using the mssql-server-linux image. Образ с Windows не рассматривается, но сведения о нем вы можете найти на странице mssql-server-windows центра Docker Hub.The Windows image is not covered, but you can learn more about it on the mssql-server-windows Docker Hub page.

Извлечение и запуск образа контейнераPull and run the container image

Для извлечения и запуска образов контейнеров Docker для SQL Server 2017 и SQL Server 2019 (предварительная версия) необходимо выполнить предварительные требования и действия, описываемые в следующем кратком руководстве:To pull and run the Docker container images for SQL Server 2017 and SQL Server 2019 preview, follow the prerequisites and steps in the following quickstart:

Эта статья посвящена настройке и содержит дополнительные сценарии использования, описываемые в следующих разделах.This configuration article provides additional usage scenarios in the following sections.

Запуск образов контейнеров на основе RHELRun RHEL-based container images

Вся документация по образам контейнеров с Linux для SQL Server содержит информацию о контейнерах на основе Ubuntu.All of the documentation on SQL Server Linux container images point to Ubuntu-based containers. Начиная с предварительной версии SQL Server 2019 вы можете использовать контейнеры на основе Red Hat Enterprise Linux (RHEL).Beginning with SQL Server 2019 preview, you can use containers based on Red Hat Enterprise Linux (RHEL). Во всех командах Docker измените репозиторий контейнера с mcr.microsoft.com/mssql/server:2019-CTP3.2-ubuntu на mcr.microsoft.com/mssql/rhel/server:2019-CTP3.2.Change the container repository from mcr.microsoft.com/mssql/server:2019-CTP3.2-ubuntu to mcr.microsoft.com/mssql/rhel/server:2019-CTP3.2 in all of your docker commands.

Например, следующая команда извлекает последнюю версию контейнера с SQL Server 2019 (предварительная версия), в которой используется RHEL:For example, the following command pulls the latest SQL Server 2019 preview container that uses RHEL:

sudo docker pull mcr.microsoft.com/mssql/rhel/server:2019-CTP3.2
docker pull mcr.microsoft.com/mssql/rhel/server:2019-CTP3.2

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

В упомянутом в предыдущем разделе кратком руководстве используется бесплатный выпуск SQL Server Developer из центра Docker Hub.The quickstart in the previous section runs the free Developer edition of SQL Server from Docker Hub. Основная часть приведенных здесь сведений также применима для использования рабочих образов контейнеров, таких как выпуски Enterprise, Standard или Web.Most of the information still applies if you want to run production container images, such as Enterprise, Standard, or Web editions. Однако между ними есть несколько различий, которые будут описываться отдельно.However, there are a few differences that are outlined here.

  • Для использования SQL Server в рабочей среде вам потребуется действительная лицензия.You can only use SQL Server in a production environment if you have a valid license. Чтобы получить бесплатную рабочую лицензию SQL Server Express, воспользуйтесь этой ссылкой.You can obtain a free SQL Server Express production license here. Лицензии SQL Server Standard и Enterprise доступны в рамках программы корпоративного лицензирования Майкрософт.SQL Server Standard and Enterprise Edition licenses are available through Microsoft Volume Licensing.

  • Образ контейнера с выпуском Developer при необходимости можно настроить для запуска в рабочей среде.The Developer container image can be configured to run the production editions as well. Для запуска рабочих выпусков выполните следующие действия:Use the following steps to run production editions:

Ознакомьтесь с требованиями и выполните процедуры, описываемые в кратком руководстве.Review the requirements and run procedures in the quickstart. Укажите рабочий выпуск с помощью переменной среды MSSQL_PID.You must specify your production edition with the MSSQL_PID environment variable. В следующем примере показано, как запустить последнюю версию образа контейнера с SQL Server 2017 для выпуска Enterprise:The following example shows how to run the latest SQL Server 2017 container image for the Enterprise Edition:

docker run --name sqlenterprise \
      -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \
      -e 'MSSQL_PID=Enterprise' -p 1433:1433 \
      -d store/microsoft/mssql-server-linux:2017-latest
docker run --name sqlenterprise `
      -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
      -e "MSSQL_PID=Enterprise" -p 1433:1433 `
      -d "store/microsoft/mssql-server-linux:2017-latest"

Важно!

Передавая значение Y в переменной среды ACCEPT_EULA и значение выпуска в переменной среды MSSQL_PID, вы подтверждаете, что у вас есть действительная лицензия на выпуск и версию SQL Server, которые вы хотите использовать.By passing the value Y to the environment variable ACCEPT_EULA and an edition value to MSSQL_PID, you are expressing that you have a valid and existing license for the edition and version of SQL Server that you intend to use. Кроме того, вы соглашаетесь с тем, что использование программного обеспечения SQL Server, выполняющегося в образе контейнера Docker, будет регламентироваться условиями вашей лицензии SQL Server.You also agree that your use of SQL Server software running in a Docker container image will be governed by the terms of your SQL Server license.

Примечание

Полный список поддерживаемых значений переменной MSSQL_PID см. в статье Настройка параметров SQL Server с помощью переменных среды в Linux.For a full list of possible values for MSSQL_PID, see Configure SQL Server settings with environment variables on Linux.

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

Вы можете подключаться и выполнять запросы к SQL Server в контейнере как извне контейнера, так и внутри него.You can connect and query SQL Server in a container from either outside the container or from within the container. Оба эти сценария описываются в следующих разделах.The following sections explain both scenarios.

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

Подключиться к экземпляру SQL Server на компьютере Docker можно с помощью любого внешнего инструмента в macOS, Windows или Linux, поддерживающего подключения SQL.You can connect to the SQL Server instance on your Docker machine from any external Linux, Windows, or macOS tool that supports SQL connections. Ниже перечислены некоторые распространенные средства:Some common tools include:

В следующем примере используется sqlcmd для подключения к SQL Server в контейнере Docker.The following example uses sqlcmd to connect to SQL Server running in a Docker container. IP-адрес в строке подключения соответствует IP-адресу хост-компьютера, на котором выполняется контейнер.The IP address in the connection string is the IP address of the host machine that is running the container.

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

Если в сопоставлении используется отличный от заданного по умолчанию порт узла (1433), необходимо добавить этот порт в строку подключения.If you mapped a host port that was not the default 1433, add that port to the connection string. Например, если вы указали -p 1400:1433 в команде docker run, для подключения необходимо явно указать порт 1400.For example, if you specified -p 1400:1433 in your docker run command, then connect by explicitly specify port 1400.

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

Средства внутри контейнераTools inside the container

Начиная с предварительной версии SQL Server 2017 средства командной строки SQL включены в образ контейнера.Starting with SQL Server 2017 preview, the SQL Server command-line tools are included in the container image. Если подключиться к образу с помощью интерактивной командной строки, можно запускать программы локально.If you attach to the image with an interactive command-prompt, you can run the tools locally.

  1. Выполните команду docker exec -it, чтобы запустить интерактивную оболочку bash внутри запущенного контейнера.Use the docker exec -it command to start an interactive bash shell inside your running container. В следующем примере e69e056c702d — это идентификатор контейнера.In the following example e69e056c702d is the container ID.

    docker exec -it e69e056c702d "bash"
    

    Совет

    Указывать идентификатор контейнера полностью во всех случаях не требуется. Достаточно указать количество символов, необходимое для его уникальной идентификации.You don't always have to specify the entire container id. You only have to specify enough characters to uniquely identify it. Соответственно, вместо полного идентификатора в этом примере может использоваться форма e6 или e69.So in this example, it might be enough to use e6 or e69 rather than the full id.

  2. После входа в контейнер подключитесь локально с помощью sqlcmd.Once inside the container, connect locally with sqlcmd. Обратите внимание, что средство sqlcmd не включено в путь по умолчанию, поэтому необходимо указать полный путь.Note that sqlcmd is not in the path by default, so you have to specify the full path.

    /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P '<YourPassword>'
    
  3. По завершении работы с sqlcmd введите exit.When finished with sqlcmd, type exit.

  4. После завершения работы с интерактивной командной строкой введите exit.When finished with the interactive command-prompt, type exit. Контейнер продолжит работать после выхода из интерактивной оболочки bash.Your container continues to run after you exit the interactive bash shell.

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

В Docker реализована возможность одновременно запускать несколько контейнеров SQL Server на одном хост-компьютере.Docker provides a way to run multiple SQL Server containers on the same host machine. Этот подход требуется в сценариях, когда на одном хост-компьютере необходимо выполнить несколько экземпляров SQL Server.This is the approach for scenarios that require multiple instances of SQL Server on the same host. Каждый контейнер должен предоставляться через отдельный порт.Each container must expose itself on a different port.

В следующем примере создаются два контейнера SQL Server 2017, которые сопоставляются с портами 1401 и 1402 на хост-компьютере.The following example creates two SQL Server 2017 containers and maps them to ports 1401 and 1402 on the host machine.

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 (предварительная версия), которые сопоставляются с портами 1401 и 1402 на хост-компьютере.The following example creates two SQL Server 2019 preview containers and maps them to ports 1401 and 1402 on the host machine.

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

Обратите внимание, что в этом случае два экземпляра SQL Server будут выполняться в разных контейнерах.Now there are two instances of SQL Server running in separate containers. Клиенты могут подключаться к каждому из этих экземпляров SQL Server, указав IP-адрес узла Docker и номер порта для контейнера.Clients can connect to each SQL Server instance by using the IP address of the Docker host and the port number for the container.

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>"

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

Для создания настраиваемого контейнера SQL Server вам потребуется собственный Dockerfile.It is possible to create your own Dockerfile to create a customized SQL Server container. Дополнительные сведения см. в демонстрации совместной работы SQL Server и приложения Node.For more information, see a demo that combines SQL Server and a Node application. При создании Dockerfile обратите внимание на процесс переднего плана, который управляет жизненным циклом контейнера.If you do create your own Dockerfile, be aware of the foreground process, because this process controls the life of the container. В случае выхода из этого процесса контейнер будет закрыт.If it exits, the container will shutdown. Например, если вы хотите выполнить скрипт и запустить SQL Server, процесс SQL Server должен указываться в команде в крайней правой позиции.For example, if you want to run a script and start SQL Server, make sure that the SQL Server process is the right-most command. Все остальные команды выполняются в фоновом режиме.All other commands are run in the background. Это демонстрируется на примере следующей команды в Dockerfile:This is illustrated in the following command inside a Dockerfile:

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

Если отменить команды в предыдущем примере, контейнер закроется после выполнения скрипта do-my-sql-commands.sh.If you reversed the commands in the previous example, the container would shutdown when the do-my-sql-commands.sh script completes.

Сохранение данныхPersist your data

Изменения в конфигурации SQL Server и файлы базы данных сохраняются в контейнере даже в том случае, если он был перезапущен с использованием команд docker stop и docker start.Your SQL Server configuration changes and database files are persisted in the container even if you restart the container with docker stop and docker start. Тем не менее, если удалить контейнер с помощью команды docker rm, будет удалено все его содержимое, включая SQL Server и ваши базы данных.However, if you remove the container with docker rm, everything in the container is deleted, including SQL Server and your databases. В следующем разделе описывается, как можно использовать тома данных для сохранения файлов базы данных даже в случае удаления связанных контейнеров.The following section explains how to use data volumes to persist your database files even if the associated containers are deleted.

Важно!

При работе с SQL Server крайне важно понимать принципы обеспечения сохраняемости данных в Docker.For SQL Server, it is critical that you understand data persistence in Docker. Помимо этого раздела, мы также рекомендуем вам ознакомиться с информацией об управлении данными в контейнерах Docker в документации по Docker.In addition to the discussion in this section, see Docker's documentation on how to manage data in Docker containers.

Подключение каталога узла в качестве тома данныхMount a host directory as data volume

Первый способ состоит в подключении каталога на вашем узле в качестве тома данных для контейнера.The first option is to mount a directory on your host as a data volume in your container. Для этого используйте команду docker run с флагом -v <host directory>:/var/opt/mssql.To do that, use the docker run command with the -v <host directory>:/var/opt/mssql flag. Такой подход позволяет восстанавливать данные в перерывах между выполнениями контейнера.This allows the data to be restored between container executions.

docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' -p 1433:1433 -v <host directory>:/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 <host directory>:/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 <host directory>:/var/opt/mssql -d mcr.microsoft.com/mssql/server:2019-CTP3.2-ubuntu
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1433:1433 -v <host directory>:/var/opt/mssql -d mcr.microsoft.com/mssql/server:2019-CTP3.2-ubuntu

Кроме того, этот способ позволяет предоставлять общий доступ к файлам на узле и просматривать их за пределами Docker.This technique also enables you to share and view the files on the host outside of Docker.

Важно!

На данный момент не поддерживается сопоставление томов узла для Docker на Mac с образом SQL Server на Linux.Host volume mapping for Docker on Mac with the SQL Server on Linux image is not supported at this time. Вместо этого следует использовать контейнеры томов данных.Use data volume containers instead. Это ограничение относится только к каталогу /var/opt/mssql.This restriction is specific to the /var/opt/mssql directory. Операции чтения из подключенного каталога осуществляются в нормальном режиме.Reading from a mounted directory works fine. Например, вы можете подключить каталог узла с помощью команды -v на Mac и восстановить резервную копию из файла с расширением BAK, который находится на узле.For example, you can mount a host directory using -v on Mac and restore a backup from a .bak file that resides on the host.

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

Второй способ подразумевает использование контейнеров томов данных.The second option is to use a data volume container. Чтобы создать контейнер тома данных, укажите имя тома вместо каталога узла с параметром -v.You can create a data volume container by specifying a volume name instead of a host directory with the -v parameter. В следующем примере создается общий том данных с именем sqlvolume.The following example creates a shared data volume named 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:2019-CTP3.2-ubuntu
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-CTP3.2-ubuntu

Примечание

Этот способ неявного создания тома данных в рамках команды выполнения не работает в старых версиях Docker.This technique for implicitly creating a data volume in the run command does not work with older versions of Docker. В таком случае следует явно выполнить действия, которые описываются в разделе Создание и подключение контейнера тома данных документации по Docker.In that case, use the explicit steps outlined in the Docker documentation, Creating and mounting a data volume container.

Даже если вы остановите и удалите этот контейнер, том данных будет сохранен.Even if you stop and remove this container, the data volume persists. Вы сможете просмотреть его с помощью команды docker volume ls.You can view it with the docker volume ls command.

docker volume ls

Если затем создать другой контейнер с тем же именем тома, в новом контейнере будут использоваться данные SQL Server, располагающиеся на этом томе.If you then create another container with the same volume name, the new container uses the same SQL Server data contained in the volume.

Чтобы удалить контейнер тома данных, воспользуйтесь командой docker volume rm.To remove a data volume container, use the docker volume rm command.

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

Если вы удалите контейнер тома данных, все содержащиеся в нем данные SQL Server будут удалены без возможности восстановления.If you delete the data volume container, any SQL Server data in the container is permanently deleted.

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

Помимо этих способов, вы также можете использовать стандартные методы резервного копирования и восстановления SQL Server.In addition to these container techniques, you can also use standard SQL Server backup and restore techniques. Резервные копии файлов можно использовать для защиты данных или их переноса на другой экземпляр SQL Server.You can use backup files to protect your data or to move the data to another SQL Server instance. Дополнительные сведения см. в статье Резервное копирование и восстановление баз данных SQL Server на Linux.For more information, see Backup and restore SQL Server databases on Linux.

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

Обратите внимание, что создаваемые резервные копии должны размещаться за пределами контейнера.If you do create backups, make sure to create or copy the backup files outside of the container. В противном случае при удалении контейнера файлы резервных копий также будут удалены.Otherwise, if the container is removed, the backup files are also deleted.

Выполнение команд в контейнереExecute commands in a container

Вы можете выполнять команды из работающего контейнера с помощью терминала узла.If you have a running container, you can execute commands within the container from a host terminal.

Чтобы получить идентификатор контейнера, выполните следующую команду:To get the container ID run:

docker ps

Чтобы запустить терминал Bash в контейнере, выполните следующую команду:To start a bash terminal in the container run:

docker exec -it <Container ID> /bin/bash

После этого вы можете выполнять команды так, как если бы они выполнялись из терминала внутри контейнера.Now you can run commands as though you are running them at the terminal inside the container. По завершении введите exit.When finished, type exit. В этом случае завершается интерактивный сеанс команд, однако контейнер продолжает работать.This exits in the interactive command session, but your container continues to run.

Копирование файлов из контейнераCopy files from a container

Чтобы скопировать файл из контейнера, выполните следующую команду:To copy a file out of the container, use the following command:

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

Пример.Example:

docker cp d6b75213ef80:/var/opt/mssql/log/errorlog /tmp/errorlog
docker cp d6b75213ef80:/var/opt/mssql/log/errorlog C:\Temp\errorlog

Копирование файлов в контейнерCopy files into a container

Чтобы скопировать файл в контейнер, выполните следующую команду:To copy a file into the container, use the following command:

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

Пример.Example:

docker cp /tmp/mydb.mdf d6b75213ef80:/var/opt/mssql/data
docker cp C:\Temp\mydb.mdf d6b75213ef80:/var/opt/mssql/data

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

Чтобы запустить SQL Server в контейнере с Linux с определенным часовым поясом, настройте переменную среды TZ.To run SQL Server in a Linux container with a specific timezone, configure the TZ environment variable. Чтобы определить соответствующее значение часового пояса, выполните команду tzselect из командной строки Bash в Linux:To find the right timezone value, run the tzselect command from a Linux bash prompt:

tzselect

После выбора часового пояса команда tzselect выводит данные примерно следующего вида:After selecting the timezone, tzselect displays output similar to the following:

The following information has been given:

        United States
        Pacific

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

Эти сведения можно использовать для установки соответствующей переменной среды в контейнере с Linux.You can use this information to set the same environment variable in your Linux container. В следующем примере демонстрируется, как запустить SQL Server в контейнере с часовым поясом Americas/Los_Angeles:The following example shows how to run SQL Server in a container in the Americas/Los_Angeles timezone:

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-CTP3.2-ubuntu
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-CTP3.2-ubuntu

Запуск определенного образа контейнера с SQL ServerRun a specific SQL Server container image

В некоторых сценариях не требуется использовать последнюю версию образа контейнера с SQL Server.There are scenarios where you might not want to use the latest SQL Server container image. Чтобы запустить определенный образ контейнера с SQL Server, выполните следующие действия:To run a specific SQL Server container image, use the following steps:

  1. Определите тег Docker для выпуска, который требуется использовать.Identify the Docker tag for the release you want to use. Список всех доступных тегов см. на странице mssql-server-linux центра Docker Hub.To view the available tags, see the mssql-server-linux Docker hub page.

  2. Извлеките образ контейнера с SQL Server по соответствующему тегу.Pull the SQL Server container image with the tag. Например, чтобы извлечь образ RC1, замените <image_tag> в следующей команде на rc1.For example, to pull the RC1 image, replace <image_tag> in the following command with rc1.

    docker pull mcr.microsoft.com/mssql/server:<image_tag>
    
  3. Чтобы запустить новый контейнер с этим образом, укажите название тега в команде docker run.To run a new container with that image, specify the tag name in the docker run command. В следующей команде замените <image_tag> на версию, которую требуется запустить.In the following command, replace <image_tag> with the version you want to run.

    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>
    

Эти действия также можно использовать для перехода на более раннюю версию существующего контейнера.These steps can also be used to downgrade an existing container. Например, вы можете выполнить откат или перейти на более раннюю версию контейнера для устранения неполадок или тестирования.For example, you might want to rollback or downgrade a running container for troubleshooting or testing. Чтобы перейти на более раннюю версию контейнера, необходимо использовать метод обеспечения сохраняемости для папки данных.To downgrade a running container, you must be using a persistence technique for the data folder. Выполните действия, описываемые в разделе, посвященном обновлению, однако при запуске контейнера укажите название тега, соответствующее более старой версии.Follow the same steps outlined in the upgrade section, but specify the tag name of the older version when you run the new container.

Проверка версии контейнераCheck the container version

Чтобы просмотреть версию SQL Server в запущенном контейнере Docker, выполните следующую команду.If you want to know the version of SQL Server in a running docker container, run the following command to display it. Замените <Container ID or name> на идентификатор или имя целевого контейнера.Replace <Container ID or name> with the target container ID or name. Замените <YourStrong!Passw0rd> на пароль SQL Server для имени входа системного администратора.Replace <YourStrong!Passw0rd> with the SQL Server password for the SA login.

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

Также можно определить версию и номер сборки SQL Server для целевого образа контейнера Docker.You can also identify the SQL Server version and build number for a target docker container image. Следующая команда выводит сведения о версии и номере сборки SQL Server для образа microsoft/mssql-server-linux:2017-latest.The following command displays the SQL Server version and build information for the microsoft/mssql-server-linux:2017-latest image. Для этого запускается новый контейнер с переменной среды PAL_PROGRAM_INFO=1.It does this by running a new container with an environment variable PAL_PROGRAM_INFO=1. Полученный контейнер моментально закрывается, а команда docker rm удаляет его.The resulting container instantly exits, and the docker rm command removes it.

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

При выполнении указанных выше команд возвращаются сведения о версии примерно следующего вида:The previous commands display version information similar to the following output:

sqlservr
  Version 14.0.3029.16
  Build ID ee3d3882f1c48a7a7e590a620153012eaedc2f37143d485df945a079b9d4eeea
  Build Type release
  Git Version 65d42c4
  Built at Sat Jun 16 01:20:11 GMT 2018

PAL
  Build ID 60cfcb134bbae96d311f6a4f56aeb5a685b3809de80bcb61ec587a8f58b555eb
  Build Type release
  Git Version 21a4c11
  Built at Sat Jun 16 01:18:53 GMT 2018

Packages
  system.sfp                    6.2.9200.1,21a4c1178,
  system.common.sfp             10.0.15063.540
  system.certificates.sfp       6.2.9200.1,21a4c1178,
  system.netfx.sfp              4.6.1590.0
  secforwarderxplat.sfp         14.0.3029.16
  sqlservr.sfp                  14.0.3029.16
  sqlagent.sfp                  14.0.3029.16

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

Чтобы выполнить обновление образа контейнера Docker, сначала необходимо определить тег, соответствующий нужному выпуску.To upgrade the container image with Docker, first identify the tag for the release for your upgrade. Чтобы извлечь эту версию из реестра, используйте команду docker pull:Pull this version from the registry with the docker pull command:

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

При этом образ SQL Server будет обновлен только во вновь создаваемых контейнерах. В работающих контейнерах обновление не производится.This updates the SQL Server image for any new containers you create, but it does not update SQL Server in any running containers. Для этого необходимо создать новый контейнер с последней версией образа контейнера с SQL Server и перенести в него данные.To do this, you must create a new container with the latest SQL Server container image and migrate your data to that new container.

  1. Убедитесь, что в отношении существующего контейнера с SQL Server применяется один из методов обеспечения сохраняемости данных.Make sure you are using one of the data persistence techniques for your existing SQL Server container. Таким образом, вы можете запустить новый контейнер с теми же данными.This enables you to start a new container with the same data.

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

  3. Создайте новый контейнер с SQL Server с помощью команды docker run и укажите сопоставленный каталог узла или контейнер тома данных.Create a new SQL Server container with docker run and specify either a mapped host directory or a data volume container. Обратите внимание на необходимость использовать тег, соответствующий обновлению SQL Server.Make sure to use the specific tag for your SQL Server upgrade. В новом контейнере будет использоваться новая версия SQL Server с существующими данными SQL Server.The new container now uses a new version of SQL Server with your existing SQL Server data.

    Важно!

    На данный момент поддерживается обновление между версиями RC1, RC2 и общедоступной версией.Upgrade is only supported between RC1, RC2, and GA at this time.

  4. Убедитесь, что базы данных и данные перенесены в новый контейнер.Verify your databases and data in the new container.

  5. При необходимости удалите старый контейнер с помощью команды docker rm.Optionally, remove the old container with docker rm.

Устранение неполадокTroubleshooting

В следующих разделах приводятся рекомендации по устранению неполадок при выполнении SQL Server в контейнерах.The following sections provide troubleshooting suggestions for running SQL Server in containers.

Ошибки команды DockerDocker command errors

Если вы получаете ошибки, связанные с командами docker, убедитесь, что служба Docker запущена, и попробуйте выполнить запуск с повышенными привилегиями.If you get errors for any docker commands, make sure that the docker service is running, and try to run with elevated permissions.

Например, при выполнении команд docker в Linux вы можете получить следующее сообщение об ошибке:For example, on Linux, you might get the following error when running docker commands:

Cannot connect to the Docker daemon. Is the docker daemon running on this host?

Если вы получаете эту ошибку в Linux, попробуйте выполнить те же команды с префиксом sudo.If you get this error on Linux, try running the same commands prefaced with sudo. Если этот способ также не сработает, убедитесь, что служба Docker запущена, и при необходимости запустите ее.If that fails, verify the docker service is running, and start it if necessary.

sudo systemctl status docker
sudo systemctl start docker

В Windows убедитесь, что PowerShell или командная строка запущены от имени администратора.On Windows, verify that you are launching PowerShell or your command-prompt as an Administrator.

Ошибки при запуске контейнера с SQL ServerSQL Server container startup errors

Если запуск контейнера SQL Server завершился сбоем, попробуйте выполнить следующие проверки:If the SQL Server container fails to run, try the following tests:

  • Если вы получаете ошибку вида "Не удалось создать конечную точку CONTAINER_NAME в сетевом мосте. Ошибка запуска прокси-сервера: прослушивание tcp 0.0.0.0:1433 привязка: адрес уже используется" , значит, предпринимается попытка выполнить сопоставление порта контейнера 1433 с портом, который уже используется.If you get an error such as 'failed to create endpoint CONTAINER_NAME on network bridge. Error starting proxy: listen tcp 0.0.0.0:1433 bind: address already in use.', then you are attempting to map the container port 1433 to a port that is already in use. Это может произойти в том случае, если вы запускаете SQL Server локально на хост-компьютере.This can happen if you're running SQL Server locally on the host machine. Кроме того, такая ситуация возможна при запуске двух контейнеров с SQL Server и попытке сопоставить их с одним портом узла.It can also happen if you start two SQL Server containers and try to map them both to the same host port. В этом случае используйте параметр -p, чтобы сопоставить порт контейнера 1433 с другим портом узла.If this happens, use the -p parameter to map the container port 1433 to a different host port. Пример:For example:
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' -p 1400:1433 -d mcr.microsoft.com/mssql/server:2017-latest`.
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1400:1433 -d mcr.microsoft.com/mssql/server:2017-latest`.
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' -p 1400:1433 -d mcr.microsoft.com/mssql/server:2019-CTP3.2-ubuntu`.
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1400:1433 -d mcr.microsoft.com/mssql/server:2019-CTP3.2-ubuntu`.
  • Если вы получаете ошибку вида "Отказано в получении разрешений при попытке подключиться к сокету управляющей программы Docker по адресу unix:///var/run/docker.sock: Получение http://%2Fvar%2Frun%2Fdocker.sock/v1.30tdout=1&tail=all: dial unix /var/run/docker.sock: подключение: отказано в разрешении" при попытке запустить контейнер, добавьте своего пользователя в группу Docker в Ubuntu.If you get an error such as 'Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.30tdout=1&tail=all: dial unix /var/run/docker.sock: connect: permission denied' when trying to start a container, then add your user to the docker group in Ubuntu. После этого выйдите из системы и выполните вход снова, чтобы применить изменения к новым сеансам.Then logout and login again as this change will affect new sessions.

      usermod -aG docker $USER
    
  • Проверьте наличие сообщений об ошибках от контейнера.Check to see if there are any error messages from container.

    docker logs e69e056c702d
    
  • Убедитесь, что ваша система отвечает требованиям к объему памяти и дисковому пространству, которые указаны в разделе Предварительные требования статьи с кратким руководством.Make sure that you meet the minimum memory and disk requirements specified in the prerequisites section of the quickstart article.

  • Если вы используете программное обеспечение для управления контейнером, убедитесь, что оно поддерживает привилегированное выполнение процессов контейнера.If you are using any container management software, make sure it supports container processes running as root. Процесс sqlservr в контейнере выполняется в привилегированном режиме.The sqlservr process in the container runs as root.

  • Проверьте журналы установки и ошибок SQL Server.Review the SQL Server setup and error logs.

Включение записи дампаEnable dump captures

Если произошел сбой процесса SQL Server внутри контейнера, необходимо создать новый контейнер и включить для него SYS_PTRACE.If the SQL Server process is failing inside the container, you should create a new container with SYS_PTRACE enabled. При этом будет добавлена возможность отслеживания процесса в Linux, которая необходима для создания файла дампа при возникновении исключения.This adds the Linux capability to trace a process, which is necessary for creating a dump file on an exception. Файл дампа может использоваться службой поддержки в процессе устранения неполадок.The dump file can be used by support to help troubleshoot the problem. Эту возможность можно включить с помощью следующей команды выполнения Docker.The following docker run command enables this capability.

docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -e "MSSQL_PID=Developer" --cap-add SYS_PTRACE -p 1401:1433 -d mcr.microsoft.com/mssql/server:2017-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -e "MSSQL_PID=Developer" --cap-add SYS_PTRACE -p 1401:1433 -d mcr.microsoft.com/mssql/server:2019-CTP3.2-ubuntu

Сбой подключений SQL ServerSQL Server connection failures

Если вам не удается подключиться к экземпляру SQL Server, запущенному в контейнере, попробуйте выполнить следующие проверки:If you can't connect to the SQL Server instance running in your container, try the following tests:

  • Убедитесь, что контейнер с SQL Server запущен. Для этого проверьте содержимое столбца STATUS (Состояние) в выходных данных команды docker ps -a.Make sure that your SQL Server container is running by looking at the STATUS column of the docker ps -a output. При необходимости запустите его с помощью команды docker start <Container ID>.If not, use docker start <Container ID> to start it.

  • Если в сопоставлении задан отличный от установленного по умолчанию (1433) порт узла, убедитесь, что порт указан в строке подключения.If you mapped to a non-default host port (not 1433), make sure you are specifying the port in your connection string. Сопоставление порта можно проверить в столбце PORTS (Порты) в выходных данных команды docker ps -a.You can see your port mapping in the PORTS column of the docker ps -a output. Например, следующая команда подключает sqlcmd к контейнеру, прослушивающему порт 1401:For example, the following command connects sqlcmd to a container listening on port 1401:

    sqlcmd -S 10.3.2.4,1401 -U SA -P '<YourPassword>'
    
    sqlcmd -S 10.3.2.4,1401 -U SA -P "<YourPassword>"
    
  • Если вы использовали docker run с существующим сопоставленным томом данных или контейнером тома данных, SQL Server игнорирует значение MSSQL_SA_PASSWORD.If you used docker run with an existing mapped data volume or data volume container, SQL Server ignores the value of MSSQL_SA_PASSWORD. Вместо этого для тома данных или контейнера тома данных используется предварительно заданный пароль системного администратора, хранящийся в данных SQL Server.Instead, the pre-configured SA user password is used from the SQL Server data in the data volume or data volume container. Убедитесь, что используемый пароль системного администратора связан с данными, к которым вы подключаетесь.Verify that you are using the SA password associated with the data you're attaching to.

  • Проверьте журналы установки и ошибок SQL Server.Review the SQL Server setup and error logs.

Группы доступности SQL ServerSQL Server Availability Groups

Если вы используете Docker с группами доступности SQL Server, существует два дополнительных требования.If you are using Docker with SQL Server Availability Groups, there are two additional requirements.

  • Выполните сопоставление порта, который используется для подключения к реплике (по умолчанию 5022).Map the port that is used for replica communication (default 5022). Например, укажите -p 5022:5022 в команде docker run.For example, specify -p 5022:5022 as part of your docker run command.

  • Явно укажите имя узла контейнера с помощью параметра -h YOURHOSTNAME команды docker run.Explicitly set the container host name with the -h YOURHOSTNAME parameter of the docker run command. Это имя узла используется при настройке группы доступности.This host name is used when you configure your Availability Group. Если оно не задано с помощью команды -h, по умолчанию в этом качестве используется идентификатор контейнера.If you don't specify it with -h, it defaults to the container ID.

Журналы установки и ошибок SQL ServerSQL Server setup and error logs

Вы можете просмотреть журналы установки и ошибок SQL Server в папке /var/opt/mssql/log.You can look at the SQL Server setup and error logs in /var/opt/mssql/log. Если контейнер не запущен, сначала запустите его.If the container is not running, first start the container. Затем проверьте журналы с помощью интерактивной командной строки.Then use an interactive command-prompt to inspect the logs.

docker start e69e056c702d
docker exec -it e69e056c702d "bash"

Из сеанса Bash внутри контейнера выполните следующие команды:From the bash session inside your container, run the following commands:

cd /var/opt/mssql/log
cat setup*.log
cat errorlog

Совет

Если вы подключили каталог хоста к каталогу /var/opt/mssql при создании контейнера, вместо этого можно выполнять поиск в подкаталоге log по сопоставленному пути на узле.If you mounted a host directory to /var/opt/mssql when you created your container, you can instead look in the log subdirectory on the mapped path on the host.

Следующие шагиNext steps

Сведения о начале работы с образами контейнеров с SQL Server 2017 в Docker можно найти в кратком руководстве.Get started with SQL Server 2017 container images on Docker by going through the quickstart.

Кроме того, в репозитории GitHub mssql-docker вы найдете полезные ресурсы, отзывы и информацию об известных проблемах.Also, see the mssql-docker GitHub repository for resources, feedback, and known issues.

Обеспечение высокого уровня доступности для контейнеров SQL ServerExplore high availability for SQL Server containers