«Пакуем окна»: изучаем технологию контейнеров от Microsoft. Как упаковать приложение в контейнер Docker? Контейнеры windows server

В сегодняшней Задать вопрос администратору , Я покажу вам, как развернуть образ в контейнере в Windows Server 2016, создать новое изображение и загрузить его в Docker.

Одной из основных новых функций Windows Server 2016 является поддержка контейнеров и Docker. Контейнеры обеспечивают легкие и гибкие возможности виртуализации, которые разработчики могут использовать для быстрого развертывания и обновления приложений без накладных расходов, связанных с виртуальными машинами. И в сочетании с Docker, решением для управления контейнерами, контейнерные технологии взорвались в течение последних нескольких лет.

Это обновленная статья для информации, которая ранее была включена в Развертывание и управление контейнерами Windows Server с помощью Docker это было актуально для Windows Server 2016 Technical Preview 3. Для получения дополнительной информации о Docker см. Что такое Докер? и Являются ли контейнеры Docker лучше, чем виртуальные машины? на Техническая база знаний Petri IT .

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

Установите Docker Engine

Первым шагом является установка поддержки Docker в Windows Server 2016.

  • Войдите в Windows Server.
  • Нажмите Поиск значок на панели задач и тип PowerShell в окне поиска.
  • Щелкните правой кнопкой мыши Windows PowerShell в результатах поиска и выберите Запуск от имени администратора из меню.
  • Введите учетные данные администратора по запросу.

Для установки Docker на Windows Server запустите следующий командлет PowerShell. Вам будет предложено установить NuGet, который загружает модуль Docker PowerShell из надежного онлайн-репозитория.

Install-Module -Name DockerMsftProvider -Force

Теперь используйте Install-Package командлет для установки механизма Docker на Windows Server. Обратите внимание, что перезагрузка необходима в конце процесса.

Install-Package -Name docker -ProviderName DockerMsftProvider -Force Restart-Computer -Force

После перезапуска сервера повторно запустите запрос PowerShell и убедитесь, что Docker установлен, выполнив следующую команду:

Версия докера

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

Теперь, когда установлен движок Docker, давайте вытаскиваем образ Windows Server Core по умолчанию из Docker:

Докер тянуть майкрософт /windowsServerCore

Теперь, когда изображение загружено на локальный сервер, запустите процесс контейнера, используя запуск докеров :

Докер запустить Microsoft /windowsServerCore

Создать новое изображение

Теперь мы можем создать новое изображение с использованием ранее загруженного образа Windows Server в качестве отправной точки. Перед запуском вам понадобится идентификатор Docker. Если у вас его еще нет, зарегистрируйтесь в учетной записи Docker .

Спонсоров

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

Обратите внимание, что в командной строке ниже -t Параметр дает тегу изображения, позволяя вам легко идентифицировать изображение. Кроме того, обратите особое внимание на дефис, который появляется после имени тега.

"ОТ Майкрософт /windowsservercore `n CMD echo Hello World!" | сборка докера -t mydockerid /windows-test-image -

После того, как Docker закончит создание нового изображения, проверьте список доступных изображений на локальном сервере. Вы должны увидеть оба Microsoft /windowsServerCore и mydockerid /windows-test-изображения в списке.

Изображение docker

Теперь запустите новое изображение в контейнере, не забывая при этом заменить mydockerid с именем вашего Docker ID, и вы должны увидеть Привет мир! Появляются на выходе:

Докер запустить mydockerid /windows-test-изображения

Загрузите изображение в Docker

Давайте загрузим изображение, которое мы только что создали, в Docker, чтобы он был доступен из облака. Войдите в систему, используя свой идентификатор и пароль Docker:

Вход в docker -u mydockerid -p mypassword

использование докерный толчок чтобы загрузить изображение, которое мы создали на предыдущих шагах, заменив mydockerid с именем вашего Docker ID:

Docker push mydockerid /windows-test-изображения

В *nix-системах изначально реализована многозадачность и предлагаются средства, позволяющие изолировать и контролировать процессы. Такие технологии, как chroot(), обеспечивающая изоляцию на уровне файловой системы, FreeBSD Jail, ограничивающая доступ к структурам ядра, LXC и OpenVZ, давно известны и широко используются. Но импульсом в развитии технологии стал Docker, позволивший удобно распространять приложения. Теперь подобное добралось и до Windows.

Контейнеры в Windows

