Рабочее место 1С на Linux через WSL. Часть 9 - Введение в контейнеризацию: 1С и PostgreSQL в Docker
В предыдущих лабораторных работах мы прошли путь от ручной настройки сервера 1С и СУБД в среде WSL до полной автоматизации развертывания с помощью Bash-скриптов и создания полноценного рабочего места на базе 1С:EDT. Однако традиционный подход к установке служб непосредственно в операционную систему имеет ряд недостатков: сложность масштабирования, проблемы сосуществования разных версий платформы 1С на одном сервере, а также зависимость от окружения хост-системы. Современным стандартом разработки, тестирования и промышленной эксплуатации ИТ-систем является контейнеризация. В этой работе мы сделаем качественный шаг вперед: упакуем сервер 1С:Предприятие и адаптированную СУБД PostgreSQL в изолированные Docker-контейнеры. Мы разберем, как написать оптимальный Dockerfile для сервера 1С, объединить службы в единый контур через docker-compose и решить ключевую проблему контейнеризации 1С - стабильность коммерческого лицензирования в динамической среде.
Теоретическая часть
Почему Docker, а не просто WSL? В отличие от виртуализации уровня ОС (такой как WSL или полноценные виртуальные машины Hyper-V), где под каждый дистрибутив запускается отдельное ядро со своими накладными расходами, Docker использует технологию контейнеризации на базе пространства имен (Namespaces) и контрольных групп (Cgroups) ядра хоста Linux. Контейнеры Docker предоставляют следующие преимущества:
- Изоляция и воспроизводимость: Контейнер содержит внутри себя саму платформу 1С и все её зависимости (библиотеки, шрифты), полностью гарантируя, что если контейнер запустился на машине разработчика, он точно так же без изменений запустится на боевом сервере или в CI/CD раннере.
- Легковесность: Контейнеры запускаются за считанные секунды и потребляют минимум ресурсов, так как делят ядро операционной системы с хостом.
- Декларативное описание: Вся инфраструктура описывается в виде текстовых файлов (Dockerfile, docker-compose.yml), которые можно хранить в Git-репозитории и версионировать вместе с кодом конфигурации. Проблема коммерческого лицензирования 1С в Docker Основная сложность использования «1С:Предприятие» в контейнерах Docker - это механизм привязки программных лицензий. Традиционная программная лицензия 1С привязывается к ключевым параметрам аппаратного обеспечения:
- Имя компьютера (hostname)
- Сетевой MAC-адрес сетевой карты
- UUID материнской платы, параметры процессора и жесткого диска. В Docker-контейнерах по умолчанию сетевой интерфейс создается виртуально для каждого контейнера заново, имя хоста генерируется динамически (случайный хеш ID контейнера), а UUID виртуального диска может меняться при каждом пересоздании контейнера. Это неизбежно ведет к слету программной лицензии 1С при первой же перезагрузке или обновлении контейнера. Для сохранения стабильности лицензирования в динамическом окружении применяют несколько подходов:
- Использование параметра --net=host: Контейнер 1С запускается непосредственно в сетевом пространстве хоста, используя его реальный MAC-адрес и сетевую карту без виртуальной изоляции.
- Монтирование постоянных директорий (Volumes): Пути хранения файлов лицензий (.lic), а также уникальных идентификаторов и параметров кластера должны быть вынесены на физический диск хоста.
- Фиксация параметров контейнера: В конфигурации docker-compose принудительно задаются статические параметры hostname и параметры сетевого интерфейса (mac-address).
Пошаговая инструкция
Шаг 1. Установка Docker и Docker Compose в WSL
Для начала нам необходимо установить Docker-окружение внутри нашего WSL-дистрибутива (Ubuntu или Astra Linux).
- Удалите старые версии, если они были установлены:
sudo apt remove -y docker docker-engine docker.io containerd runc
- Установите необходимые пакеты для работы с репозиторием по HTTPS:
sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl gnupg lsb-release
- Добавьте официальный GPG-ключ Docker:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o
/usr/share/keyrings/docker-archive-keyring.gpg
- Подключите стабильный репозиторий Docker:
echo "deb [arch=$(dpkg --print-architecture)
signed-by=/usr/share/keyrings/docker-archive-keyring.gpg]
https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee
/etc/apt/sources.list.d/docker.list > /dev/null
- Установите Docker Engine и Docker Compose:
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
- Добавьте своего пользователя в группу docker, чтобы запускать контейнеры без sudo:
sudo usermod -aG docker $USER
Внимание: Перезапустите терминал WSL, чтобы изменения прав вступили в силу.
Шаг 2. Создание структуры проекта
Создадим рабочую директорию проекта для контейнеризованного окружения 1С:
mkdir -p ~/docker-1c/distr
mkdir -p ~/docker-1c/config
cd ~/docker-1c
Поместите дистрибутивы сервера 1С (DEB-пакеты, скачанные ранее в папку C:\TMP_C) в каталог distr:
cp /mnt/c/TMP_C/1c-enterprise83-*.deb ~/docker-1c/distr/
Шаг 3. Написание оптимального Dockerfile для сервера 1С
В каталоге ~/docker-1c создайте файл с именем Dockerfile:
nano Dockerfile
Вставьте следующее содержимое: # Используем базовый официальный образ Ubuntu
FROM ubuntu:20.04
# Отключаем интерактивный режим установки пакетов (защита от зависания EULA)
ENV DEBIAN_FRONTEND=noninteractive
# Устанавливаем русскую локализацию и системные зависимости 1С
RUN apt-get update && apt-get install -y \
locales \
libwebkitgtk-3.0-0 \
libmagickwand-6.q16-6 \
libfontconfig1 \
libfreetype6 \
libgsf-1-common \
libglib2.0-0 \
unixodbc \
libkrb5-3 \
libgssapi-krb5-2 \
wget \
&& rm -rf /var/lib/apt/lists/*
# Генерация русской локали (необходима для корректного запуска 1С)
RUN locale-gen ru_RU.UTF-8
ENV LANG ru_RU.UTF-8
ENV LANGUAGE ru_RU:ru
ENV LC_ALL ru_RU.UTF-8
# Установка шрифтов Microsoft TrueType (EULA обходится автоматически)
RUN echo "ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true" |
debconf-set-selections \
&& apt-get update && apt-get install -y ttf-mscorefonts-installer \
&& fc-cache -fv \
&& rm -rf /var/lib/apt/lists/*
# Создаем пользователя usr1cv8, под которым будет работать сервер 1С
RUN groupadd -g 1001 grp1cv8 && \
useradd -u 1001 -g grp1cv8 -m -s /bin/bash usr1cv8
# Копируем дистрибутивы 1С внутрь контейнера и устанавливаем их
COPY ./distr/1c-enterprise83-common_*.deb /tmp/
COPY ./distr/1c-enterprise83-server_*.deb /tmp/
COPY ./distr/1c-enterprise83-ws_*.deb /tmp/
RUN dpkg -i /tmp/1c-enterprise83-common_*.deb \
&& dpkg -i /tmp/1c-enterprise83-server_*.deb \
&& dpkg -i /tmp/1c-enterprise83-ws_*.deb \
&& rm -f /tmp/*.deb
# Настраиваем каталог для хранения логов и лицензий 1С снаружи контейнера
VOLUME ["/home/usr1cv8/.1cv8"]
# Открываем порты сервера 1С (ragent, rmngr, rphost range)
EXPOSE 1540 1541 1560-1591
# Переключаемся на запуск от имени пользователя usr1cv8
USER usr1cv8
# Точка входа запускает ragent напрямую в фоновом/консольном режиме (не daemon)
CMD ["/opt/1C/v8.3/x86_64/ragent", "-debug"]
Нажмите Ctrl+O и Ctrl+X для сохранения.
Шаг 4. Написание docker-compose.yml для связки серверов
Для одновременного запуска СУБД PostgreSQL и сервера 1С воспользуемся утилитой Docker Compose. Создайте файл docker-compose.yml:
nano docker-compose.yml
Вставьте конфигурацию: version: '3.8' services:
postgres-1c:
image: postgres:11-alpine # Используем оптимизированный alpine-образ СУБД
container_name: postgres-1c
environment:
POSTGRES_DB: tempdb
POSTGRES_USER: postgres
POSTGRES_PASSWORD: "strong_password_1111"
volumes:
- pg_data:/var/lib/postgresql/data
ports:
- "5432:5432"
restart: always
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
timeout: 5s
retries: 5
server-1c:
build: .
container_name: server-1c
hostname: server-1c-host # Фиксируем имя хоста для стабильности лицензирования mac_address: "02:42:ac:11:00:02" # Фиксируем MAC-адрес
ports:
- "1540:1540"
- "1541:1541"
- "1560-1591:1560-1591"
volumes:
- ./config:/home/usr1cv8/.1cv8 # Пробрасываем каталог с лицензиями и настройками кластера
depends_on:
postgres-1c:
condition: service_healthy # Сервер 1С стартует строго ПОСЛЕ полной готовности СУБД
restart: always
volumes:
pg_data:
Практическое задание
Цель работы: Собрать контейнеризованное окружение «Сервер 1С + PostgreSQL», обеспечить персистентность данных при пересоздании контейнеров и проверить работоспособность кластера. Задание:
- ☐ Выполните сборку образа сервера 1С на основе созданного Dockerfile:
docker compose build
- ☐ Запустите СУБД и сервер 1С в фоновом режиме:
docker compose up -d
- ☐ Проверьте статус запущенных контейнеров и логов инициализации:
docker compose ps
docker compose logs server-1c
- ☐ С помощью оснастки администрирования 1С на Windows (или утилиты rac из Работы 4) подключитесь к контейнеризированному кластеру server-1c-host по порту 1540 и создайте новую информационную базу.
- ☐ Проведите симуляцию отказа системы: остановите и удалите контейнеры с помощью команды docker compose down.
- ☐ Снова поднимите систему через docker compose up -d и убедитесь, что созданная вами информационная база не исчезла, а данные успешно сохранились благодаря примонтированным томам (pg_data и локальному каталогу ./config).
Проверьте себя
- Почему стандартный перезапуск контейнера Docker без дополнительных параметров может привести к деактивации программной лицензии 1С? Ответ: При стандартном перезапуске или пересоздании контейнера Docker динамически переназначает MAC-адрес сетевой карты и имя хоста (hostname). Так как программная лицензия 1С привязывается к этим аппаратным характеристикам, изменение сетевых параметров расценивается системой защиты как смена компьютера, что деактивирует лицензию. Для обхода этой проблемы параметры жестко фиксируются в docker-compose.yml (mac_address и hostname), либо используется сетевой режим --net=host.
- Зачем в Docker-контейнере сервера 1С на базе Linux обязательно требуется генерация и включение локали ru_RU.UTF-8? Ответ: Платформа «1С:Предприятие» критически зависит от системной локали для корректного сопоставления типов данных, сортировки таблиц, разбора дат и отображения кириллицы. Если в базовом контейнере отсутствует русская UTF-8 локаль, сервер 1С либо откажется запускаться, либо будет функционировать некорректно, вызывая системные сбои СУБД.
- Что делает директива VOLUME ["/home/usr1cv8/.1cv8"] в Dockerfile сервера 1С? Ответ: Данная директива объявляет точку монтирования постоянного дискового хранилища. По этому пути сервер 1С хранит файлы конфигурации кластера, список зарегистрированных баз данных, а также файлы активированных лицензий (.lic). Без использования Volume вся эта информация удалялась бы вместе с контейнером при его обновлении или перезапуске.
- Какую роль играет блок healthcheck у сервиса СУБД в связке с depends_on в docker-compose.yml? Ответ: Простая директива depends_on гарантирует только запуск процесса PostgreSQL, но не его внутреннюю готовность принимать сетевые соединения. Блок healthcheck с помощью утилиты pg_isready проверяет, что СУБД действительно готова к работе, а флаг condition: service_healthy задерживает запуск сервера 1С до тех пор, пока тест СУБД не завершится успехом, предотвращая падение службы 1С из-за отсутствия базы.
- Как запустить контейнер сервера 1С так, чтобы он не изолировался в собственной виртуальной подсети, а использовал сетевой стек хоста? Ответ: Для этого в файле настроек docker-compose.yml у сервиса 1С необходимо указать параметр network_mode: "host". В этом случае порты контейнера будут напрямую сопоставлены с портами хост-системы без необходимости их явной публикации (директивы ports), что также решает проблему с динамическим изменением MAC-адресов.
Попробовать НОПик →
Проверить свой уровень бесплатно →