Published on

January 26, 2017

Создание пользовательских контейнеров SQL Server с помощью Docker

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

Контейнеризация – это технология легковесной виртуализации, которая позволяет упаковать приложение и его зависимости в стандартизированную единицу, называемую контейнером. Docker – популярная платформа контейнеризации, упрощающая процесс создания, развертывания и управления контейнерами.

В этой статье мы рассмотрим процесс создания пользовательского контейнера SQL Server с использованием Docker. Прежде чем мы начнем, убедитесь, что у вас установлен Docker на вашем компьютере с Windows Server 2016. Если вы еще не настроили его, вы можете найти инструкции по установке на веб-сайте Docker.

Сначала давайте проверим, работает ли Docker, открыв командную строку и выполним следующую команду:

docker version

Затем проверьте, есть ли у вас доступное изображение SQL Server, выполнив:

docker images

Если у вас нет изображения SQL Server, вы можете загрузить его из репозитория Docker, следуя инструкциям, предоставленным на веб-сайте Docker.

Теперь создайте каталог на вашем сервере, чтобы хранить файлы Dockerfile и базы данных. Например, вы можете создать каталог с именем “Demo” по адресу “C:\Docker\Demo”.

Затем мы создадим несколько баз данных в нашем локальном экземпляре SQL Server. Откройте SQL Server Management Studio и выполните следующий код:

USE [master]
GO
CREATE DATABASE [DatabaseA] ON PRIMARY 
(NAME= N'DatabaseA'
,FILENAME= N'C:\SQLServer\SQLData\DatabaseA.mdf'
,SIZE= 8192 KB
,MAXSIZE= UNLIMITED
,FILEGROWTH = 65536 KB) 
LOG ON 
(NAME= N'DatabaseA_log'
,FILENAME= N'C:\SQLServer\SQLLog\DatabaseA_log.ldf'
,SIZE= 8192 KB
,MAXSIZE= 2048 GB
,FILEGROWTH = 65536 KB)
GO
CREATE DATABASE [DatabaseB] ON PRIMARY
(NAME= N'DatabaseB'
,FILENAME= N'C:\SQLServer\SQLData\DatabaseB.mdf'
,SIZE= 8192 KB
,MAXSIZE= UNLIMITED
,FILEGROWTH = 65536 KB) ,
(NAME= N'DatabaseB_Data'
,FILENAME= N'C:\SQLServer\SQLData\DatabaseB_Data.ndf'
,SIZE= 8192 KB
,MAXSIZE= UNLIMITED
,FILEGROWTH = 65536 KB)
LOG ON 
(NAME= N'DatabaseB_log'
,FILENAME= N'C:\SQLServer\SQLLog\DatabaseB_log.ldf'
,SIZE= 8192 KB
,MAXSIZE= 2048 GB
,FILEGROWTH = 65536 KB)
GO
CREATE DATABASE [DatabaseC] ON PRIMARY 
(NAME= N'DatabaseC'
,FILENAME= N'C:\SQLServer\SQLData\DatabaseC.mdf'
,SIZE= 8192 KB
,MAXSIZE= UNLIMITED
,FILEGROWTH = 65536 KB) 
LOG ON 
(NAME= N'DatabaseC_log'
,FILENAME= N'C:\SQLServer\SQLLog\DatabaseC_log.ldf'
,SIZE= 8192 KB
,MAXSIZE= 2048 GB
,FILEGROWTH = 65536 KB)
GO

Этот код создаст три базы данных: DatabaseA, DatabaseB и DatabaseC. У базы данных DatabaseB есть дополнительный файл данных, чтобы продемонстрировать, как добавлять базы данных с несколькими файлами данных в контейнер SQL через Dockerfile.

После создания баз данных остановите экземпляр SQL Server. Вы можете сделать это через SQL Server Configuration Manager или выполнить следующую команду:

SHUTDOWN WITH NOWAIT

Теперь давайте создадим наш Dockerfile. Откройте ваш любимый текстовый редактор и создайте новый файл с именем “Dockerfile” (без расширения). Скопируйте и вставьте следующий код в файл:

# using vNext image
FROM microsoft/mssql-server-windows
# create directory within SQL container for database files
RUN powershell -Command (mkdir C:\\SQLServer)
# copy the database files from host to container
COPY DatabaseA.mdf C:\\SQLServer
COPY DatabaseA_log.ldf C:\\SQLServer
COPY DatabaseB.mdf C:\\SQLServer
COPY DatabaseB_Data.ndf C:\\SQLServer
COPY DatabaseB_log.ldf C:\\SQLServer
COPY DatabaseC.mdf C:\\SQLServer
COPY DatabaseC_log.ldf C:\\SQLServer
# set environment variables
ENV sa_password=Testing11@@
ENV ACCEPT_EULA=Y
ENV attach_dbs="[{'dbName':'DatabaseA','dbFiles':['C:\\SQLServer\\DatabaseA.mdf','C:\\SQLServer\\DatabaseA_log.ldf']},{'dbName':'DatabaseB','dbFiles':['C:\\SQLServer\\DatabaseB.mdf','C:\\SQLServer\\DatabaseB_Data.ndf','C:\\SQLServer\\DatabaseB_log.ldf']},{'dbName':'DatabaseC','dbFiles':['C:\\SQLServer\\DatabaseC.mdf','C:\\SQLServer\\DatabaseC_log.ldf']}]"

Этот Dockerfile создаст контейнер на основе указанных строк кода и сохранит его как новое пользовательское изображение. Давайте пройдемся по нему построчно:

  • FROM microsoft/mssql-server-windows: Эта строка указывает базовое изображение для нашего пользовательского изображения.
  • RUN powershell -Command (mkdir C:\\SQLServer): Эта строка создает каталог внутри контейнера для хранения файлов баз данных.
  • COPY DatabaseA.mdf C:\\SQLServer: Каждая из этих строк копирует файлы баз данных с хост-машины в контейнер.
  • ENV sa_password=Testing11@@: Эта строка устанавливает пароль SA для экземпляра SQL Server.
  • ENV ACCEPT_EULA=Y: Эта строка принимает лицензионное соглашение SQL Server.
  • ENV attach_dbs="...": Эта строка присоединяет каждую базу данных к экземпляру SQL Server.

Сохраните Dockerfile и скопируйте его, вместе с файлами баз данных, в ранее созданный вами каталог на сервере.

Теперь мы можем создать наше пользовательское изображение. Откройте окно командной строки PowerShell, перейдите в каталог с Dockerfile и выполните следующую команду:

docker build -t demo .

Эта команда создаст пользовательское изображение Docker, запускающее SQL Server с нашими базами данных. Флаг -t помечает изображение как “demo”, а точка (“.”) указывает Docker на поиск файла с именем “Dockerfile” в текущем каталоге.

После завершения процесса сборки проверьте, что изображение было создано, выполнив:

docker images

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

docker run -d -p 15788:1433 --name democontainer demo

Эта команда создаст и запустит новый контейнер на основе нашего пользовательского изображения. Флаг -d запускает контейнер в отсоединенном режиме, флаг -p отображает порт сервера хоста 15788 на порт контейнера 1433, а флаг --name задает имя контейнера “democontainer”.

После запуска контейнера вы можете проверить его статус, выполнив:

docker ps

Теперь давайте подключимся к контейнеру удаленно с помощью SQL Server Management Studio (SSMS) и проверим, есть ли там базы данных. Используйте IP-адрес сервера хоста и пользовательский порт, который мы указали при создании контейнера.

Подключившись, вы можете использовать Object Explorer SSMS для просмотра баз данных в контейнере.

И вот! Вы успешно создали пользовательский контейнер SQL Server с предварительно созданными базами данных с помощью Docker. Представьте себе время и усилия, сэкономленные благодаря возможности быстрого создания новых экземпляров SQL Server с полным набором готовых к использованию баз данных за несколько минут. Это главное преимущество, которое предлагает технология контейнеров, устраняя необходимость вручную устанавливать SQL Server и восстанавливать базы данных. Всего несколькими простыми шагами ваша команда разработки или QA может иметь полностью функциональную среду SQL Server, готовую к работе.

Контейнеризация и Docker изменили способ развертывания и управления приложениями. Используя возможности контейнеров, вы можете оптимизировать процессы разработки и тестирования, улучшить масштабируемость и снизить затраты на инфраструктуру. Попробуйте и посмотрите, как это может быть полезно для вашей организации!

Спасибо за чтение!

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.