Современные серверы обладают избыточной производительностью, и приложения порой не используют даже их части. В результате системы какое-то время «простаивают», нагревая воздух. Выходом стала виртуализация, позволяющая запускать несколько ОС на одном сервере, гарантированно разделяя их между собой и выделяя каждой нужное количество ресурсов. Но прогресс не стоит на месте. Следующий этап - микросервисы, когда каждая часть приложения развертывается отдельно, как самодостаточный компонент, который легко масштабируется под нужную нагрузку и обновляется. Изоляция предотвращает вмешательство в работу микросервиса со стороны других приложений. С появлением проекта Docker , упростившего процесс упаковки и доставки приложений вместе с окружением, архитектура микросервисов получила дополнительный толчок в развитии.

Контейнеры - это иной тип виртуализации, предоставляющий обособленную среду для выполнения приложений, называемую OS Virtualization. Реализуются контейнеры за счет использования изолированного пространства имен, включающего все необходимые для работы ресурсы (виртуализированные имена), с которыми можно взаимодействовать (файлы, сетевые порты, процессы и прочее) и выйти за которые нельзя. То есть ОС показывает контейнеру только то, что выделено. Приложение внутри контейнера считает, что оно единственное, и работает в полноценной ОС без каких-либо ограничений. Если необходимо изменить существующий файл или создать новый, контейнер получает копии с основной ОС хоста, сохраняя только измененные участки. Поэтому развертывание нескольких контейнеров на одном хосте очень эффективно.

Отличие контейнеров от виртуальных машин заключается в том, что контейнеры не загружают собственные копии ОС, библиотеки, системные файлы и прочее. Операционная система как бы делится с контейнером. Единственное, что дополнительно требуется, - это ресурсы, необходимые для запуска приложения в контейнере. В результате контейнер стартует в считаные секунды и меньше нагружает систему, чем в случае применения виртуальных машин. Docker в настоящее время предлагает 180 тысяч приложений в репозитории, а формат унифицирован в Open Container Initiative (OCI). Но зависимость от ядра подразумевает, что в другой ОС контейнеры не будут работать. Контейнеры Linux требуют Linux API, соответственно Windows в Linux работать не станет.

Разработчики Windows до недавнего времени предлагали две технологии виртуализации: виртуальные машины и виртуальные приложения Server App-V. Каждая имеет свою нишу применения, свои плюсы и минусы. Теперь ассортимент стал шире - в Windows Server 2016 анонсированы контейнеры (Windows Server Containers). И хотя на момент TP4 разработка еще не была завершена, уже вполне можно посмотреть новую технологию в действии и сделать выводы. Нужно отметить, что, догоняя и имея на руках готовые технологии, разработчики MS пошли в некоторых вопросах чуть дальше, так что использование контейнеров стало проще и более универсальным. Главное отличие в том, что предложены два вида контейнеров: контейнеры Windows и контейнеры Hyper-V. В TP3 были доступны только первые.

Контейнеры Windows используют одно ядро с ОС, которое динамично разделяют между собой. Процесс распределения (CPU, ОЗУ, сеть) берет на себя ОС. При необходимости можно ограничить максимально доступные ресурсы, выделяемые контейнеру. Файлы ОС и запущенные службы проецируются в пространство имен каждого контейнера. Такой тип контейнера эффективно использует ресурсы, уменьшая накладные расходы, а значит, позволяет более плотно размещать приложения. Этот режим в чем-то напоминает FreeBSD Jail или Linux OpenVZ.

Контейнеры Hyper-V обеспечивают дополнительный уровень изоляции при помощи Hyper-V. Каждому контейнеру выделяется свое ядро и память, изоляцию осуществляет не ядро ОС, а гипервизор Hyper-V. В результате достигается такой же уровень изоляции, как и в виртуальных машинах, при меньших накладных расходах по сравнению с VM, но больший, если сравнить с контейнерами Windows. Для использования такого вида контейнеров нужно установить на хосте роль Hyper-V. Контейнеры Windows больше подходят для использования в доверенной среде, например когда на сервере запускаются приложения одной организации. Когда же сервером пользуются множество компаний и необходимо обеспечить больший уровень изоляции, контейнеры Hyper-V, вероятно, будут более рациональны.

Важная особенность контейнеров в Win 2016 состоит в том, что тип выбирается не в момент создания, а в момент деплоя. То есть любой контейнер может быть запущен и как Windows, и как Hyper-V.

В Win 2016 за контейнеры отвечает слой абстракции Contаiner Management stack, реализующий все нужные функции. Для хранения используется формат образа жесткого диска VHDX. Контейнеры, как и в случае с Docker, сохраняются в образы в репозитории. Причем каждый сохраняет не полный набор данных, а только отличия создаваемого образа от базового, и в момент запуска все нужные данные проецируются в память. Для управления сетевым трафиком между контейнером и физической сетью служит Virtual Switch.

В качестве ОС в контейнере может использоваться Server Core или Nano Server. Первый, в общем-то, давно не новинка и обеспечивает высокий уровень совместимости с имеющимися приложениями. Второй - еще более урезанная версия для работы без монитора, позволяющая запускать сервер в минимально возможной конфигурации для использования с Hyper-V, файловым сервером (SOFS) и облачными службами. Графический интерфейс, естественно, отсутствует. Содержит только самые необходимые компоненты (.NET с CoreCLR, Hyper-V, Clustering и так далее). Но в итоге занимает на 93% меньше места, требует меньше критических исправлений.

Еще интересный момент. Для управления контейнерами, кроме традиционного PowerShell, можно использовать и Docker. И чтобы обеспечить возможность запуска неродных утилит на Win, MS заключила партнерское соглашение для расширения API Docker и набора инструментов. Все разработки открыты и доступны в официальном GitHub проекта Docker . Команды управления Docker применимы ко всем контейнерам как Win, так и Linux. Хотя, естественно, контейнер, созданный на Linux, запустить в Windows невозможно (как и наоборот). В настоящий момент PowerShell по функциям ограничен и позволяет работать только с локальным репозиторием.

Установка Containers

В Azure есть необходимый образ Windows Server 2016 Core with Containers Tech Preview 4, который можно развернуть и использовать для изучения контейнеров. Иначе необходимо все настроить самому. Для локальной установки нужен Win 2016, причем, так как Hyper-V в Win 2016 поддерживает вложенную виртуализацию (Nested virtualization), это может быть как физический, так и виртуальный сервер. Сам процесс установки компонента стандартен. Выбираем соответствующий пункт в мастере добавления ролей и компонентов или, используя PowerShell, даем команду

PS> Install-WindowsFeature Containers

В процессе установится и сетевой контроллер Virtual Switch, его сразу необходимо настроить, иначе дальнейшие действия будут выдавать ошибку. Смотрим названия сетевых адаптеров:

PS> Get-NetAdapter

Для работы нам нужен контроллер с типом External. У командлета New-VMSwitch много параметров, но для примера обойдемся минимальными установками:

PS> New-VMSwitch -Name External -NetAdapterName Ethernet0

Проверяем:

PS> Get-VMSwitch | where {$_.SwitchType –eq "External"}

Файрвол Windows будет блокировать соединения к контейнеру. Поэтому необходимо создать разрешающее правило, как минимум для возможности подключаться удаленно при помощи PowerShell remoting, для этого разрешим TCP/80 и создадим правило NAT:

PS> New-NetFirewallRule -Name "TCP80" -DisplayName "HTTP on TCP/80" -Protocol tcp -LocalPort 80 -Action Allow -Enabled True PS> Add-NetNatStaticMapping -NatName "ContainerNat" -Protocol TCP -ExternalIPAddress 0.0.0.0 -InternalIPAddress 192.168.1.2 -InternalPort 80 -ExternalPort 80

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

PS> https://aka.ms/tp4/Install-ContainerHost -OutFile C:\Install-ContainerHost.ps1 PS> C:\Install-ContainerHost.ps1

Есть еще один вариант - развернуть готовую виртуальную машину с поддержкой контейнера. Для этого на том же ресурсе есть скрипт, автоматически производящий все нужные операции. Подробная инструкция приведена на MSDN . Скачиваем и запускаем скрипт:

PS> wget -uri https://aka.ms/tp4/New-ContainerHost -OutFile c:\New-ContainerHost.ps1 PS> C:\New-ContainerHost.ps1 –VmName WinContainer -WindowsImage ServerDatacenterCore

Имя задаем произвольное, а -WindowsImage говорит о типе собираемого образа. Вариантами могут быть NanoServer, ServerDatacenter. Сразу ставится и Docker, за его отсутствие или наличие отвечает параметр SkipDocker и IncludeDocker. После запуска начнется загрузка и преобразование образа, в процессе нужно будет указать пароль для входа в VM. Сам ISO-файл достаточно большой, почти 5 Гбайт. Если канал медленный, файл можно скачать на другом компьютере, после чего переименовать в WindowsServerTP4 и скопировать в С:\Users\Public\Documents\Hyper-V\Virtual Hard Disks . Можем залогиниться в установленную виртуальную машину, указав пароль, заданный при сборке, и работать.

