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

См. также

DevOps для 1С DevOps и автоматизация разработки Программист Стажер Платные (руб)

Данный онлайн-курс (интенсив) предусматривает изучение процессов, инструментов и методик DevOps, их применение при разработке на платформе 1С. 

2500 руб.

20.06.2023    22384    7    4    

311

SALE! 50%

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

Использования систем контроля версий — стандарт современной разработки. На курсе научимся использованию Хранилища 1С и GIT при разработке на 1С:Предприятие 8. Разберем подходы и приемы коллективной разработки, научимся самостоятельно настраивать системы и ориентироваться в них.

4900 2450 руб.

29.06.2022    11951    100    4    

132

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

Автотесты 1С - готовые тестовые сценарии, предназначенные для регресс-тестирования функционала конфигурации после обновления типовым релизом. Сценарии проверяют интерактивное заполнение форм документов, справочников и результат проведения документов. Сценарий – feature-файл, разработанный с помощью vanessa-automation. Запуск сценария выполняется интерактивно с помощью vanessa-automation или с помощью vanessa-runner в CI-системах. Доступно тестирование тонкого клиента. Поддерживаемые версии конфигураций 1С:Зарплата и Управление Персоналом 3 и версии КОРП: 3.1.30.57.

2160 руб.

05.08.2024    1291    15    1    

8

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    12568    10    10    

35

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

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

2400 руб.

04.07.2022    8379    38    1    

29

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

Автотесты 1С - готовые тестовые сценарии, предназначенные для регресс-тестирования функционала конфигурации после обновления типовым релизом. Сценарии проверяют интерактивное заполнение форм документов, справочников и результат проведения документов. Сценарий – feature-файл, разработанный с помощью vanessa-automation. Запуск сценария выполняется интерактивно с помощью vanessa-automation или с помощью vanessa-runner в CI-системах. Доступно тестирование тонкого клиента. Поддерживаемые версии конфигураций 1С:Бухгалтерия предприятие 3.0 и версии КОРП: 3.0.156.30.

1800 руб.

20.01.2022    7790    19    0    

13

DevOps и автоматизация разработки Программист Платформа 1С v8.3 Бесплатно (free)

В проектной разработке часто возникают проблемы с однообразностью ландшафта, производительностью и быстрой разверткой инфраструктуры. Об одном из способов избежать или изолировать данные проблемы с помощью контейнеризации расскажем в статье.

18.09.2024    1785    antonov_av    6    

14

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

Когда информационная база «весит» несколько десятков/сотен гигабайт, для разработки и тестирования обычно используют полную копию рабочей базы. Но если информационная база превышает несколько терабайт, такой подход сталкивается с нехваткой места на диске, долгой реструктуризацией, замедленной скоростью работы и другими проблемами, связанными с размером базы. В статье расскажем, как правильно готовить копии больших баз для разработки и тестирования.

28.08.2024    6650    yuraid    28    

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

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

Докеры - это хорошо, когда у вас с ресурсов недостаточно. А так можно виртуалку поднять собственную
4. malikov_pro 1324 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 1324 08.07.22 14:39 Сейчас в теме
(6) потому что кубер это оркестратор движков docker или podman, запускается и администрируется чуть сложнее чем просто docker-compose up
8. sapervodichka 6915 08.07.22 16:51 Сейчас в теме
Женя, всегда профессионально заряжает, откуда минусы на публикации взялись без критикующих комментов...не пойму. Обиженку из себя чтоли кто-то строит (боритесь с этим, это не профессионально)
METAL; papami; D_e_X_T_e_R; John_d; +4 Ответить
12. maksa2005 550 10.07.22 21:28 Сейчас в теме
(8)сказал тот человек который "обиженку включил" и забанил меня на здравые комментария
13. MVK80 10.07.22 22:25 Сейчас в теме
(12), у меня аналогичная ситуация была с этим "профессионалом" :). Очень болезненно реагирует на здравые замечания. Поэтому у него большинство публикаций и без возможности комментирования. А то вдруг кто-нибудь критикующий коммент напишет по делу - придется отвечать :). Так лучше автора забанить, а комменты скрыть. А то вдруг другие увидят не очень удобные вопросы в комментарии.
maksa2005; +1 Ответить
14. sapervodichka 6915 10.07.22 23:52 Сейчас в теме
(12) да, сидите у меня в бане, устал я от вас обоих. Жаль, что тут вас забанить не могу =))) Мои публикации открыты для комментов, и в отличие от вас я чуть больше профессионал. Ну не интересны вы мне, ваше мнение и ваша чрезмерная назойливость. Угомонитесь.
15. maksa2005 550 11.07.22 04:09 Сейчас в теме
(14) не чуть не лучше Вы. Профессионал чего? Обиженных? Ахахаххах. Сам угомонись...
16. sapervodichka 6915 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 6915 11.07.22 09:43 Сейчас в теме
(17)
Только очень жди...
Жди, когда наводят грусть
Желтые дожди,
Жди, когда снега метут,
Жди, когда жара,

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

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

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