Универсальный Docker-окружение для разработки и деплоя сайтов на базе 1C-Bitrix CMS.
# 1. Скопируйте шаблоны конфигурационных файлов
cp .env.example .env
cp nginx/nginx.conf.example nginx/nginx.conf
cp nginx/bitrix.conf.example nginx/bitrix.conf
cp php/php.ini.example php/php.ini
cp php/opcache.ini.example php/opcache.ini
cp mysql/conf.d/bitrix.cnf.example mysql/conf.d/bitrix.cnf
# 2. Отредактируйте конфигурацию под свой проект
nano .env # пароли, имя БД
nano nginx/bitrix.conf # root — путь к проекту в www/
# 3. Соберите и запустите
docker compose build
docker compose up -d
# 4. Проверьте статус
docker compose psПосле запуска сайт будет доступен на http://localhost.
Файлы Bitrix размещаются в папке www/ (каждый проект — отдельная подпапка).
Проект выбирается директивой root в nginx/bitrix.conf:
root /var/www/myproject.ru;Для смены проекта достаточно изменить эту строку и перезапустить nginx:
docker compose restart nginx.
├── Dockerfile # PHP-FPM образ для 1C-Bitrix
├── docker-compose.yml # Оркестрация всех сервисов
├── .dockerignore # Исключения из контекста сборки
├── .env.example # Шаблон переменных окружения
├── nginx/
│ ├── nginx.conf.example # Шаблон основного конфига nginx
│ └── bitrix.conf.example # Шаблон виртуального хоста для Bitrix
├── php/
│ ├── php.ini.example # Шаблон настроек PHP
│ └── opcache.ini.example # Шаблон настроек OPcache
├── mysql/
│ └── conf.d/
│ └── bitrix.cnf.example # Шаблон настроек MySQL/Percona
├── www/ # Документ-корень (git-репозитории с Bitrix)
└── certs/ # SSL-сертификаты (fullchain.pem, privkey.pem)
Примечание: Конфигурационные файлы (
.conf,.ini,.cnf) не хранятся в git. При первом запуске скопируйте шаблоны (.example) в рабочие файлы.
| Сервис | Образ | Порт | Описание |
|---|---|---|---|
nginx |
nginx:stable-alpine |
80, 443 | Веб-сервер, раздача статики, проксирование на PHP |
php |
Сборка из Dockerfile | 9000 (внутр.) | PHP-FPM с расширениями для Bitrix |
mysql |
percona/percona-server:8.0 |
3306 (внутр.) | СУБД для хранения данных Bitrix |
memcached |
memcached:alpine |
11211 (внутр.) | Кэш данных (2048 МБ) |
memcached-sessions |
memcached:alpine |
11211 (внутр.) | Хранение PHP-сессий (128 МБ) |
| Переменная | По умолчанию | Описание |
|---|---|---|
MYSQL_ROOT_PASSWORD |
rootpassword |
Пароль root-пользователя MySQL |
MYSQL_DATABASE |
bitrix |
Имя базы данных |
MYSQL_USER |
bitrix |
Имя пользователя MySQL |
MYSQL_PASSWORD |
bitrixpassword |
Пароль пользователя MySQL |
В Dockerfile и docker-compose.yml версия PHP задаётся через аргумент сборки:
# Собрать с PHP 8.4
docker compose build --build-arg PHP_VERSION=8.4
# Или изменить в docker-compose.yml永久но
# args:
# PHP_VERSION: "8.4"Поддерживаемые версии: 8.2, 8.3, 8.4 (и любые другие доступные в официальном образе php).
В Dockerfile по умолчанию установлен Europe/Moscow. Измените через переменную TZ в docker-compose.yml:
environment:
TZ: Europe/Samara# Запуск всех сервисов
docker compose up -d
# Остановка
docker compose down
# Перезапуск (с пересборкой образов)
docker compose up -d --build
# Просмотр логов
docker compose logs -f
docker compose logs -f php
docker compose logs -f nginx
# Статус сервисов
docker compose ps# Shell в контейнере PHP
docker compose exec php bash
# Shell в контейнере MySQL
docker compose exec mysql mysql -u bitrix -p
# Выполнение команды в PHP
docker compose exec php php -v
docker compose exec php php -m# Экспорт
docker compose exec mysql mysqldump -u root -p bitrix > backup.sql
# Импорт
docker compose exec -T mysql mysql -u root -p bitrix < backup.sql
# Подключение
docker compose exec mysql mysql -u bitrix -p bitrix# Очистка кэша Memcached
docker compose exec memcached echo "flush_all" | nc localhost 11211
# Очистка кэша сессий
docker compose exec memcached-sessions echo "flush_all" | nc localhost 11211Core:
mbstring, gd, xml, curl, zip, intl, bcmath, soap, sockets, exif, sodium, opcache, pdo_mysql, mysqli, xsl, bz2, pcntl
Дополнительные:
imagick, redis, memcached, apcu, igbinary, msgpack
Отредактируйте Dockerfile и добавьте нужные расширения:
# Установка через docker-php-ext-install
RUN docker-php-ext-install -j$(nproc) \
ftp \
imap \
ldap
# Установка через PECL
RUN pecl install ssh2-1.3.1 \
&& docker-php-ext-enable ssh2# Посмотреть доступные для установки
docker compose exec php apt-cache search php | grep extension
# Посмотреть установленные
docker compose exec php php -m-
Положите сертификаты в папку
certs/:certs/ ├── fullchain.pem └── privkey.pem -
Раскомментируйте HTTPS-блок в
nginx/bitrix.conf:server { listen 443 ssl http2; server_name yourdomain.com; ssl_certificate /etc/nginx/certs/fullchain.pem; ssl_certificate_key /etc/nginx/certs/privkey.pem; # ... остальные настройки }
-
Перезапустите nginx:
docker compose restart nginx
Для тестирования можно сгенерировать самоподписанный сертификат:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout certs/privkey.pem \
-out certs/fullchain.pem- Невидимый пользователь — PHP-FPM работает от имени
appuser(UID 1000), не от root - Блокировка опасных функций —
exec,shell_exec,system,passthru,proc_open,popen - Защита директорий — запрет доступа к
/bitrix/modules,/bitrix/php_interface,/.git,/.env - Security-заголовки —
X-Frame-Options,X-Content-Type-Options,X-XSS-Protection,Referrer-Policy - Rate limiting — ограничение частоты запросов к AJAX-эндпоинтам
- OPcache —
validate_timestamps=0(контейнер неизменяем, файлы не проверяются) - Сессии —
httponly,samesite=Lax,strict_mode=1, хранение в Memcached - Серверные токены —
server_tokens off(версия nginx скрыта) - PHP скрыт —
expose_php = Off - SSL — поддержка TLS 1.2/1.3, HSTS-заголовки
- Смените все пароли в
.envна уникальные - Включите SSL и настройте редирект HTTP → HTTPS
- Настройте
opcache.validate_timestamps=0(уже включено по умолчанию) - Ограничьте доступ к серверу через firewall
- Настройте регулярные бэкапы MySQL
- Мониторьте логи:
docker compose logs -f --tail=100
# Проверьте статус сервисов
docker compose ps
# Проверьте логи
docker compose logs nginx
docker compose logs phpPHP-FPM недоступен. Проверьте, запущен ли контейнер php:
docker compose ps php
docker compose logs php# Проверьте, готов ли MySQL
docker compose logs mysql | grep "ready for connections"
# Подождите 30-60 секунд после первого запуска- Увеличьте
memory_limitвphp/php.ini - Увеличьте
innodb_buffer_pool_sizeвmysql/conf.d/bitrix.cnf - Проверьте, включён ли OPcache:
docker compose exec php php -i | grep opcache
# Исправьте права на директорию www
docker compose exec php chown -R appuser:appuser /var/www/htmlУбедитесь, что Docker установлен и запущен:
docker --version
docker compose version