Теперь можно переходить непосредственно к использованию контейнеров.

Использование контейнеров с PowerShell

Модуль Containers содержит 32 командлета PowerShell, документация по некоторым еще неполная, хотя, в общем, чтобы заставить все работать, достаточная. Перечень вывести просто:

PS> Get-Command -module Containers

Получить список доступных образов можно при помощи командлета Get-ContainerImage, контейнеров - Get-Container. В случае с контейнером в колонке Status будет показан его текущий статус: остановлен или запущен. Но пока технология находится в стадии разработки, MS не представила репозиторий, да и, как говорилось, пока PowerShell работает с локальным репозиторием, поэтому для экспериментов его придется создать самому.

Итак, сервер с поддержкой у нас есть, теперь нужны сами контейнеры. Для этого ставим провайдер пакетов ContainerProvider.

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «сайт», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», увеличит личную накопительную скидку и позволит накапливать профессиональный рейтинг Xakep Score!

Свершилось! То ли молитвы помогли, то ли жертвоприношения, но теперь можно запускать Docker контейнеры с Windows внутри. Прекрасная новость пришла одновременно с релизом Windows Server 2016. И речь не идёт о какой-нибудь хитро-спрятанной виртуальной машине, или эмуляции Windows на Linux ядре — запускается настоящая Windows в настоящем Docker, с работающими Dockerfile, docker-compose и прочими docker-приблудами.

Ограничения

Но это не значит, что теперь можно запускать любой контейнер где угодно. Из-за того, что Docker контейнеры «отдалживают» ядро операционной системы у своего хоста (а иначе им пришлось бы иметь свою ОС и превращаться в виртуальную машину), Windows контейнеры можно запускать только на свежих Windows 10 Pro Anniversary Update и Windows Server 2016 .

Второй момент, запустить нативно Linux контейнер на Windows всё еще нельзя. В Anniversary Update есть собственная Linux подсистема (с помощью которой можно запустить настоящий Bash, например), но она не дотягивает для полноценного Linux-ядра, так что для того же контейнера с Убунтой на Windows всё еще нужна спрятанная виртуальная машина.

Наконец, одновременно запускать те и другие контейнеры на Windows машине можно, но с танцем. Если выполнить такую команду в Windows Server 2016 с установленным Docker (год назад я бы обозвал такое колдовством), оно сработает:

Но если после этой команды попробовать запустить Ubuntu контейнер, Docker взгрустнёт:

Проблема в том, что Windows и Linux контейнера обслуживаются разными Docker-демонами, которые, тем не менее, используют один и тот же канал для общения с командной строкой. То есть в каждый момент времени только один демон может быть активным. На официальном Докер-сайте есть бета «Docker for Windows «, которая пытается справиться проблемой (пока только на Windows 10 Pro и Enterprise). Но даже с ней, чтобы переключиться с Windows на Linux контейнеры, нужно либо лезть в меню настроек, либо общаться с командной строкой:

PowerShell

& "C:\Program Files\Docker\Docker\DockerCli.exe" -SwitchDaemon

& "C:\Program Files\Docker\Docker\DockerCli.exe" -SwitchDaemon

Образы с Windows

Пока есть только два базовых образа с контейнерной Windows:

Сделать свой базовый образ (scratch image) — нельзя.

Образ Windows Server Core весит аж 10 гигов и в целом ведёт себя как полноценная Windows Server 2016. Например, MS SQL и полноценный.NET Framework устанавливаются там без проблем. Если ваше приложение не сильно зависит от UI, то установится и оно.

Nano Server слегка интереснее. Это очень оптимизированная и урезанная Windows Server, которая весит меньше гига. Но и ограничений хватает: нет 32-битных приложений, UI, RDP, порезаный PowerShell, и т.д. Но это не мешает поставить на Nano Server тот же IIS, .NET Core, и даже какой-нибудь MySQL.

И кто-нибудь мог представить пару лет назад, что в Dockerfile можно будет встретить сразу «Microsoft», «Windows» и «PowerShell»?

FROM microsoft/windowsservercore RUN powershell -Command....

FROM microsoft / windowsservercore

RUN powershell - Command . . . .

Это же Windows в Докере! До сих пор звучит абсурдно.

Степени изоляции

