Помните фразу: «Прекращайте считать себя одинэсниками»? Она принадлежит Алексею Лустину – он ее произнёс в далеком 2014 году, выступая с докладом об автоматизации сборки решений на платформе 1С.
Я с этим выражением согласен целиком и полностью. Потому что мы все – не одинэсники. Мы – инженеры-программисты. И я считаю, что инженер, конечно же, имеет право чего-то не знать, но не имеет права не знать этого намеренно. Инженер не имеет права ограничивать себя в своем развитии и познании. Он должен постоянно развиваться.
При этом мы, как программисты, должны быть немного ленивы и постоянно стремиться автоматизировать свою деятельность, чтобы не делать одну и ту же рутинную работу руками несколько раз подряд. И Docker нам в этом, как мне кажется, неплохо помогает.
Сегодня мы разберем:
-
Что такое контейнеры и Docker.
-
Зачем это вообще нужно.
-
Как это можно использовать, в том числе в 1С.
-
И как начать работать с этими инструментами.
Типичные вопросы от сообщества
Но сначала я хочу ответить на пару типичных вопросов, которые появляются в чатах 1С при упоминании Docker – особенно со стороны матерых разработчиков, давно познавших мир ИТ.
Первый: «Да сколько уже можно рассказывать про Docker…» Ребята, я вас очень понимаю, поддерживаю, уважаю. Согласен, тема кажется избыточной. Но это наши с вами когнитивные искажения: нам кажется, что все уже все знают, потому что мы это знаем и используем изо дня в день. На практике это не так. В тех же чатах регулярно появляются сообщения вроде: «не запускается контейнер» или «не пробрасывается порт». В конце концов за эту тему проголосовали люди. Значит, тема по-прежнему актуальна. Перефразирую классика: если про Docker рассказывают – значит, это кому-нибудь нужно.
Второй вопрос: «Почему именно Docker, если есть Vagrant или Terraform?»
Давайте кратко сравним.
- Docker – это платформа для контейнеризации приложений. С её помощью мы можем завернуть отдельные приложения в изолированные контейнеры и вызывать их для выполнения задач.
- Vagrant – инструмент для управления виртуальными машинами. Он поднимает виртуальную машину на основе конфиг-файла и позволяет что-нибудь дальше в ней запустить.
- Terraform – это инфраструктурный оркестратор, с помощью которого можно управлять целыми кластерами и поднимать, например, десятки виртуальных машин.
Эти инструменты друг друга не заменяют, но отлично взаимодополняют.
Что такое контейнеры? Как это можно использовать, в том числе в 1С?

Вернемся к основам. Что такое контейнеры? Если упростить, это такие «кирпичики», из которых собирается приложение (часто микросервисное). Контейнеры друг о друге ничего не знают, каждый выполняет свою задачу, и вместе они образуют систему.
Но если копнуть глубже – никаких «контейнеров» на самом деле нет, это просто удобная абстракция для малюток-девопсов, которые впервые знакомятся с профессией. А под капотом там:
-
уровни изоляции ядра Linux по пространствам имен и контрольным группам;
-
изоляция процессов, сети и файловой системы;
-
ограничение ресурсов процессора и памяти.
В общем, чума.
Но для нашего понимания достаточно считать контейнеры обычными кирпичиками.

Давайте разберемся, зачем нужна вся эта контейнеризация. С её помощью обеспечивается:
-
Изоляция приложений. Контейнеры работают независимо друг от друга и от внешней среды: они «не видят» лишнего и не конфликтуют между собой. В результате мы получаем чистую и предсказуемую среду выполнения.
-
Стандартизация окружения. Есть Docker-образ, в котором зафиксированы все зависимости: версии приложений, библиотек и прочее. Каждый раз, запуская контейнер из такого образа, мы получаем одинаковую среду. Мы гарантированно запускаем одно и то же окружение из раза в раз.
-
Быстрое развертывание. В отличие от классических виртуальных машин, для запуска контейнера нужна одна команда – docker run. И запускается он за считанные секунды – его легко поднять, остановить и удалить без лишних следов в системе.
-
Масштабируемость. Если один контейнер с нагрузкой не справляется, всегда можно поднять рядом ещё несколько и распределить трафик через балансировщик, обеспечив горизонтальное масштабирование.
-
Экономия ресурсов. В отличие от классических виртуальных машин, которые требуют большого объема дискового пространства, памяти и процессорного времени на всю систему целиком, контейнер использует только те ресурсы, которые нужны самому приложению.
-
Легкость обновления и отката. Образы версионируются, и обновление сводится к запуску новой версии. Если что-то пошло не так – можно просто вернуться к предыдущей версии образа.
-
Чистота на хостовой системе. Когда вы ставите на свой компьютер 10 версий платформы, пять версий EDT и три версии Java, а потом их удаляете, в системе накапливаются лишние «хвосты», которые в дальнейшем могут вызывать различные проблемы и конфликты. С Docker все проще: не нужен образ – удалили, и система снова чистая.
-
И самое главное – упрощение CI/CD. Вместо ручной настройки окружения на каждой машине (установка последней версии платформы, EDT, OneScript и всех нужных библиотек) можно один раз собрать для каждой задачи отдельные образы и дальше использовать их автоматически. CI-система сама скачает все нужные дистрибутивы и обновит окружение.

