Настраиваем контейнеры Docker, Docker-compose (PHP + MySQL + Nginx + phpMyAdmin)

08.07.22

Разработка - DevOps и автоматизация разработки

Настроим инструменты разработчика PHP через Docker.

Давным-давно в далекой-далекой галактике я пользовался проектом Denwer, удобная сборка (PHP, MySQL, PhpMyAdmin, Apache)

Теперь я пользуюсь Docker и Docker-compose в частности.

Docker технология для создания и управления контейнерами.

- оборачиваем приложение в контейнеры для того, чтобы Docker обеспечивал одинаковое поведение в разных окружениях.

- можно брать Docker контейнеры и запускать их где угодно, где есть Docker. Все поведение будет зафиксировано в контейнере.

- можем сами решать, какую версию приложения использовать внутри контейнера.

- все приложения стоят внутри контейнеров и не засоряют компьютер.

 

Скачать и установим Docker Desktop (https://www.docker.com/products/docker-desktop/)

github с моей конфигурацией Docker-compose (PHP, MySQL, PhpMyAdmin, Nginx) (https://github.com/komissarovev/docker_php)

 

Скачиваем проект, запускаем консоль CMD и заходим в папку с проектом.

Запускаем команду

docker-compose build (создаст контейнеры для запуска)

docker-compose up (запустит контейнеры)

Эти команды можно объединить docker-compose up --build

Если добавить флаг -d, то консоль не заблокируется docker-compose up --build -d

Если консоль заблокирована процессом, то процесс можно остановить нажав Ctrl+C

Команда, чтобы остановить процесс выполнения контейнеров docker-compose down

Запустим контейнеры

 

 

Получаем вывод статики php на 80-й порт, которая лежит в проекте по пути ./src/public/. Сейчас там один файл index.php и phpMyAdmin на 8000-й порт.

 

 

Далее надо настроить базу и пользователя MySQL

В файле docker-compose.yml мы задавали пароль root для MySQL

volume (- mysql_php:/mysql.sql) мы подключаем файл с базой в контейнер, чтобы наша база не разрушалась каждый раз когда мы делаем docker-compose build

 

 

mysql:
    image: mysql:8.0.29
    container_name: tools_php-mysql
    restart: unless-stopped
    environment:
      - MYSQL_ROOT_PASSWORD=s123123
    volumes:
      - mysql_php:/mysql.sql  
    networks:
      - tools_php-network

 

Можно создать базу зайдя в phpMyAdmin под пользователем root, но тогда придется из php тоже подключаться к базе из под root, что не очень хорошо.

Поэтому пойдем другим путем.

В CMD введем команду подключения к запущенному контейнеру docker exec -it tools_php-mysql sh

tools_php-mysql - это имя контейнера, его можно посмотреть в docker-compose.yml -> container_name или ввести команду docker ps - покажет запущенные процессы

 

 

Подключимся к контейнеру MySQL

docker exec -it tools_php-mysql sh

Для подключения к самой MySQL внутри контейнера наберем команду

mysql -uroot -p

Пароль задан в файле docker-compose.yml

 

 

Создадим базу данных CREATE DATABASE `test`;

Посмотрим на все базы данных SHOW DATABASES;

 

 

Создадим пользователя CREATE USER 'user1'@'%' IDENTIFIED BY 's123';

% обозначает что пользователь может подключаться из под любого хоста - это важно т.к. разные контейнеры расположены на разных хостах(ip разные)

Добавим пользователю все права на базу созданную ранее

GRANT ALL PRIVILEGES ON `test` . * TO 'user1'@'%';

 

 

Для того чтобы удалить пользователя нужно будет сначала убрать права, а потом удалить.

REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'user1'@'%';
DROP USER 'user1'@'%';

Теперь можно подключиться новым пользователем к базе через phpMyAdmin.

Имя сервера mysql указано в файле docker-compose.yml.

Дальнейшую настройку базы удобно производить в phpMyAdmin

 

 

Посмотрим настройки docker-compose.yml контейнера phpMyAdmin

 

 

  phpmyadmin:
    image: phpmyadmin:latest 
    container_name: tools_php-phpmyadmin
    restart: unless-stopped
    environment:
      - PMA_ARBITRARY=1
      - UPLOAD_LIMIT=1024M
      - MEMORY_LIMIT=1024M
      - MAX_EXECUTION_TIME=300  
    ports:
      - 8000:80
    depends_on:
      - mysql 
    networks:
      - tools_php-network 

 

Переменная среды -PMA_ARBITRARY=1 обозначает, что можно подключаться к любому серверу сети, а не только localhost.

-UPLOAD_LIMIT=1024M
-MEMORY_LIMIT=1024M
-MAX_EXECUTION_TIME=300

Этими переменными задается максимальный размер бекапа, который можно загрузить через phpMyAdmin (по умолчанию он очень маленький)

phpMyAdmin запускается в отдельном контейнере с Apache2 на 80 порту, но у нас 80 порт уже занят контейнером с веб-сервером Nginx, который на 80 порту публикует статику PHP.

Поэтому мы перебрасываем 80 порт на 8000 (ports: - 8000:80)

 

 

  nginx:
    image: nginx:stable-alpine
    container_name: tools_php-nginx
    restart: unless-stopped
    ports:
      - 80:80
    volumes:
      - ./src:/var/www
      - ./nginx:/etc/nginx/conf.d 
    depends_on:
      - php 
    networks:
      - tools_php-network  

 

В Nginx в первом volume (- ./src:/var/www) подключаем статику сайта с компьютера в контейнер для публикации

Во втором volume (- ./nginx:/etc/nginx/conf.d) настройки самого Nginx для работы с php

 

 

server {
    listen 80;
    index index.php;
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    error_page 404 /index.php;
    root /var/www/public;
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
    location / {
        try_files $uri $uri/ /index.php?$query_string;
        gzip_static on;
    }
}

 

fastcgi_pass php:9000; - этой строкой Nginx понимает, где расположен сервер с PHP.

Контейнер с PHP по умолчанию расположен на 9000 порту, php - это имя сервиса, которое мы задали в файле docker-compose.yml.

 

 

php:
    build: ./php
    container_name: tools_php-php
    environment:
      - MYSQL_HOST=mysql 
      - MYSQL_DATABASE=test_db 
      - MYSQL_USER=user1
      - MYSQL_PASSWORD=s123
    restart: unless-stopped
    working_dir: /var/www/
    volumes:
      - ./src:/var/www
    depends_on:
      - mysql  
    networks:
      - tools_php-network

 

volume подключаем к контейнеру статику (- ./src:/var/www)

Переменными среды передаем в контейнер настройки MySQL для подключения к базе.

- MYSQL_HOST=mysql 
- MYSQL_DATABASE=test_db 
- MYSQL_USER=user1
- MYSQL_PASSWORD=s123

В PHP потом их можно взять из глобального массива $_ENV

 

 

<?
$connect = mysqli_connect($_ENV["MYSQL_HOST"],$_ENV["MYSQL_USER"],$_ENV["MYSQL_PASSWORD"],$_ENV["MYSQL_DATABASE"]);
if (mysqli_connect_errno()) {
    printf("error: %s\n", mysqli_connect_error());
    exit();
}
mysqli_query($connect, "SET NAMES utf8");
?>

 

Еще хочу обратить внимание в файле docker-compose.yml мы подключаем images, из которых будет создан контейнер. Тут можно выбрать версию приложения. Для важных вещей есть смысл указывать точную версию, ну а например phpmyadmin можно брать всегда последнюю версию

 

 

nginx:
  image: nginx:stable-alpine
mysql:
    image: mysql:8.0.29
phpmyadmin:
    image: phpmyadmin:latest

 

Но в сервисе php мы выбрали не image, а путь до файла Dockerfile

 

 

php:
    build: ./php

 

 Dockerfile (сервиса php)

В php мы уже не просто хотим взять image с версией php:7.4.29-fpm, но и произвести настройку контейнера. Установить службы для работы с MySQL, установить composer и др.

 

 

FROM php:7.4.29-fpm

RUN docker-php-ext-install pdo mysqli pdo_mysql

COPY --from=composer /usr/bin/composer /usr/bin/composer

# RUN apt-get update && apt-get install -y \
#     git \
#     curl \
#     zip \
#     vim \
#     unzip

 

И последняя команда docker system prune для чистки системы от созданных докером контейнеров, volumes, сетей. Она нужна, если мы закончили работу над проектом и не хотим хранить кучу мусора на компьютере.

 

Если вам понравилась статья, поставьте плюсик, мне будет приятно)

Вступайте в нашу телеграмм-группу Инфостарт

Docker Docker-compose PHP MySQL Nginx phpMyAdmin

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

DevOps и автоматизация разработки Нейросети Разработчик 1С 8.3 Бесплатно (free)

Как связка редактора Cursor и протокола MCP через утилиту 1С: Platform Tools превращает ИИ-ассистента в полноценного участника разработки на 1С: видит структуру проекта, модули, формы и запросы, а также умеет выполнять действия прямо в конфигурации. Разбираем настройку MCP-сервера за 15 минут, роль файла packagedef и типичные ошибки подключения.

22.09.2026    5424    Ninel_S    10    

-1

Инструментарий разработчика DevOps и автоматизация разработки Групповая разработка (Git, хранилище) Разработчик 1С 8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление холдингом Бесплатно (free)

Практическое руководство по выстраиванию процессов версионирования в экосистеме «1С:Предприятие 8»: разбор физики сериализации метаданных, скрытые риски построчного слияния XML, сайзинг 1C:EDT vs gitsync/ibcmd и поэтапный конвейер миграции без остановки релизов.

22.09.2026    258    Ninel_S    0    

0

DevOps и автоматизация разработки Групповая разработка (Git, хранилище) Информационная безопасность Инструменты администратора БД Системный администратор Разработчик 1С 8.3 Беларусь Россия Казахстан Абонемент ($m)

Как реализовать безопасное маскирование данных в процессе CI/CD без создания промежуточных копий баз. Объясняем, как использовать инструмент pg_anon для автоматизации скрытия персональных данных при тестировании и развёртывании, сохраняя целостность и структуру информации. Материал объединяет практику Site Reliability Engineering (SRE) с задачами защиты данных, демонстрируя подход, при котором разработчики и DevOps;инженеры могут работать с реалистичными, но обезличенными данными, не нарушая требования безопасности и конфиденциальности.

1 стартмани

11.09.2026    953    Ninel_S    0    

0

DevOps и автоматизация разработки Администрирование СУБД Групповая разработка (Git, хранилище) Системный администратор Разработчик Руководитель проекта Стажер 1С 8.3 1С:Бухгалтерия государственного учреждения 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1C:ERP Беларусь Россия Казахстан Абонемент ($m)

В четвёртой части серии SRE-Suite-for-1C-platform мы переходим к практической автоматизации развёртывания отказоустойчивого кластера PostgreSQL для высоконагруженных систем 1С на Linux. В материале подробно разбирается инженерное решение без HAProxy — с использованием виртуального IP-адреса и vip-manager от CYBERTEC, обеспечивающего прямое подключение к активному мастеру без лишних задержек и точек отказа. Показана структура Ansible-модуля: подготовка ОС, развёртывание etcd, настройка Patroni с параметрами для больших нагрузок 1С. В конфигурационный шаблон Patroni автоматически закладываются параметры, критически важные для высоконагруженных баз данных, запуск vip-manager и полная автоматизация создания трёхнодового кластера. В конце — пошаговый Quick Start и планы развития модуля, включая резервное копирование, оптимизацию ОС Linux и rolling updates PostgreSQL.

1 стартмани

11.09.2026    829    Ninel_S    0    

0

DevOps и автоматизация разработки Разработчик 1С:Предприятие 8 1C:Бухгалтерия 1C:ERP 1С:УТ Бесплатно (free)

Я автоматизировал доставку доработок в базы 1С, к которым можно подключиться только по RDP через шлюз. У меня не было ни SSH, ни WinRM, ни общих папок, ни права устанавливать на сервер свои программы. Каналом связи стал диск рабочей станции, проброшенный в RDP-сеанс, а исполнителем команд служит PowerShell-агент в этом сеансе. В статье расскажу о захвате объектов и помещении изменений в хранилище, динамическом обновлении боевой базы с автоматической остановкой, установке расширений и доступе к базе через MCP по COM без клиента 1С. Ещё разберу несколько неочевидных ограничений платформы и RDP, с которыми столкнулся по ходу работы. Часть из них описана на форумах, а упоминаний о других я не нашёл.

10.09.2026    777    BiLBelarus    0    

4

DevOps и автоматизация разработки Администрирование СУБД Групповая разработка (Git, хранилище) Разработчик 1С 8.3 Абонемент ($m)

В корпоративных инсталляциях «1С:Предприятие 8.3» под управлением PostgreSQL всё чаще проявляются архитектурные пределы масштабирования: рост числа пользователей, обязательная маркировка, плотный поток API-интеграций и высокая стоимость простоя. Вводная часть цикла разбирает ключевые факторы современной эксплуатационной нагрузки и формирует инженерную методологию эволюционной модернизации без остановки продуктивного контура. Материал основан на практическом кейсе «Торговый контур» и показывает, как определить целевые метрики (p95, MTTR, APDEX), выстроить наблюдаемость, стабилизировать работу кластера и подготовить инфраструктуру к дальнейшему масштабированию. Публикация задаёт фундамент для последующих частей, посвящённых телеметрии, оптимизации PostgreSQL, CI/CD и архитектурному росту.

1 стартмани

10.09.2026    831    Ninel_S    0    

5

DevOps и автоматизация разработки Linux HighLoad оптимизация Групповая разработка (Git, хранилище) Системный администратор Разработчик Руководитель проекта 1С:Предприятие 8 1С 8.3 1С:Документооборот 1С:ERP Управление предприятием 2 1С:Управление холдингом 1С:Комплексная автоматизация 2.х Беларусь Россия Казахстан Абонемент ($m)

Системный анализ архитектурных границ масштабирования учетных систем «1С:Предприятие 8.3» под управлением PostgreSQL в ОС Linux. Формулирование инженерной методологии сквозного проекта «Торговый контур», определение измеримых целевых показателей (p95, MTTR, APDEX) и стратегии поэтапной модернизации эксплуатационного контура без остановки промышленных учетных процессов.

1 стартмани

07.09.2026    1102    Ninel_S    10    

1

DevOps и автоматизация разработки Тестирование QA Групповая разработка (Git, хранилище) Разработчик 1С:Предприятие 8 Бесплатно (free)

Четыре года в интеграторе я работал с git и EDT. Git после хранилища полюбил сразу: видно, кто и что менял. С EDT сложнее: тормозит, ошибки при обновлении ERP, автономный сервер внутри него работает только с файловой базой. На новой работе команда захотела перейти на git, я развернул EDT, и оно на второй день разрушило проект при загрузке расширения. Тогда я решил дать команде git с привычным Конфигуратором и инструмент, который за минуту доносит коммит до базы через ibcmd, вместо получасовой загрузки из файлов. На новой работе разрешили ИИ, и я написал это приложение с его помощью: от чтения документации и первого ТЗ до идей в электричке. Впервые за годы снова почувствовал себя творцом, а не закрывателем задач. По дороге приросли выгрузка, объединение и проверка конфигурации по коммитам, YAxUnit и режим MCP-сервера. В статье: схемы, скриншоты, грабли и честный список ограничений. Ссылки пока нет: хочу понять, нужно ли это кому-то, кроме меня.

03.09.2026    11030    KatanaDragon511    29    

40
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. oldcopy 177 08.07.22 13:01 Сейчас в теме
Зачем это здесь?
mars207; davdykin; Dach; mrChOP93; Steelvan; +5 2 Ответить
2. John_d 6124 08.07.22 13:03 Сейчас в теме
(1) Битрикс 1C на PHP,MySQL,JavaScript,CSS
papami; PLAstic; jan-pechka; +3 1 Ответить
10. DrAku1a 1801 10.07.22 16:18 Сейчас в теме
(2) [sarcasm] По той-же логике - давайте тут ещё обзоры на игры от 1С выпускать (ретроспектива и т.п.)? [/sarcasm]
davdykin; mrChOP93; +2 Ответить
11. DrAku1a 1801 10.07.22 16:55 Сейчас в теме
(10) Материал полезный (лично для меня, плюсанул). Хоть и не совсем по теме 1С.
Веб-клиент 1С упоминать тоже не стоит - для него нужен только Apache или IIS, и на Инфостарте уже есть детальные инструкции как всё скачать и настроить.
18. John_d 6124 11.07.22 09:31 Сейчас в теме
(10) Многие забывают, но на Инфостарт можно публиковать любые статьи это доказал Иван Белокаменцев, т.к. сайту нужен уникальный контент. А эта статья прошла модерацию, но это и не удивительно, потому что на Инфорстарт уже много статей по Docker. Кстати интересно прошла бы модерацию статья с обзором игры от 1с)
Еще заметил, что статьи по 1с за несколько лет набирает около 5000 просмотров, а вот статья Telegram бот на PHP за год набрала 22000 просмотров, потому что она попадает на первую строчку в поиске google.
3. salexdv 2431 08.07.22 13:09 Сейчас в теме
Если под windows, то удобнее будет использовать Open Server, особенно если постоянно требуется работать с разными версиями окружения, там это переключается в пару кликов.
aximo; adhocprog; +2 Ответить
5. aximo 2750 08.07.22 14:31 Сейчас в теме
(3) в свое время оупен сервер экономил много времени. Ставился за пару кликов - работало все

Если вы работает на мак - используйте mamp.

Докеры - это хорошо, когда у вас с ресурсов недостаточно. А так можно виртуалку поднять собственную
4. malikov_pro 1403 08.07.22 13:33 Сейчас в теме
Если для битрикс то отдельный контейнер с VM, т.к. у него своя специфика
Если общего плана web разработка, то https://infostart.ru/1c/articles/1441852/
Так же нужно учесть что PHPStorm умеет отправлять изменения по FTP SFTP, а vscode ставит сервис для редактирования кода на удаленном хосте.
aximo; artbear; +2 Ответить
6. PLAstic 296 08.07.22 14:33 Сейчас в теме
А почему выбор пал на докер, а не кубер?
7. malikov_pro 1403 08.07.22 14:39 Сейчас в теме
(6) потому что кубер это оркестратор движков docker или podman, запускается и администрируется чуть сложнее чем просто docker-compose up
8. sapervodichka 7627 08.07.22 16:51 Сейчас в теме
Женя, всегда профессионально заряжает, откуда минусы на публикации взялись без критикующих комментов...не пойму. Обиженку из себя чтоли кто-то строит (боритесь с этим, это не профессионально)
METAL; papami; alexshtenn; John_d; +4 Ответить
12. maksa2005 381 10.07.22 21:28 Сейчас в теме
(8)сказал тот человек который "обиженку включил" и забанил меня на здравые комментария
13. MVK80 10.07.22 22:25 Сейчас в теме
(12), у меня аналогичная ситуация была с этим "профессионалом" :). Очень болезненно реагирует на здравые замечания. Поэтому у него большинство публикаций и без возможности комментирования. А то вдруг кто-нибудь критикующий коммент напишет по делу - придется отвечать :). Так лучше автора забанить, а комменты скрыть. А то вдруг другие увидят не очень удобные вопросы в комментарии.
maksa2005; +1 Ответить
14. sapervodichka 7627 10.07.22 23:52 Сейчас в теме
(12) да, сидите у меня в бане, устал я от вас обоих. Жаль, что тут вас забанить не могу =))) Мои публикации открыты для комментов, и в отличие от вас я чуть больше профессионал. Ну не интересны вы мне, ваше мнение и ваша чрезмерная назойливость. Угомонитесь.
15. maksa2005 381 11.07.22 04:09 Сейчас в теме
(14) не чуть не лучше Вы. Профессионал чего? Обиженных? Ахахаххах. Сам угомонись...
16. sapervodichka 7627 11.07.22 08:05 Сейчас в теме
(15) отвечу на все твои вопросы при личной встрече
17. MVK80 11.07.22 08:41 Сейчас в теме
"Мои публикации открыты для комментов"
(14), ну-ну, как минимум 12 закрыты.
Готовился больше года, чтобы ответить на мой коммент в этой публикации: https://infostart.ru/public/1230737/
и открыть комментарии. Ждем повторного закрытия комментов к публикации 1230737 :)

