Розгортання 1С-Бітрікс у Docker
Розгортання 1С-Бітрікс у Docker
Офіційна позиція 1С-Бітрікс щодо Docker: «використовуйте BitrixVM». На практиці це означає, що Docker-розгортання потребує ручного налаштування — немає офіційного образу, немає docker-compose від вендора. Зате дає відтворюване середовище, ізоляцію залежностей і можливість однаково запускати проект на ноутбуці розробника, у CI/CD і на production.
Головний нюанс: 1С-Бітрікс вимагає конкретні версії PHP (8.1–8.2 для актуальних редакцій), специфічні PHP-розширення (iconv, mbstring, gd, opcache, memcached), і запис у файлову систему — що суперечить принципу immutable containers. Вирішувано, але з розумінням компромісів.
Структура Docker Compose
# docker-compose.yml
version: '3.9'
services:
nginx:
image: nginx:1.24-alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d:ro
- ./nginx/ssl:/etc/nginx/ssl:ro
- bitrix_files:/var/www/html
depends_on:
- php-fpm
php-fpm:
build: ./docker/php
volumes:
- bitrix_files:/var/www/html
- ./docker/php/php.ini:/usr/local/etc/php/conf.d/bitrix.ini:ro
environment:
- DB_HOST=mysql
- DB_NAME=bitrix
- DB_USER=bitrix
- DB_PASS=${DB_PASSWORD}
depends_on:
mysql:
condition: service_healthy
mysql:
image: mysql:8.0
environment:
MYSQL_DATABASE: bitrix
MYSQL_USER: bitrix
MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
volumes:
- mysql_data:/var/lib/mysql
- ./docker/mysql/my.cnf:/etc/mysql/conf.d/bitrix.cnf:ro
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5
memcached:
image: memcached:1.6-alpine
command: memcached -m 512 -I 32m
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0
environment:
- discovery.type=single-node
- ES_JAVA_OPTS=-Xms512m -Xmx512m
- xpack.security.enabled=false
volumes:
- es_data:/usr/share/elasticsearch/data
volumes:
bitrix_files:
mysql_data:
es_data:
Dockerfile для PHP-FPM
# docker/php/Dockerfile
FROM php:8.1-fpm-alpine
# Залежності для розширень
RUN apk add --no-cache \
freetype-dev libjpeg-turbo-dev libpng-dev libwebp-dev \
libzip-dev libxml2-dev oniguruma-dev \
icu-dev libmemcached-dev zlib-dev
# PHP розширення, потрібні 1С-Бітрікс
RUN docker-php-ext-configure gd \
--with-freetype --with-jpeg --with-webp \
&& docker-php-ext-install -j$(nproc) \
gd mbstring opcache pdo_mysql mysqli \
xml zip intl bcmath exif
# Memcached через PECL
RUN pecl install memcached \
&& docker-php-ext-enable memcached
# Redis через PECL
RUN pecl install redis \
&& docker-php-ext-enable redis
# OPcache
RUN docker-php-ext-install opcache
WORKDIR /var/www/html
# Створюємо користувача з таким самим UID як на хості
ARG UID=1000
RUN adduser -u $UID -D -S -G www-data bitrix
USER bitrix
Конфігурація PHP для 1С-Бітрікс
; docker/php/php.ini
memory_limit = 256M
upload_max_filesize = 256M
post_max_size = 256M
max_execution_time = 90
; OPcache
opcache.enable = 1
opcache.memory_consumption = 128
opcache.max_accelerated_files = 10000
opcache.validate_timestamps = 1
opcache.revalidate_freq = 2
; Сесії через Memcached
session.save_handler = memcached
session.save_path = "memcached:11211"
Вирішення проблеми stateful файлів
1С-Бітрікс зберігає у файловій системі: завантажені файли (upload/), кеш (bitrix/cache/), конфігурацію (.settings.php). Стратегії:
Named volumes (вище у docker-compose) — дані живуть у Docker volume, переживають пересоздання контейнерів. Проблема: перенесення даних між хостами потребує volume backup.
Bind mounts для даних, named volume для коду:
volumes:
- ./src:/var/www/html:ro # код (read-only)
- uploads_data:/var/www/html/upload # завантаження
- cache_data:/var/www/html/bitrix/cache # кеш
S3 для upload — найбільш cloud-native підхід. 1С-Бітрікс підтримує S3-сумісні сховища через модуль. Контейнери стають дійсно stateless.
CI/CD з Docker
# .github/workflows/deploy.yml (фрагмент)
deploy:
steps:
- name: Build PHP image
run: docker build -t registry.example.com/bitrix-php:${{ github.sha }} ./docker/php
- name: Push to registry
run: docker push registry.example.com/bitrix-php:${{ github.sha }}
- name: Deploy to production
run: |
ssh deploy@prod "
cd /opt/bitrix &&
docker-compose pull &&
docker-compose up -d --no-deps php-fpm nginx &&
docker-compose exec php-fpm php /var/www/html/bitrix/modules/main/cli/healthcheck.php
"
Специфіка production
Логи. Bitrix пише логи у файли. У Docker логи мають іти в stdout/stderr для збирання через Docker logging driver:
// /bitrix/php_interface/init.php
define('LOG_FILENAME', 'php://stderr');
Завдання за розкладом (агенти). Cron всередині контейнера або окремий контейнер:
cron:
build: ./docker/php
volumes:
- bitrix_files:/var/www/html
command: crond -f -d 8
Налагодження. Xdebug лише у development-збірці:
# docker/php/Dockerfile.dev
FROM registry.example.com/bitrix-php:latest
RUN pecl install xdebug && docker-php-ext-enable xdebug
COPY xdebug.ini /usr/local/etc/php/conf.d/
Терміни
Базове Docker-середовище для розробки — 2–3 дні. Production-ready конфігурація з CI/CD, моніторингом і S3 для файлів — 7–14 днів.