Теперь о том, что из мира 1С можно запустить в Docker. Если вкратце, то примерно всё:
-
платформа 1С отлично чувствует себя в Docker;
-
EDT тоже прекрасно там работает;
-
1С:Исполнитель (точнее, 1С:Элемент.Скрипт);
-
OneScript;
-
и даже Сервер взаимодействия.
С чего начать?
Чтобы начать работать с Docker, необходим ряд подготовительных работ:
-
завести аккаунт на https://hub.docker.com/
-
завести аккаунт на https://github.com/
-
обеспечить место для хранения образов – настроить Docker Registry (облачный или свой);
-
установить Docker на компьютер или сервер;
-
и собрать необходимые образы.
Первые два пункта, надеюсь, проблем не вызывают – вы все люди взрослые, аккаунты заводить умеете.
Следующим шагом нужно организовать Docker Registry. Есть два варианта:
-
Арендоваться в любом крупном облачном провайдере: Selectel, Яндекс, Cloud.Ru, цены везде примерно одинаковые.
-
Развернуть у себя Registry локально в Docker по инструкции. Но сразу предупрежу, что этот вариант – для стойких и сильных духом, потому что вы должны самостоятельно продумать авторизацию, резервное копирование и масштабирование. Если вас это не пугает – без проблем, ставьте вручную. Но я человек ленивый, мне проще делегировать эту ответственность и использовать облачное решение.
Далее нужно поставить Docker на ваш компьютер или на сервер. Здесь тоже в зависимости от операционной системы есть два варианта инструкций по установке:
-
на Windows – https://docs.docker.com/desktop/setup/install/windows-install/;
-
на Linux – https://docs.docker.com/engine/install/.
Далее необходимо собрать Docker-образы с 1С, потому что в этом и состоит наша цель. Здесь тоже есть два варианта, один из которых можно условно разделить ещё на два.
- Первый вариант – использовать проект onec-docker от «Первого Бита». Огромное спасибо ребятам, которые его развивают: Никите Федькину, Диме Овчаренко, Егору Иванову и всем причастным. Классный проект, крутые образы, я их сам долгое время использовал.
- Второй вариант – два «велосипеда» от меня: onec-images и oscript-images. Причина их появления – не только в классическом «not invented here», но и в том, что для работы с onec-docker нужно было скачивать себе репозиторий локально и запускать скрипты, причем обязательно в Linux. В общем, много ручной работы, а я ленивый.
Поэтому я решил автоматизировать процесс через GitHub Actions, CI-платформу от GitHub. В результате сделал два собственных проекта, где для получения Docker-образов для вашего Registry достаточно один раз:
-
сделать форк репозитория;
-
включить GitHub Actions;
-
настроить несколько секретов (доступ к ИТС для скачивания релизов, секреты к вашему Registry, и, возможно, API-токен для скачивания дистрибутива 1С:Исполнителя с сайта https://developer.1c.ru).
После этого достаточно повесить специальный тег на последний коммит – и дальше сборка и публикация в Registry нужных вам образов происходит автоматически. Вам остаётся только проверить результат.
Более того, это легко автоматизируется, например, через n8n: можно раз в сутки проверять выход новых версий платформы или EDT, автоматически добавлять теги – и образы будут собираться сами. Для тех, кто любит автоматизацию – это максимально удобный вариант.
Учимся пользоваться Docker

Теперь, когда образы готовы, нужно научиться с ними работать.
Я бы мог пошутить, что всё, что вам нужно – это команда docker help. Но это, увы, не так.
Для авторизации в Registry нам потребуется команда docker login. Без неё вы не сможете скачивать образы из приватных хранилищ. Из публичных – можно скачивать и без авторизации, но если вы захотите публиковать туда свои образы, вам все равно это потребуется.
Тут все просто:
docker login --username username url.my-private-registry.com
Вместо username указываете имя пользователя, вместо url.my-private-registry.com – адрес вашего Registry (если не указать, Docker будет обращаться в Registry по умолчанию – docker.io). После этого вводите пароль или токен – и всё, вы авторизованы.

Дальше нужно скачать образы командой:
docker pull <registry>/<image>:<tag>
Образ скачается в вашу систему.

Дальше вам нужно его запустить. Для этого используется команда:
docker run --rm
-v ./local-path:/container-path
-p local-port:container-port
registry/image:tag
--app-params
Обратите внимание на используемые в команде ключи:
-
--rm – удалить контейнер после завершения;
-
-v – примонтировать папку (volume) для сохранения артефактов после окончания работы локально;
-
-p – пробросить порт наружу, чтобы можно было общаться с приложением внутри контейнера;
-
--app-params – параметры, передаваемые в контейнер.

Если нужно поработать внутри контейнера вручную (например, для отладки), нужно добавить параметр -it для интерактивного запуска и переопределить --entrypoint (точку входа) на консоль bash.
docker run --rm -it
-v ./local-path:/container-path
-p local-port:container-port
--entrypoint bash
registry/image:tag
Запустится консоль для выполнения команд, вы проверите всё, что хотели, выйдете, и контейнер удалится.
Варианты использования 1С и OneScript в Docker
Теперь давайте обсудим, какие варианты использования 1С и OneScript в Docker у нас есть.
-
Самое очевидное – сборка, разборка конфигураций, внешних отчетов, обработок. Уже 100 лет как работает. У меня в CI-контуре все артефакты собираются в Docker без проблем.
-
Конвертация в формат EDT или из формата EDT. Если вы “счастливый” разработчик на EDT, вам для сборки cf необходимо предварительно конвертировать ваши исходники из формата EDT в формат конфигуратора. Docker в этом прекрасно помогает.
-
Запуск автономного сервера – для тестовых баз, API или OData – отлично работает в Docker.
-
Запуск тестов, валидация EDT, статический анализ SonarQube – тоже там работает.
-
И как вариант – запуск и развертывание приложений на OneScript. У меня, например, есть простой сайт-визитка, написанный на OneScript с использованием фреймворка Winow. Он упакован в Docker и крутится где-то на хостинге – я только оплачиваю его регулярно и всё. Мне это никаких проблем не доставляет.
Если вам кажется, что этого мало – на самом деле вариантов использования Docker гораздо больше.
-
Можно, например, поднять веб-сервер: nginx, Apache или такую штуку как reverse proxy, чтобы «прикрыть» ваше приложение и выдать ему HTTPS с SSL-сертификатом.
-
Можно развернуть базы данных для разработки: PostgreSQL, MongoDB, ClickHouse – все это отлично работает в контейнерах.
-
Отдельная история – брокеры сообщений и шины: RabbitMQ, Kafka и подобные. Они буквально созданы для работы в Docker и отлично там себя чувствуют.
-
Для хранения данных можно поднять S3-совместимое хранилище, например, MinIO. Тем более, что платформа 1С уже умеет работать с S3 – давно пора начать этим пользоваться.
-
Или развернуть FTP-сервер: подняли, поиспользовали и погасили.
-
Вы можете развернуть в Docker SonarQube и использовать его для статического анализа кода – это тоже прекрасно работает. Более того, на GitHub даже есть готовый Dockerfile сборки SonarQube со всеми плагинами, которые нужны для 1С – например, у Дмитрия Абрамова.
-
Также можно использовать Docker для MCP-серверов и различных инструментов вокруг LLM – такие решения тоже отлично ложатся в контейнерную модель.
-
Мониторинг? Тоже без проблем: Grafana, Prometheus – все это стандартно запускается в Docker.
-
Ну и, в конце концов, любой иной образ с Docker Hub: там миллионы готовых образов под самые разные задачи. С большой вероятностью вы уже найдёте готовое решение под свои нужды.
Есть и более продвинутые сценарии.
-
Например, GitHub Codespaces – облачная среда разработки VS Code, которая запускается где-то на серверах GitHub и в которой вы можете писать код прямо в вашем браузере. Там в терминале есть возможность запускать Docker. Я экспериментировал: скачал туда свои образы платформы, собрал там конфигурацию Tasks, создал для нее базу и запустил ее на автономном сервере. А потом подключился к ней со своего компьютера по HTTP и поработал. Не уверен, что это стоит делать для продуктива, но для экспериментов – отличный вариант. Вы можете на свой ноутбук вообще ничего не ставить. Запустили браузер и работаете. Это же великолепно.
-
В конце концов, если всё это не подошло, вы можете собрать образ самостоятельно. Синтаксис Dockerfile довольно простой, нейросети его отлично понимают, поэтому, если что, всегда можно написать своё.
Живой пример из актуального
И напоследок – реальный пример.
Мне нужно было получить выгрузки конфигурации в форматах конфигуратора и EDT. Можно было сделать это вручную – потратить значительное время на создание базы, загрузку, выгрузку и конвертацию.
Но я ленивый. И решил приспособить для этого Docker. Всё решение задачи уложилось в три команды.

Первая команда: запускаем контейнер с образом Vanessa Runner, монтируем в него локальную папку и говорим: «Создай файловую базу из DT-файла /tmp/1cv8.dt по пути /tmp/base , и сделай это с помощью автономного сервера, чтобы не мучиться с пробросом лицензии»:
docker run --rm -v /data:/tmp
my-registry/vrunner:8.3.27.1688
init-dev
--dt /tmp/1cv8.dt
--ibconnection "/F/tmp/base"
--ibcmd

Дальше мы запускаем следующий контейнер с Vanessa Runner и просим его декомпилировать эту базу на исходники:
docker run --rm -v /data:/tmp
my-registry/vrunner:8.3.27.1688
decompile -c
-o /tmp/cfg
--ibconnection "/F/tmp/base"
--ibcmd

А последним шагом запускаем образ edtcli (это обертка над EDT) и говорим: «Импортируй конфигурацию из папки /tmp/cfg в воркспейс /tmp/ws и создай для нее проект с именем demo».
docker run --rm -v /data:/tmp
my-registry/edtcli:2024.2.6
-data /tmp/ws
-command import
--configuration-files /tmp/cfg
--project-name demo
И на выходе через 5–10 минут в папке data/ws на хосте получаем готовый проект EDT.
После чего контейнер удаляется, а все артефакты остаются у нас. При этом система остается чистой. Великолепно.
В завершение минутка мотивации
В далеком 2018 году я впервые попал на конференцию Инфостарта. Я тогда был ещё совсем начинающим специалистом, буквально джуном. Ходил по залам, слушал доклады – ребята рассказывали про CI, Docker, другие крутые штуки. В моём понимании я был где-то в каменном веке с каменным топором в руках, а ребята уже запускали космические корабли на околоземную орбиту. Меня это очень сильно вдохновило: я захотел научиться делать так же.
Потом был ковид и период онлайн-митапов, когда я немного выпал из активной жизни.
И вот настал 2023 год. У меня уже собственный CI-контур, который я сам настроил. Что-то смог сделать, запустил свои космические корабли на околоземную орбиту. Я снова приехал на конференцию – а там ребята уже освоили Луну и отправили зонд на Марс. Думаю: «Круто».
Проходит еще пара лет, наступает 2025-й год – и ощущение такое, что люди уже колонию на Марсе строят. Все развивается с невероятной скоростью. Это как в «Алисе в Стране чудес»: “Нам нужно бежать со всех ног, чтобы только оставаться на месте, а чтобы куда-то попасть, надо бежать как минимум вдвое быстрее!” В нашем мире ИТ это ощущается особенно остро: нужно бежать не в два раза быстрее, а в три, в четыре, чтобы только чего-то достичь и не оказаться за бортом истории.
Поэтому я вас призываю: выходите из зоны комфорта, развивайтесь. И Docker вполне может стать той самой первой ступенью, через которую вам стоит переступить.
Вопросы и ответы
Почему вы сравниваете Docker с Terraform, а не с Kubernetes? И нужно ли одинэснику изучать Kubernetes?
Kubernetes – это следующий уровень. Сначала стоит разобраться с Docker, а уже потом двигаться дальше. Мне пока хватает Docker – до Kubernetes я ещё не дошел.
Правильно ли я понимаю, что для взаимодействия с приложением в Docker нужно обращаться к нему через проброшенный порт?
Если речь идет о веб-приложении, то да – через проброшенный порт мы можем открыть его интерфейс прямо у себя в браузере.
Есть ли смысл заворачивать в Docker длительное обновление базы – например, если нужно обновить УТ 2022 года на последний релиз?
Нет, это совсем другая история. Docker больше про сборку, тестирование и воспроизводимость окружения.
Как Windows чувствует себя в Docker?
Есть Windows-контейнеры, но они обычно весят несколько гигабайт и могут не запуститься, если версия Windows внутри контейнера не соответствует версии Windows на хосте. На практике чаще используют Linux-контейнеры – с ними проще и стабильнее.
Насколько сложно работать с лицензиями 1С в Docker?
Здесь есть три варианта:
-
если вы счастливый обладатель многопользовательского аппаратного ключа – все относительно просто: копируете в контейнер ваш файл nethasp.ini с настройками подключения к серверу сетевых ключей, и всё работает.
-
Второй вариант – это проброс программной лицензии.
-
Третий – комьюнити-лицензия.
Но с программной лицензией есть проблема – как только вы запускаете на одной лицензии два контейнера, эта лицензия ломается. Весь смысл от запуска контейнера теряется. Можно запустить только один.
Поэтому наиболее стабильный вариант – это аппаратный ключ, но он встречается нечасто.
Вы рассказывали, что у вас есть GitLab, но при этом используете облачный Registry. Почему не пользуетесь встроенным в GitLab?
Потому что не хочется упираться в ограничения по объему хранилища и доступность сервера. Мой GitLab развернут локально в контуре организации и не доступен извне, а Registry мне нужен и дома, и на работе. Поэтому проще взять облачный и не заниматься его поддержкой самостоятельно.
Есть ли реальные кейсы использования Docker с 1С?
Конечно:
-
веб-серверы для 1С можно разворачивать в контейнерах, чтобы публиковать на них необходимые SOAP, HTTP-сервисы и веб-клиент;
-
тестирование (в том числе массовое, многопоточное) отлично масштабируется через контейнеры – тысячи тестов можно прогонять параллельно за разумное время, чего сложно добиться на обычных машинах.
А как запускать UI-тесты в контейнерах? Им же интерфейс нужен.
В контейнер можно добавить графическую среду. Это позволяет запускать даже сценарные тесты с интерфейсом.
Можно ли доверять тестам, которые прошли на Linux, если заказчик работает на Windows?
Практика показывает, что если работает на Linux – на Windows тоже будет работать. Обратные случаи встречаются крайне редко.
Можно ли публиковать на Docker Hub образы с платформой 1С?
Публиковать образы с платформой 1С в открытом доступе нельзя. Это нарушает лицензионное соглашение 1С. Поэтому используются приватные Registry – либо облачные, либо локальные. Сами образы обычно собираются из дистрибутивов, скачанных с официальных источников, и хранятся в закрытом доступе.
*************
Статья написана по итогам доклада (видео), прочитанного на конференции INFOSTART TECH EVENT.
Вступайте в нашу телеграмм-группу Инфостарт

