מדוע Docker היא הבחירה הטובה ביותר עבור 1С-Bitrix?
תארו לעצמכם חנות מסחר אלקטרוני מבוססת Bitrix עם קטלוג של 100,000 מוצרים. BitrixVM קורסת תחת עומס שיא, והקמת סביבת פיתוח היא סאגה. זהו תרחיש מוכר. פתרנו אותו עם Docker. אין תמונת Docker רשמית מ-1С-Bitrix, למרות ש-BitrixVM היא הסביבה המומלצת היחידה (מקור: helpdesk.bitrix24.ru). בפועל, זה אומר ש-כל פריסת Docker היא עבודה ידנית עם פשרות. אבל התוצאה שווה את זה: סביבה זהה מפיתוח ועד ייצור, בידוד תלויות, והיכולת להריץ את אותו פרויקט על מחשב נייד, ב-CI, ובייצור. צברנו ניסיון בהגדרת Docker עבור Bitrix על עשרות פרויקטים במשך 7+ שנים. המעבר ל-Docker מפחית את עלויות התשתית פי 2–3 בהשוואה ל-BitrixVM על שרת ייעודי.
אילו בעיות Docker פותרת?
Bitrix דורשת גרסאות PHP ספציפיות (8.1–8.2 למהדורות הנוכחיות) והרחבות ספציפיות (iconv, mbstring, gd, opcache, memcached). כתיבה למערכת הקבצים סותרת את הרעיון של קונטיינרים בלתי ניתנים לשינוי. BitrixVM מסתגלת בצורה גרועה ל-CI/CD מודרני וארכיטקטורות מיקרוסרוויסים. טעויות אופייניות בהגדרה עצמית כוללות הגדרות OPcache שגויות, חוסר בקאש מתויג, ומנהל סשן שגוי (קבצים במקום Memcached). Docker פותרת בעיות אלה: כל שירות מבודד, התצורה מנוהלת בגרסאות, והסביבה ניתנת לשחזור בפקודה אחת. בנוסף, Docker מפחיתה את זמני הבנייה ב-CI/CD ב-30%, ומקצצת בעלויות הפיתוח ב-20–30%.
כיצד להגדיר PHP-FPM עבור Bitrix?
אנו מתכננים ארכיטקטורת ריבוי קונטיינרים: Nginx + PHP-FPM + MySQL + Memcached + Elasticsearch (או OpenSearch). הליבה היא Dockerfile מותאם אישית עבור PHP-FPM עם ההרחבות הנדרשות ו-php.ini מותאם.
מבנה 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 расширения, требуемые Битрикс
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
WORKDIR /var/www/html
ARG UID=1000
RUN adduser -u $UID -D -S -G www-data bitrix
USER bitrix
תצורת PHP עבור Bitrix
; 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"עבור PHP 8.1, אנו משתמשים ב-PHP-FPM בשילוב עם Nginx לביצועים גבוהים.
כיצד לפתור את בעיית הקבצים עם מצב (Stateful Files)?
Bitrix מאחסנת קבצים שהועלו (# 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: ), קאש (# 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 расширения, требуемые Битрикс 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 WORKDIR /var/www/html ARG UID=1000 RUN adduser -u $UID -D -S -G www-data bitrix USER bitrix ), ותצורה (; 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" ). הגישה הטובה ביותר היא אחסון תואם S3 עבור העלאות, מה שהופך את הקונטיינרים לחסרי מצב. אם S3 אינו זמין, השתמשו ב-volumes בעלי שם או bind mounts עם גיבויים קבועים.
מדוע Docker מהירה יותר מ-BitrixVM בפיתוח?
| קריטריון | Docker | BitrixVM |
|---|---|---|
| שחזור סביבה | מלא (באמצעות compose ו-Dockerfile) | רק סביבה אחת |
| קנה מידה של שירותים | בנפרד | רק יחד |
| אינטגרציית CI/CD | טבעית | דורשת שינויים |
| בידוד תלויות | מלא (קונטיינרים) | חלקי (וירטואליזציה) |
| מהירות פריסה לפיתוח | 2–3 ימים | 1–2 שעות |
| מהירות פריסה לייצור | 7–14 ימים | 1–2 שעות |
| גמישות תצורה | גבוהה | נמוכה |
סביבת Docker רצה 30% מהר יותר ב-CI/CD בהשוואה ל-BitrixVM. זה בולט במיוחד עם פריסות תכופות.
גרסאות PHP מומלצות למהדורות Bitrix שונות
| מהדורת Bitrix | גרסת PHP | סטטוס |
|---|---|---|
| Start / עסק קטן | 8.1 | נתמך |
| Business / Enterprise | 8.2 | מומלץ |
| פרויקטים legacy | 7.4 | הגירה בלבד |
תהליך העבודה
- ניתוח: בחינת התשתית הנוכחית, העומס, דרישות הקאש והאחסון.
- עיצוב: פיתוח docker-compose.yml, Dockerfile, קובצי תצורת Nginx, php.ini, my.cnf.
- יישום: פריסת הסביבה בפיתוח, הגדרת קאש מתויג, Memcached, Elasticsearch.
- אינטגרציה: חיבור צינור CI/CD (GitLab CI / GitHub Actions), ניטור ורישום מרכזי.
- בדיקות: אימות פונקציונליות, ביצוע בדיקות עומס.
- פריסה: מעבר לייצור עם הבטחות לסבילות לתקלות.
מה כלול בעבודה
- הכנת סביבת Docker (Compose, PHP, Nginx, MySQL, Memcached, Elasticsearch)
- הגדרת צינור CI/CD (בנייה, בדיקות, פריסה)
- אינטגרציית S3 לאחסון קבצים (אופציונלי)
- תיעוד לפריסה ותפעול
- העברת גישה ומאגר הקוד
- הדרכת הצוות על סביבת Docker
טעויות אופייניות בהגדרת Docker עבור Bitrix
- מנהל סשן שגוי: Bitrix משתמשת בקבצים כברירת מחדל, מה שמוביל לשגיאות כתיבה ב-Docker. הגדירו Memcached.
- OPcache: בלעדיו, דפים נוצרים מחדש בכל בקשה. הפעילו אותו והגדירו memory_consumption.
- חוסר healthcheck: קונטיינר MySQL עשוי לא להיות מוכן, מה שמונע מ-PHP להתחבר. הוסיפו condition: service_healthy.
- הרשאות שגויות: קבצים חייבים להיות שייכים למשתמש bitrix בתוך הקונטיינר. השתמשו בארגומנט UID.
- רישום לקבצים: השתמשו ב-php://stderr לאיסוף באמצעות מנהל הרישום של Docker.
ציר זמן ועלות
סביבת Docker בסיסית לפיתוח — 2–3 ימים. תצורה מוכנה לייצור עם CI/CD, ניטור ו-S3 לקבצים — 7–14 ימים. העלות מחושבת באופן אישי. בקשו ייעוץ להערכת הפרויקט שלכם — קבלו ייעוץ ממומחה מוסמך. צרו קשר כדי להעריך את הפרויקט שלכם: נעזור לכם ליישם Docker ולהפחית עלויות תשתית.

