Настраиваем контейнеры 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

См. также

Автотесты для типовых конфигураций ERP Управление предприятием 2 и Комплексная автоматизация 2 (для vanessa automation)

Тестирование QA DevOps и автоматизация разработки Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х Россия Бухгалтерский учет Налоговый учет Платные (руб)

Готовые тестовые сценарии, предназначенные для регресс-тестирования функционала конфигурации после обновления типовым релизом. Сценарии проверяют интерактивное заполнение форм документов, справочников и результат проведения документов. Сценарии возможно использовать как для vanessa-automation, так и для СППР. Поддерживаемые версии конфигураций ERP2 и КА2: 2.5.15.111.

2220 руб.

04.07.2022    6987    26    1    

24

Системы контроля версий для 1С-разработчиков.

1С-программирование DevOps и автоматизация разработки Групповая разработка (Git, хранилище) DevOps для 1С Платформа 1С v8.3 Платные (руб)

Основы командной разработки на 1С. Использование систем контроля версий при разработке на платформе 1С:Предприятие 8

4900 руб.

29.06.2022    9460    78    4    

112

Управление сборкой. Расширение для конфигурации СППР

DevOps и автоматизация разработки Платформа 1С v8.3 Конфигурации 1cv8 1С:Франчайзи, автоматизация бизнеса Платные (руб)

Подсистема «Управление сборкой GLI» предназначена для динамического формирования сборочных линий Gitlab и отслеживания процесса доработок систем на базе1С:Предприятия Позволяет упростить выпуск новых релизов системы, подготовить описание доработок системы. Интегрируется с GitLab API по событиям Push, Merge-request, Pipeline. Уведомляет пользователей о результатах сборки/тестирования сборочных конвейеров через СВ, либо при её недоступности или отсутствию по E-Mail. Поможет при отправке исправлений ошибок в общую базу тестирования, сформирует запросы на слияние в ветку версии только по протестированному и подтверждённому функционалу. Подсистема рассчитана исключительно на клиент - серверную архитектуру тестовых ИБ. Поддерживаемая версии СППР 2.0.4.15, платформа не ниже 8.3.17.1549, 2.0.7.3 / не ниже 8.3.21.1664, начиная с релиза 1.0.4.30 требуется платформа не ниже 8.3.23 рекомендуемый релиз 8.3.23.1997

7000 руб.

26.08.2022    10839    7    5    

30

Автоматическое подтверждение легальности обновления базы или как обновить 100 типовых баз 1С за 5 часов

DevOps и автоматизация разработки Обновление 1С Платформа 1С v8.3 Конфигурации 1cv8 1С:Бухгалтерия 3.0 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Расширение для конфигураций 1С для автоматического подтверждения легальности обновления и выполнения обработчиков обновления при пакетном автоматическом обновлении большого числа баз 1С. А также сам модуль обработки по автоматическому обновлению баз.

2 стартмани

08.05.2019    24481    56    VPanin56    26    

28

1С, СППР и Архитектура как код

DevOps и автоматизация разработки Бесплатно (free)

Можно ли идеи подхода «Архитектура как код» положить на 1С или иную платформу, чтобы не изобретать ещё какой-то язык и сразу получить множество готовых библиотек функций и инструмент достижения главной цели подхода AaC.

01.02.2024    2802    roman72    9    

8

TCP прокси-сервер хранилища конфигурации 1С

DevOps и автоматизация разработки Групповая разработка (Git, хранилище) OneScript Платформа 1С v8.3 Бесплатно (free)

Продолжение истории с прокси хранилища, но уже не на HTTP, а на TCP и без падений по памяти веб-сервера. Проверяем комментарии хранилища, вызываем веб-хуки, старты пайплайнов, gitsync по событию помещения версии в хранилище. И все это полностью на знакомом и понятном OneScript.

17.01.2024    3061    kamisov    17    

60

Infrastructure as code: кнопка «Сделать всё», или Упаковываем наше окружение в 5 кБ текста

DevOps и автоматизация разработки Бесплатно (free)

Когда под каждый проект нужно развернуть отдельный стенд разработки и сборочную линию для его обслуживания, велик риск влияния человеческого фактора. О том, как зафиксировать инженерный опыт в скриптах и унифицировать необходимые настройки для автоматизированного разворачивания инфраструктуры с помощью Terraform и Ansible, пойдет речь в статье.

01.11.2023    1425    Libelle    5    

14

Обработка для подготовки файла настройки дымовых тестов измененных объектов конфигурации

DevOps и автоматизация разработки Тестирование QA Россия Абонемент ($m)

В статье приведен пример обработки, которая на основании измененных файлов git-репозитория готовит специальный файл настройки xUnitParams.json для последующего выполнения дымовых тестов (xUnitFor1C/add) только для измененных объектов конфигурации

1 стартмани

09.10.2023    801    5    ICL-Soft    1    

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

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

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

Не понять, не ждавшим им,
Как среди огня
Ожиданием своим
Ты спасёшь меня.
20. MVK80 11.07.22 09:51 Сейчас в теме
9. papami 55 10.07.22 09:55 Сейчас в теме
(8) Когда думать больно, обиженки ставят минус, что бы убедить себя, что тема Г.
21. maksa2005 534 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 Сейчас в теме
Это пока что лучшее, что конкретно мне подошло для понимания и работоспособности вообще докер контейнеров именно с такими комплектующими. Спасибо
Оставьте свое сообщение