Windows контейнера можно запускать в двух режимах изоляции:

  • Windows Server Containers
  • Hyper-V Containers

В первом режиме Windows контейнера ведут себя так же, как и все остальные контейнера в Docker: делят общее ядро с операционной системой, контейнерные процессы изолированы, но всё еще видны в хостовом дереве процессов, и т. п. Это дефолтный и самый быстрый способ запустить контейнер в Windows.

Во втором случае контейнера попадают особую Hyper-V виртуальную машину. Это, конечно, плохо сказывается на скорости запуска, но зато и изоляция полная.

Заключение

Windows в Докере — это просто отличные новости. Даже если не бросаться упаковывать свои продукты по контейнерам, это прекрасный инструмент для того, чтобы изолировать свои юнит-тесты, рабочие машины, сервера для демонстраций, песочницы — всё то, для чего раньше приходилось создавать виртуальную машину. Если Microsoft еще умудрится запустить nanoserver на Linux, то я им прощу недавнее снятие с производства Microsoft Band 2, неосмотрительно купленный за два месяца до этого.

Контейнеры в Microsoft Windows Server 2016 стали расширением возможностей технологии для клиентов. Microsoft планирует разработки клиентов, развертывания и теперь хостинг приложений в контейнерах как часть их процессов развития.

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

В то время как виртуальные машины имеют функцию переноса приложений в центрах обработки данных и в облако и за его пределы, ресурсы виртуализации дополнительно разблокированы контейнерами с помощью виртуализации ОС (Системный софт). Данное решение, благодаря виртуализации, позволит осуществить быструю доставку приложений.

Технология Windows Контейнер включает в себя два различных типа контейнеров, Windows Server Контейнер и Hyper-V Контейнеры. Оба типа контейнеров создаются, управляются и функционируют одинаково. Они даже производят и потребляют тот же образ контейнера. Отличается они между собой уровнем изоляции, созданного между контейнером, операционной системы хоста и всех других контейнеров, запущенных на хосте.

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

Hyper-V Контейнеры : Несколько экземпляров контейнеров могут работать одновременно на хосте. Тем не менее, каждый контейнер реализован внутри специальной виртуальной машины. Это обеспечивает изоляцию уровня ядра между каждым Hyper-V контейнером и контейнером хоста.

Microsoft включил в функцию контейнера набор инструментов Docker по управлению не только контейнерами Linux, но и контейнерами Windows Server и Hyper-V. В рамках сотрудничества в сообществах Linux и Windows , был расширен опыт Docker путем создания модуля PowerShell для Docker , который представлен теперь с открытым исходным кодом для. Модуль PowerShell может управлять Linux и Windows Sever контейнерами локально или удаленно с помощью REST API Docker технологии. Разработчики удовлетворены внедрением инноваций для клиентов с помощью открытого исходного кода для развитием нашей платформы. В дальнейшем планируется принести технологии для наших клиентов наряду с инновациями, как Hyper-V.

Купить Windows Server 2016

Предлагаем Вам купить Windows Server 2016 со скидкой у официального Партнера Microsoft в России – Компании ДАТАСИСТЕМ. У вас будет возможность получить консультацию, а также бесплатно скачать Windows Server 2016 для тестирования, обратившись к нашим специалистам техподдержки. Цена Windows Server 2016 по запросу. Коммерческое предложение для участия в закупке Windows Server 2016 вы сможете получить по запросу на e-mail:

Если вы интересуетесь современными тенденциями в мире 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 от имени администратора. В строке нужно заменить на наш пароль.

-e ACCEPT_EULA=Y microsoft/mssql-server-windows-developer

Разберем эту команду:

docker run - Запускает контейнер в локальном хранилище. Если его нет - качает из репозитария.

D - контейнер запускается в фоне. В противном случае вы попадете в консоль powerchell контейнера

P - Пробрасывает порт с контейнера на локальную машину.

E - Переменные, которые передаются в контейнер

в переменную -e 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= -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. Установщик 1С.
  2. dockerfile
  3. Скрипт powershell для запуска службы 1с. Я использовал из репозитория Microsoft
  4. Скрипт 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

ENV regport=1541 \ port=1540 \ range="1560:1591" \ debug="N" \ log="N"

Теперь в качестве точки запуска используется скрипт, в котором мы можем задать порты, включить отладку и логирование, указать путь для хранения информации о кластерах

Вы сами можете написать свой скрипт, или воспользоваться готовым в приложении.

Читайте также: