Полный цикл в digital

Установка 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 подключаемое расширение Zend
  • xdebug.mode параметр определяет, какие функции Xdebug будут включены
  • xdebug.client_host настраивает IP-адрес или имя хоста, к которому Xdebug попытается подключиться при инициировании соединения для отладки
  • xdebug.client_port порт, к которому Xdebug пытается подключиться на удаленном хосте. Порт 9003 используется по умолчанию как для Xdebug, так и для клиента отладки командной строки
  • xdebug.start_with_request включает или отключает запуск запроса PHP до выполнения кода PHP
  • xdebug.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, обновляем страницу и видим:


Заполните форму уже сегодня!
Для начала сотрудничества необходимо заполнить заявку или заказать обратный звонок. В ответ получите коммерческое предложение, которое будет содержать индивидуальную стратегию с учетом требований и поставленных задач
Работаем по будням с 9:00 до 18:00. Заявки, отправленные в выходные, обрабатываем в первый рабочий день до 12:00.
Спасибо, ваш запрос принят и будет обработан!
Эйч Маркетинг