Установка Bitrix Environment в Docker
Готовый код можно скачать в моем репозитории на GitFlic. Создадим какую нибудь папку, где будет лежать наш проект, в ней нам нужно будет создать вот такие папки и файлы:
databases
файлы наших баз данныхdb
директивы и инструкции для базы данныхhtml
файлы наших проектовweb
файлы конфигурацииdocker-compose.yml
файл конфига, который соберет все в кучу
databases/
db/
mysql.cnf
Dockerfile
html/
site.loc/
logs/
mail/
public_html/
index.php
web/
Dockerfile
mail.php
opcache.ini
php.ini
sites.conf
xdebug.ini
docker-compose.yml
Директория databases
Дириктория ./databases/
- это папка в нашем проекте, куда будем складывать файлы базы.
По идее, можно держать базу внутри контейнера, но удобнее вытащить в свою ОС. Например, так можно будет делать бэкапы и использовать одну и ту же базу в разных проектах.
Директория db
Дириктория ./db/
- это папка в нашем проекте, с установочным файлом Dockerfile
базы данных и конфигом mysql.cnf
:
#
# Дириктория db/mysql.cnf
#
[mysqld]
innodb_buffer_pool_size=512M
innodb_additional_mem_pool_size=512M
innodb_file_io_threads=8
innodb_lock_wait_timeout=50
innodb_flush_log_at_trx_commit=2
innodb_log_file_size=256M
innodb_log_buffer_size=16M
transaction-isolation = READ-COMMITTED
tmp_table_size = 256M
max_heap_table_size = 256M
key_buffer_size = 32M
#
# Дириктория db/Dockerfile
#
# для начала указываем исходный образ, он будет использован как основа
FROM mysql:5.6
# переносим локальный файл с настройками mysql под Bitrix, внутрь образа
COPY mysql.cnf /etc/mysql/mysql.conf.d/
При установке Битрикса, в качестве адреса хоста БД нужно указать не localhost
, а db
, доступ к контейнеру БД из контейнера web
осуществляется по имени контейнера db
.
Директория html
Дириктория ./html/site.loc/
- это папка в нашем проекте, с логами (файлы создадутся автоматически) ./logs/
, информацией об отправленных письмах ./mail/
в формате .eml
, файлами сайта ./public_html/
.
<?
/*
* Дириктория html/site.loc/public_html/index.php
*/
phpinfo();
Директория web
Файл Dockerfile
используется для настройки нашего образа, официальный образ PHP
и Apache
не включают в себя никаких модулей и расширений, для того чтобы их включить, мы соберем собственный образ на основе официального:
#
# Дириктория web/Dockerfile
#
# указываем исходный образ, он будет использован как основа
FROM php:7.4-apache
# выполняет идущие команды в контексте нашего образа, установим модули операционной системы Linux
RUN apt update && apt install -y \
mc \
cron \
zip \
unzip \
libxml2-dev \
libjpeg62-turbo-dev \
libpng-dev \
libfreetype6-dev \
libonig-dev
# выполняет идущие команды в контексте нашего образа, установим и настроим модули PHP
RUN docker-php-ext-install \
pdo_mysql \
mysqli \
mbstring \
json \
xml \
opcache \
&& docker-php-ext-configure gd --enable-gd --with-freetype --with-jpeg \
&& docker-php-ext-install gd
# выполняет идущие команды в контексте нашего образа, установим и настроим модули Xdebug
RUN pecl install xdebug && docker-php-ext-enable xdebug
# переносим локальный файл с настройками Xdebug, внутрь образа
COPY xdebug.ini /usr/local/etc/php/conf.d/
# создание дириктории для скрипта-заглушки обработки функции PHP mail
RUN mkdir /var/www/system_dir
# переносим локальный файл скрипта-заглушки для обработки функции PHP mail, внутрь образа
COPY mail.php /var/www/system_dir
# переносим локальный файл с настройками PHP под Bitrix, внутрь образа
COPY php.ini /usr/local/etc/php/conf.d/
# переносим локальный файл с виртуальными хостами, внутрь образа
COPY sites.conf /etc/apache2/sites-available/000-default.conf
# включение mod rewrite в Apache
RUN ln -s /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled/rewrite.load
# переносим локальный файл с настройками Apache, внутрь образа
COPY opcache.ini /usr/local/etc/php/conf.d/opcache.ini
Файл mail.php
заглушка для сохранения почты в директори mail
, которая указана в поле sendmail_path
в файле php.ini
:
/*
* Дириктория web/mail.php
*/
<?
$mail_path = '';
$pwd = $_SERVER['PWD'];
$pwd = explode('/', $pwd);
foreach ($pwd as $dir) {
if ($dir) {
if ($mail_path !== '/var/www/html') {
$mail_path .= '/' . $dir;
} else {
$mail_path .= '/' . $dir . '/mail/';
break;
}
}
}
$input = file_get_contents('php://stdin');
preg_match('|^To: (.*)|', $input, $matches);
$t = $mail_path . $matches[1] . '_' . time() . '.eml';
chmod($t, 0644);
file_put_contents($t, $input, FILE_APPEND);
Директивы для настройки opcache
:
;
; Дириктория web/opcache.ini
;
[opcache]
opcache.enable=1
opcache.revalidate_freq=0
opcache.validate_timestamps=1
opcache.max_accelerated_files=100000
opcache.memory_consumption=192
opcache.max_wasted_percentage=10
opcache.interned_strings_buffer=16
opcache.fast_shutdown=1
mbstring.func_overload=0
Директивы для настройки PHP
:
;
; Дириктория web/php.ini
;
date.timezone=Europe/Moscow
display_errors=On
log_errors=On
magic_quotes_gpc=Off
memory_limit=128M
upload_max_filesize=50M
post_max_size=50M
max_execution_time=60
mbstring.func_overload=0
mbstring.internal_encoding='UTF-8'
opcache.enable=1
opcache.revalidate_freq=0
opcache.validate_timestamps=1
opcache.memory_consumption=64
opcache.max_accelerated_files=100000
realpath_cache_size=4096k
max_input_vars=10000
sendmail_path=/usr/local/bin/php /var/www/system_dir/mail.php
Описание виртуальных хостов для Apache
:
#
# Дириктория web/sites.conf
#
<VirtualHost *:80>
# почта администратора
ServerAdmin admin@test.com
# базовый домен
ServerName site.loc
# дополнительные имена
ServerAlias www.site.loc
# директория сайта
DocumentRoot /var/www/html/site.loc/public_html
# логи ошибок
ErrorLog /var/www/html/site.loc/logs/apache_error.log
# логи сервера
CustomLog /var/www/html/site.loc/logs/apache_access.log combined
# включаем поддержку .htaccess в директории
<Directory /var/www/html/site.loc/public_html>
# включение работы символических ссылок
Options FollowSymLinks
# разрешение на перезапись всех директив при помощи .htaccess
AllowOverride All
</Directory>
</VirtualHost>
Директивы для настройки Xdebug
:
;
; Дириктория web/xdebug.ini
;
; подключаем расширение Zend
zend_extension = xdebug.so
; функции Xdebug
xdebug.mode = debug
; IP-адрес или имя хоста, к которому Xdebug подключится
xdebug.client_host = host.docker.internal
; порт, к которому Xdebug подключиться
xdebug.client_port = 9090
; запускает трассировку функции
xdebug.start_with_request = yes
; название IDE
xdebug.idekey = VSCode
; путь до файла где будут сохранятся логи
xdebug.log = "/var/www/html/site.loc/logs/xdebug_access.log"
; уровень вывода логов
xdebug.log_level = 10
Каждая строка кода будет подробно расписана, если вы хотите узнать все возможные конфигурации, ознакомьтесь с официальной документацией Xdebug.
zend_extension
подключаемое расширение Zendxdebug.mode
параметр определяет, какие функции Xdebug будут включеныxdebug.client_host
настраивает IP-адрес или имя хоста, к которому Xdebug попытается подключиться при инициировании соединения для отладкиxdebug.client_port
порт, к которому Xdebug пытается подключиться на удаленном хосте. Порт 9003 используется по умолчанию как для Xdebug, так и для клиента отладки командной строкиxdebug.start_with_request
включает или отключает запуск запроса PHP до выполнения кода PHPxdebug.idekey
определяет, какой ключ IDE должен передать Xdebug клиенту отладки или прокси-серверуxdebug.log
настраивает файл журнала логов Xdebug для регистрации всех проблем, попытки подключения, сбоев, отладочной связиxdebug.log_level
настраивает какие сообщения следует добавлять в файл журнала
docker-compose.yml
Docker Compose
упрощает жизнь если у вас больше одного контейнера. С помощью одного, а иногда нескольких файлов, мы описываем какие контейнеры запускать, их настройки и связи между контейнерами. Начиная со второй версии docker compose поддерживает наследование и можно с его помощью описывать разные конфигурации для разных окружений. Мы сейчас не будем заострять на этом внимание, у нас одно окружение и один файл. В файл docker-compose.yml
пропишем следующее:
version: '3'
services:
web:
# у нас свой образ который включает в себя связку PHP + Apache, указываем путь к нему и говорим что его надо собрать
build: ./web
# монтируем директории, слева директории на основной машине, справа - куда они монтируются в контейнере
volumes:
- ./html:/var/www/html/
# слева указан порт который займет Apache в локальной ОС, справа указан дефолтный порт на котором Apache работает в контейнере
ports:
- 127.0.0.151:80:80
# задаем рабочий каталог создаваемого контейнера
working_dir: /var/www/html/
db:
# у нас свой образ который включает в себя mysq, указываем путь к нему и говорим что его надо собрать
build: ./db
#для версии 8.0 и выше добавляем директиву:
#command: --default-authentication-plugin=mysql_native_password
# сообщаем контейнеру о перезапуске, если система перезагружается
restart: always
# прописываем пароль от root пользователя базы данных
environment:
MYSQL_ROOT_PASSWORD: pass123
# монтируем директории, слева директории на основной машине, справа - куда они монтируются в контейнере
volumes:
- ./databases:/var/lib/mysql
pma:
# используем последний стабильный образ phpmyadmin
image: phpmyadmin
# сообщаем контейнеру о перезапуске, если система перезагружается
restart: always
# слева указан порт который займет phpmyadmin в локальной ОС, справа указан дефолтный порт на котором phpmyadmin работает в контейнере
ports:
- 127.0.0.151:81:80
Hosts
Чтобы наш пробный сайт site.loc
заработал в браузере, нужно не забыть добавить его в файл hosts
. Открываем C:\Windows\System32\drivers\etc
и добавляем в него:
127.0.0.151 site.loc
PhpMyAdmin
Открываем http://site.loc:81
, видим привычную форму входа в PhpMyAdmin, вбиваем логин: root
и пароль: pass123
, входим в интерфейс PhpMyAdmin.
Запуск
Конфигурация для нашей локальной разработки готова. Осталось запустить и проверить, работоспособность. Переходим в корень нашего проекта, где лежит файл docker-compose.yml
. Выполняем в консоли команду docker-compose up -d
и ждем. Первый запуск он самый долгий, Docker должен скачать образы и собрать все в одно целое. В самом конце мы увидим заветные строки:
- Network bitrix-environment_default Created
- Container bitrix-environment-pma-1 Started
- Container bitrix-environment-db-1 Started
- Container bitrix-environment-web-1 Started
Сообщения говорят что все контейнеры поднялись и работают. Проверим все ли так, открываем браузер и переходим по адресу http://site.loc
, обновляем страницу и видим: