Docker. Как за 30 минут создать окружение для php разработки
В этой статье пошагово расскажу как создать рабочее окружение, чтобы развернуть веб проект (lamp) на mac os / windows c помощью Docker используя https://github.com/sprintcube/docker-compose-lamp.
Для кого эта статья
- Для разработчиков, особенно для тех, кто незнаком с docker. Минимум теории, что и как работает, и сразу же получаете готовое окружение
- Для всех других специальностей, кто хочет развернуть полноценный виртуальный web сервер у себя на компьютере и почувствовать себя разработчиком
Как все будет работать в итоге
- Мы установим следующую сборку: PHP (можно выбрать 5.4 – 8.3), Apache, MySQL, phpMyAdmin. Сможем зайти из браузера на localhost и запустить ваш проект (или просто в данном случае index.php)
- Будет папка, в которой хранится ваш проект. Т.е. используете ваш любимый IDE для разработки. Со всеми файлами вы работаете из своей родной ОС (mac/windows).
- Докер сделает виртуальный контейнер, в котором запустит необходимую сборку (в нашем случае lamp) и все файлы будут синхронизированы
- Доступны конфиги php.ini, apache, дампы mysql, которые загружаются в виртуальный контейнер docker
- при желании c помощью командной строки можно зайти на виртуальный сервер (контейнер) и сделать при желании там все необходимое (подправить конфиг, запустить команду и тд).
Почему docker?
Можно конечно же установить на саму операционную систему необходимые компоненты, например – php, mysql, nginx/apache. Однако, это не совсем правильно, ввиду того, что среда разработки должна соответствовать среде исполнения вашего приложения. На хостинге это как правило linux, – поэтому и среда разработки должна быть тоже linux.
- Докер уже набрал огромную популярность, почти в любой вакансии разработчика и не важно какого указано требование – уметь пользоваться докером.
- Докер применяется как для разработки, так и для продакшена. Есть множество хостингов для ваших докер контейнеров: https://geekflare.com/docker-hosting-platforms/
- Не важно какая у вас ОС (windows, mac, linux) – установите Докер, сделайте сборку контейнеров и получите рабочее окружение.
- Создавайте под каждый свой проект – уникальное окружение со специфическими конфигурациями, легко делитесь этим окружением с другими разработчиками и им не нужно будет муторно настраивать под каждый проект уникальное окружение.
Исходя из всего вышеперечисленного вот почему я остановился на докер и почему рекомендую обязательно его рассмотреть при разработке.
Мой опыт
Лет 5 назад я начал пользовался vagrant + puphpet, и это было достаточно удобное решение, но столкнувшись однажды с проблемой обновления версии php, а также с проблемой медленной синхронизации файлов mac – я решил перейти на docker. Также его использую когда нужно запустить проект на windows. Но на windows он оказался куда капризней.
Надо сказать, что я сразу не смог разобраться и настроить docker – было несколько этапов взятия. Поэтому я для себя нашел оптимальное решение, с чем и хочу поделиться.
И то я очень много в нем не знаю, docker это очень обширная тема, и разбираться в нем и изучать его можно очень долго.
Начинаем установку
1. Устанавливаем git, чтоб он был доступен из командной строки. Процесс описывать не буду, это легко гуглится.
2. Устанавливаем сам Docker desktop for mac/windows https://docs.docker.com/docker-for-mac/install/
https://docs.docker.com/docker-for-windows/install/
Затруднений при установке возникнуть не должно, делать все как описано в инструкции по этим ссылкам. Главное чтоб у вас установился Docker desktop, чтобы его иконка отображалась в строке состояния со статусом: is running
В процессе установки на своё усмотрение выделяете необходимое кол-во ядер, памяти и места на женском диске. Для windows не забудьте в настройках указать раздел жесткого диска.
3. Проверяете установился ли Докер. Когда вы установили сам клиент docker – открываете командную строку и вводите:
docker -v
После выполнения команды должна отобразиться версия докера.
Если все хорошо на этом шаге – то, отлично, переходим дальше!
4. Теперь мы выберем сборку контейнеров для докера и создадим папку, в которой все это будет храниться.
Вообще можно собрать конечно самому сборку и я вначале так и пытался сделать, однако столкнулся с множеством проблем, чтением мануалов. Что привело меня к поиску уже готовой сборки для веб сервера. И я такую нашел: https://github.com/sprintcube/docker-compose-lamp
В нее входят следующие компоненты:
- PHP (вы сами можете выбрать нужную вам 1 из 6 версий. начиная с 5.4 до 7.4)
- Apache
- MySQL
- phpMyAdmin
- Redis
Теперь нужно создать папку куда мы ее скачаем. У меня это – /Users/your_name/Documents/docker/lamp
lamp – это название сборки (в первую очередь для меня, чтобы не забыть)
5. Далее читаем Installation https://github.com/sprintcube/docker-compose-lamp переходим в папку и выкачиваем файлы с репозитория:
cd /Users/your_name/Documents/docker/lamp
git clone https://github.com/sprintcube/docker-compose-lamp.git .
#Дожидаемся окончания скачивания файлов.
git fetch --all
git checkout 7.4.x # здесь указываем нужную нам версию php
cp sample.env .env # смотрим для справки что содержится в этом файле
docker-compose up -d # и эта очень важная строка мы ее разберем в пункте ниже
6. Команда docker-compose up -d
Это команда обращается к пакетному менеджеру docker, скачивает и устанавливает (если еще не установлены) все компоненты которые описаны в docker-compose.yml – собирает их вместе и запускает контейнеры.
В файле docker-compose.yml – вы увидите какие именно это пакеты и как они прописаны. Обязательно откройте этот файл и ознакомьтесь с содержимым!
Первый раз процесс скачивания и установки может быть немного длительным, и в результате в командной строе должно отобразиться:
docker-compose up -d
#тут будет отображаться много строк процесса установки
Creating 5.7-mysql ... done
Creating sc-redis ... done
Creating 7.2.x-webserver ... done
Creating sc-phpmyadmin ... done
Поздравляю! Теперь можете заходить на localhost и отобразиться страничка, которая расположена по адресу /Users/your_name/Documents/docker/lamp/www/index.php
Разумеется, вы ее меняете, закачиваете в папку свой проект и наслаждаешь дальнейшей разработкой!
Дополнение. Добавляем еще неограниченное кол-во хостов с проектами
Т.к. у меня несколько проектов, а настройки веб сервера одни и теже, то вот что я делаю чтобы запускать свои сайты на виртуальных доменах.
1. нужно добавить строчки в /etc/hosts на вашей машине mac (или windows – c:\windows\system32\drivers\etc\hosts), чтоб ваша операционная система понимала по какому адресу обращаться при запросе вашего хоста.
sudo nano /etc/hosts
#добавляем строчки с вашими сайтами
127.0.0.1 site1
127.0.0.1 site2
нажимаем ctrl + o, ctrl+x (перезаписываем и сохраняем файл)
2. добавляем в файл конфига /Users/your_name/Documents/docker/lamp/config/vhosts/default.conf следующие строчки, он будет синхронизирован с контейнером Докер.
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot "/var/www/html/test1"
ServerName test1
<Directory "/var/www/html/test1">
AllowOverride all
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot "/var/www/html/test2"
ServerName test2
<Directory "/var/www/html/test2">
AllowOverride all
</Directory>
</VirtualHost>
3. Чтобы наши изменения вступили в силу – перезапускаем контейнеры:
docker down
docker-compose up -d
Дополнение. Настройки окружения
В процессе разработки порой нужно менять настройки того же php.ini
Все изменения, которые вы прописываете в php.ini, прописывайте в config/php/php.ini – и далее вам нужно обновить этот конфиг (пересобрать контейнеры) уже знакомой командой:
docker down
docker-compose up -d
И запуститься ваш контейнер, но уже с примененными новыми настройками.
Во первых таким образом php.ini будет у вас под рукой, и самое удобное – можно быстро применить сделанные настройки на другом компьютере (или с кем-то поделиться настройками вашего проекта)!
Редактируем конфиг docker-compose для phpmyadmin
Указываем контейнеру phpmyadmin наш php.ini добавив строчку в volumes.
volumes:
- ${PHP_INI-./config/php/php.ini}:/usr/local/etc/php/conf.d/php-phpmyadmin.ini
Мой конфиг php.ini
memory_limit = 300M
post_max_size = 50M
upload_max_filesize = 40M
max_execution_time = 200
Если нужен Imagick (php-imagick)
1. Добавляем следующие строки в файл docker-compose-lamp/bin/webserver/Dockerfile
# install imagick
RUN apt-get -y install libmagickwand-dev
RUN pecl install imagick
RUN docker-php-ext-enable imagick
2. Далее пересобираем наш контейнер
docker-compose up -d # run all services
docker-compose stop webserver # stop only one. but it still running !!!
docker-compose build --no-cache webserver
docker-compose up -d --no-deps # link webserver to other services
Подключение к контейнеру веб сервера через SSH
docker-compose exec webserver bash
Заключение
Надеюсь, эта статья помогла Вам разобраться на начальном этапе с Докер, и у вас получилось развернуть окружение. Если возникли ошибки – пишите в комментариях, я постараюсь помочь, возможно я с ними уже сталкивался.
Большое спасибо за статью!
Помогите пожалуйста решить проблему. При запуске контейнера возникает следующая ошибка
2020-10-02T15:04:52.755313Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use –explicit_defaults_for_timestamp server option (see documentation for more details).
2020-10-02T15:04:52.757724Z 0 [ERROR] –initialize specified but the data directory has files in it. Aborting.
2020-10-02T15:04:52.757776Z 0 [ERROR] Aborting
Не сталкивался с такой проблемой. Это какая-то ваша бд? Скорей всего ошибка в существующей БД mysql с типом данных. Попробуйте изменить тип данных.
Или добавить настройку в docker-compose.yml:
1. docker-compose down
2. Deleted old volumes (if there is no significant data) docker system prune –force –volumes
3. Added command: –disable-partition-engine-check to mysql section in docker-compose.yml
4. Ran it with docker-compose up -d to set it up in background.
Взял отсюда: https://github.com/docker-library/mysql/issues/361
Возникает предупреждения типа Warning: file_put_contents(/var/www/html/dohuze_poisk.txt): failed to open stream: Permission denied in /var/www/html/dohuze_poisk.php on line 33 – в тех местах, где PHP должен производить редактирование файлов.
То есть не хватает (или вообще нет) прав для PHP
Как это исправить?
Спасибо огромное за статью! Удалось все настроить благодаря ей. До нее на нескольких потерпел неудачу, то одно не работало, то другое. Но я никак не могу настроить xdebug, чтобы он работал с VS code. Перебрал уже несколько вариантов с различных гайдов в интернете, но он не работает хоть тресни!( Скажите не могли бы вы дополнить статью этой темой? Буду очень благодарен!
Спасибо за отзыв! К сожалению, xdebug не настраивал, поэтому не могу помочь.
Огромное спасибо за статью. Лишь благодаря ей смог на Debian Linux поднять необходимый контейнер
На windows 10 голый Laravel из-под докера грузит страницу 1-2 сек., есть ли возможность это ускорить?
Спасибо за статью. Очень полезная. Но столкнулся с проблемой что выдает ошибку подключение к бд и не могу подключиться к phpmyadmin
Наверное я сильно опоздал, ничего не грузится, мне нужен был именно php5.4 но ни одна мариядб тоже не заработала. А жаль, очень прикольный проект вы соорудили. На нем можно было бы вообще бизнес поднимать.
c php5.4 надо уходить, даже с 7-ки.
а вот подключить SSL на винде пока не получилось(