Рабочее место 1С на Linux через WSL. Часть 9 - Введение в контейнеризацию: 1С и PostgreSQL в Docker | infolimp.ru

Рабочее место 1С на Linux через WSL. Часть 9 - Введение в контейнеризацию: 1С и PostgreSQL в Docker

6 сентября 2026 · infolimp.ru

В предыдущих лабораторных работах мы прошли путь от ручной настройки сервера 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. Изоляция и воспроизводимость: Контейнер содержит внутри себя саму платформу 1С и все её зависимости (библиотеки, шрифты), полностью гарантируя, что если контейнер запустился на машине разработчика, он точно так же без изменений запустится на боевом сервере или в CI/CD раннере.
  2. Легковесность: Контейнеры запускаются за считанные секунды и потребляют минимум ресурсов, так как делят ядро операционной системы с хостом.
  3. Декларативное описание: Вся инфраструктура описывается в виде текстовых файлов (Dockerfile, docker-compose.yml), которые можно хранить в Git-репозитории и версионировать вместе с кодом конфигурации. Проблема коммерческого лицензирования 1С в Docker Основная сложность использования «1С:Предприятие» в контейнерах Docker - это механизм привязки программных лицензий. Традиционная программная лицензия 1С привязывается к ключевым параметрам аппаратного обеспечения:
  1. Использование параметра --net=host: Контейнер 1С запускается непосредственно в сетевом пространстве хоста, используя его реальный MAC-адрес и сетевую карту без виртуальной изоляции.
  2. Монтирование постоянных директорий (Volumes): Пути хранения файлов лицензий (.lic), а также уникальных идентификаторов и параметров кластера должны быть вынесены на физический диск хоста.
  3. Фиксация параметров контейнера: В конфигурации docker-compose принудительно задаются статические параметры hostname и параметры сетевого интерфейса (mac-address).

Пошаговая инструкция

Шаг 1. Установка Docker и Docker Compose в WSL

Для начала нам необходимо установить Docker-окружение внутри нашего WSL-дистрибутива (Ubuntu или Astra Linux).

  1. Удалите старые версии, если они были установлены:
sudo apt remove -y docker docker-engine docker.io containerd runc
  1. Установите необходимые пакеты для работы с репозиторием по HTTPS:
sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl gnupg lsb-release
  1. Добавьте официальный GPG-ключ Docker:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o
/usr/share/keyrings/docker-archive-keyring.gpg
  1. Подключите стабильный репозиторий 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
  1. Установите Docker Engine и Docker Compose:
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
  1. Добавьте своего пользователя в группу 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», обеспечить персистентность данных при пересоздании контейнеров и проверить работоспособность кластера. Задание:

docker compose build
docker compose up -d
docker compose ps
docker compose logs server-1c

Проверьте себя

  1. Почему стандартный перезапуск контейнера Docker без дополнительных параметров может привести к деактивации программной лицензии 1С? Ответ: При стандартном перезапуске или пересоздании контейнера Docker динамически переназначает MAC-адрес сетевой карты и имя хоста (hostname). Так как программная лицензия 1С привязывается к этим аппаратным характеристикам, изменение сетевых параметров расценивается системой защиты как смена компьютера, что деактивирует лицензию. Для обхода этой проблемы параметры жестко фиксируются в docker-compose.yml (mac_address и hostname), либо используется сетевой режим --net=host.
  2. Зачем в Docker-контейнере сервера 1С на базе Linux обязательно требуется генерация и включение локали ru_RU.UTF-8? Ответ: Платформа «1С:Предприятие» критически зависит от системной локали для корректного сопоставления типов данных, сортировки таблиц, разбора дат и отображения кириллицы. Если в базовом контейнере отсутствует русская UTF-8 локаль, сервер 1С либо откажется запускаться, либо будет функционировать некорректно, вызывая системные сбои СУБД.
  3. Что делает директива VOLUME ["/home/usr1cv8/.1cv8"] в Dockerfile сервера 1С? Ответ: Данная директива объявляет точку монтирования постоянного дискового хранилища. По этому пути сервер 1С хранит файлы конфигурации кластера, список зарегистрированных баз данных, а также файлы активированных лицензий (.lic). Без использования Volume вся эта информация удалялась бы вместе с контейнером при его обновлении или перезапуске.
  4. Какую роль играет блок healthcheck у сервиса СУБД в связке с depends_on в docker-compose.yml? Ответ: Простая директива depends_on гарантирует только запуск процесса PostgreSQL, но не его внутреннюю готовность принимать сетевые соединения. Блок healthcheck с помощью утилиты pg_isready проверяет, что СУБД действительно готова к работе, а флаг condition: service_healthy задерживает запуск сервера 1С до тех пор, пока тест СУБД не завершится успехом, предотвращая падение службы 1С из-за отсутствия базы.
  5. Как запустить контейнер сервера 1С так, чтобы он не изолировался в собственной виртуальной подсети, а использовал сетевой стек хоста? Ответ: Для этого в файле настроек docker-compose.yml у сервиса 1С необходимо указать параметр network_mode: "host". В этом случае порты контейнера будут напрямую сопоставлены с портами хост-системы без необходимости их явной публикации (директивы ports), что также решает проблему с динамическим изменением MAC-адресов.
Расширение «НОПик» для 1С — встраиваемый коннектор к внешнему AI с интеллектуальным поиском по базе. Задавайте вопросы обычными словами - AI сам найдёт нужное. 45 дней бесплатно.

Попробовать НОПик →
Знаете ответ на такие вопросы не хуже автора статьи? Пройдите бесплатную анонимную проверку уровня на infolimp.ru - 3 практических задачи, 15 минут, публичный токен-профиль, который можно показать работодателю или заказчику. Без регистрации по почте.

Проверить свой уровень бесплатно →