PS. Я всего лишь просил упомянуть, что этот функционал доступен из коробки, это разработка фирмы 1С, об этом на открытом семинаре 1С рассказывали. Ты же хотел как всегда срубить стартмани, а не помочь людям. Если бы упомянул это сразу, то вопросов бы не было. Кто захотел посмотрел в ERP, а кому лень, тот бы скачал с твоей публикации. Ты же решил пойти не по пути нормального диалога, а по пути скрытия и банов. Очень "профессионально"!
19. sapervodichka 7627 11.07.22 09:43 Сейчас в теме
(17)
Только очень жди...
Жди, когда наводят грусть
Желтые дожди,
Жди, когда снега метут,
Жди, когда жара,

Не понять, не ждавшим им,
Как среди огня
Ожиданием своим
Ты спасёшь меня.
20. MVK80 11.07.22 09:51 Сейчас в теме
(19), готовый чиновник :)
9. papami 55 10.07.22 09:55 Сейчас в теме
(8) Когда думать больно, обиженки ставят минус, что бы убедить себя, что тема Г.
21. maksa2005 381 12.07.22 05:45 Сейчас в теме
Объясните простому программисту. Зачем мне это? если не сложно...
22. papami 55 12.07.22 08:34 Сейчас в теме
(21) Если общими словами - это инструмент, который может понадобиться. А может и нет.

