Введение
Если вы интересуетесь современными тенденциями в мире IT, то наверняка слышали про docker. Если вкратце: данная технология позволяет запускать контейнеры с установленными приложениями в своей песочнице(нет, это не виртуализация). Подробнее вы можете почитать например на хабре. То есть, мы можем быстренько собрать и запустить контейнер с требуемой версией 1с сервера. Docker широко используется в Linux и даже можно найти готовые контейнеры в docker.hub, но 1с-ник по большей части живет в windows.
Для чего это нужно?
Быстрота и простота разворачивания. Мы можем подготовить рабочее окружение двумя командами. Наше подготовленное окружение всегда в ожидаемом состоянии. Нет плясок с бубном при установке.
Установка нескольких версий сервера 1С и запуск нужной.
На сервере не устанавливается куча хлама
В данной статье я покажу как самому собрать контейнер с сервером 1С.
Требования к ОС:
Функция контейнера Windows доступна только в Windows Server сборки 1709, Windows Server 2016, Windows10 Professional и Windows10 Корпоративная (Anniversary Edition)
Требования к железу:
Процессор должен поддерживать виртуализацию
Установка Docker
Windows server 2016
Открываем powershell от имени администратора и выполняем следующие команды:
Install-Module DockerMsftProvider -Force
Install-Package Docker -ProviderName DockerMsftProvider -Force
(Install-WindowsFeature Containers).RestartNeeded
Если после последней команды на экране появилось "да", необходимо перезагрузить компьютер.
Windows 10
Здесь немного проще. Качаем установщик с официального сайта download.docker.com и запускаем. При установке ставим галочку напротив windows контейнеров
Запуск
Для запуска нашей среды, нам нужно запустить 2 контейнера: база данных и сервер 1С. Конечно, вы можете использовать и ваш существующий сервер.
База данных
Будем запускать на MSSQL. Microsoft уже подготовил необходимый контейнер с подробным описанием. Ссылка на docker.hub
Ставим его командой в powershell от имени администратора. В строке нужно заменить <SA_PASSWORD> на наш пароль.
docker run -d -p 1433:1433 -e sa_password=<SA_PASSWORD> -e ACCEPT_EULA=Y microsoft/mssql-server-windows-developer
Разберем эту команду:
docker run - Запускает контейнер в локальном хранилище. Если его нет - качает из репозитария.
-d - контейнер запускается в фоне. В противном случае вы попадете в консоль powerchell контейнера
-p - Пробрасывает порт с контейнера на локальную машину.
-e - Переменные, которые передаются в контейнер
в переменную -e sa_password=<SA_PASSWORD> нужно установить ваш пароль пользователя SA.
Для подключения существующих баз, дополним нашу команду.
Нужно пробросить папку с нашими базами в контейнер
-v КаталогНаХосте:КаталогВКонтейнере
Базы подключаются через переменную attach_dbs
-e attach_dbs="[{'dbName':'Test','dbFiles':['C:\\db\\test.mdf','C:\\db\\test_log.ldf']},{'dbName':'HomeBuh','dbFiles':['C:\\db\\HomeBuh.mdf','C:\\db\\HomeBuh_log.ldf']}]"
Наша конечная команда с подключение баз данных будет выглядеть следующим образом
docker run -d -p 1433:1433 -e sa_password=<SA_PASSWORD> -e ACCEPT_EULA=Y -v C:/temp/:C:/temp/ -e attach_dbs="[{'dbName':'SampleDb','dbFiles':['C:\\temp\\sampledb.mdf','C:\\temp\\sampledb_log. ldf']}]" microsoft/mssql-server-windows-developer
Сервер 1С
Внимание! Данный образ предназначен только для тестов.
Для того, чтобы информация о наших кластерах сохранялась на локальном компьютере и ее можно было подключить в другой контейнер, создадим папку c:\srvinfo
Выполним команду powershell
docker run -d -p 1541:1541 -p 1540:1540 -p 1560-1591:1560-1591 -v C:/srvinfo:C:/srvinfo lishniy/1c-windows
Все готово. Вот тут меня ждал сюрприз. Я давно использовал mssql в контейнере на тестовой машине и всегда обращался к нему по localhost. Сейчас это или поломали, или звезды так сошлись, но работать так перестало. Здесь и здесь можно почитать почему. Так что пока это чинят, либо пробрасываем контейнер в нашу сеть(при запуске контейнера указываем --network host в место кучи портов), либо определяем ip выданные внутри сети и подключаемся к ним. Для этого нужно выполнить две простых команды. В примере я буду показывать вместе с выводом
PS C:\WINDOWS\system32> docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7bd5d26e9297 lishniy/1c-windows "powershell -Command…" 12 minutes ago Up 10 minutes 0.0.0.0:1540-1541->1540-1541/tcp, 0.0.0.0:1560-1591->1560-1591/tcp gallant_perlman
696eb9b29a02 microsoft/mssql-server-windows-developer "powershell -Command…" 38 minutes ago Up 37 minutes (healthy) 0.0.0.0:1433->1433/tcp youthful_wing
PS C:\WINDOWS\system32> docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 696eb9b29a02
172.17.84.179
PS C:\WINDOWS\system32> docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 7bd5d26e9297
172.17.92.255
Первая команда выводит список контейнеров, вторая получает ip адрес контейнера по его id.
Итак, адреса у нас есть. Теперь открываем консоль администрирования и добавим нашу базу как обычно.
Остановка запуск контейнеров
При выполнении команды
docker run ...
у нас всегда создается новый чистенький контейнер без данных. Для того чтоб получить доступ к списку уже созданных контейнеров, достаточно выполнить команду
docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7bd5d26e9297 lishniy/1c-windows "powershell -Command…" 2 days ago Exited (1073807364) 43 hours ago gallant_perlman
696eb9b29a02 microsoft/mssql-server-windows-developer "powershell -Command…" 2 days ago Exited (1073807364) 4 minutes ago youthful_wing
В дальнейшем можно запускать/останавливать готовые контейнеры
docker container start Container_ID
docker container stop Container_ID
docker container restart Container_ID
Так же есть GUI приложения для управления. Например kitematic
Сборка Docker контейнера
Использовать готовые контейнеры просто и удобно, в случае с базой данных мы можем перейти на GitHub и посмотреть как его собрали. Хотя для контейнеров без dockerfile в описании мы не можем знать наверняка что внутри.
Итак, тот минимум что нам понадобится
- Установщик 1С.
- SQL native client
- dockerfile
- Скрипт powershell для запуска службы 1с. Я использовал из репозитория Microsoft
- Скрипт powershell для установки и настройки. Я назвал его prepare.ps1
С первыми двумя все понятно. Перейдем к построению dockerfile.
dockerfile
Этот файл представляет из себя файл с шагами для построения нашего контейнера.
Для начала просто попробуем построить и запустить наш контейнер. Для этого собираем все наши файлы в один каталог. Создаем там dockerfile с таким содержимым
FROM microsoft/windowsservercore
SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
WORKDIR /
COPY prepare.ps1 Wait-Service.ps1 1cEnt.zip sqlncli.msi ./
RUN .\prepare.ps1; powershell.exe -Command Remove-Item prepare.ps1 -Force
CMD .\Wait-Service.ps1 -ServiceName '1C:Enterprise 8.3 Server Agent' -AllowServiceRestart
Разберем его детально
FROM microsoft/windowsservercore
Указываем контейнер, который берем за основу. Это windows server core. По умолчанию берется образ с тегом latest. Вы можете попробовать последнюю версию, она занимает значительно меньший объем. Я использовал эту, так как контейнер mssql построен на нем же, а в этом случае это кусок не качался заново.
SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
Указываем в качестве командной строки powershell вместо cmd
WORKDIR / - Указывает рабочий каталог
COPY -копируем файлы для установки
RUN -запускаем установочный скрипт
CMD -команда, которая будет запущена после старта контейнера
Создаем файл prepare.ps1. В нем устанавливаем 1C и настраиваем службу.
msiexec /i "1CEnterprise 8.2.msi" /qr TRANSFORMS=adminstallrelogon.mst;1049.mst DESIGNERALLCLIENTS=0 THICKCLIENT=0 THINCLIENTFILE=0 THINCLIENT=1 WEBSERVEREXT=0 SERVER=1 CONFREPOSSERVER=0 CONVERTER77=0 SERVERCLIENT=0 LANGUAGES=RU
Remove-Item c:\sqlncli.msi -Force
sc.exe config "1C:Enterprise 8.3 Server Agent" depend= "/"
Обратите внимание на последнюю строчку. Для службы сервера в зависимостях указана служба "Сервер", которая не работает в контейнерах. Не знаю для чего ее добавили, но сервер 1С прекрасно работает без нее. Поэтому просто уберем ее из зависимостей, для того чтобы наша служба корректно загрузилась.
Теперь в окне powershell переходим в папку с файлами и вводим
docker build .
После завершения построения запускаем (в вашем случае первые две колонки будут пустые).
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
lishniy/1c-windows latest dab800c94b09 3 days ago 11.6GB
docker run -d -p 1541:1541 -p 1540:1540 -p 1560-1591:1560-1591 dab800c94b09
После этих операций, наш контейнер будет работать. Но есть небольшие нюансы. Мы не можем ни включить логирование, ни воспользоваться отладкой на сервере, ни поменять порты. Поэтому чуть доработаем наш dockerfile
FROM microsoft/windowsservercore
ENV regport=1541 \
port=1540 \
range="1560:1591" \
debug="N" \
log="N"
SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
WORKDIR /
COPY logcfg.xml start.ps1 prepare.ps1 Wait-Service.ps1 1cEnt.exe sqlncli.msi ./
RUN .\prepare.ps1; powershell.exe -Command Remove-Item prepare.ps1 -Force
CMD .\start.ps1 -regport $env:regport -port $env:port -range $env:range -debug $env:debug -servpath "C:\srvinfo" -log $env:log -Verbose
Здесь добавились описание переменных, которые мы можем задавать при запуске контейнера. Так же мы копируем подготовленные файл для включения логов в 1С logcfg.xml и доработанный скрипт для запуска
ENV regport=1541 \
port=1540 \
range="1560:1591" \
debug="N" \
log="N"
Теперь в качестве точки запуска используется скрипт, в котором мы можем задать порты, включить отладку и логирование, указать путь для хранения информации о кластерах
Вы сами можете написать свой скрипт, или воспользоваться готовым в приложении.