Я объясню зачем это понадобилось мне. А там решайте сами.
В какой-то момент, когда количество разных обменов (интеграций с внешними API) перевалило за десяток у разных клиентов, я понял что процесс выявления проблемы может затянуться на дни (клиент просто не замечает, что какие-то выгрузки встали). Процесс подключения и изучения проблем и устранение последствий - это тоже время. Есть конечно более стандартные схемы сбора метрик, на которые многие также скажут зачем это им (и, в данном случае я тоже). В итоге, сделал простой сбор метрик: отработало или "упало" с сохранением ошибок.
Необходимые данные отправляются наружу. Снаружи в облаке настроена аналогичная схема, как указана тут. Работает код, который принимает метрики и складывает в бд. Я со своей стороны получаю эти данные и могу реагировать оперативно.
Docker, в данном случае, мне удобен т.к. он экономит ресурсы - запускается и отрабатывает только когда приходят метрики, или запрос на получение метрик от меня и сразу после этого выключается. Я получил решение своей проблемы и не трачу денег на виртуалку, железо, белый ip-адрес. При этом я уверен, что код запустится.

У меня аналогичное мнение было когда-то про RPA. Но я просто для себя изучил вопрос и отложил на годы, пока не появилась задача.
sapervodichka; John_d; +2 Ответить
23. user1930444 31.03.23 16:03 Сейчас в теме
Это пока что лучшее, что конкретно мне подошло для понимания и работоспособности вообще докер контейнеров именно с такими комплектующими. Спасибо
Для отправки сообщения требуется регистрация/авторизация