Лет десять назад Дмитрий Котеров создал отличный проект под названием Denwer.
Денвер содержал все необходимое для локальной разработки на PHP (Apache, PHP + mods, Mysql, sendmail, etc) и в свое время был очень популярен и востребован. Со временем он, как и большинство проектов, был заброшен (последняя актуальная версия на сайте - PHP 5.3.13), а предлагаемые им подходы в организации разработки на PHP с тех пор сильно устарели.
Данный проект - попытка воссоздать комплекс, содержащий все необходимое для разработки на PHP, но используя современные инструменты, сохранив при этом удобство использования и простоту установки (хм..).
Denwer 5 содержит в себе готовые для работы компоненты:
- nginx (к черту Apache)
- php-fpm 7.2 (apcu, curl, mbstring, mysqli, opcache, pdo_mysql, memcached, redis, zip, xdebug)
- composer
- git
- MySQL 5.6
- adminer (PhpMyAdmin слишком жирный и неповоротливый)
- redis 4.0
- memcache 4.6.3
- чего то не хватает? pull-request в помощь
- Как использовать?
- Описание внутренней структуры
- Куда положить PHP код?
- Перенос Denwer на диск D
- F.A.Q
- Проблемы и их решения
Docker Toolbox for Windows - для Windows 7, 8, 10 Home
В процессе установки выберите все опциональные компоненты (Full Installation):
+ Docker Compose
+ VirtualBox
+ Kitematic
+ Git for Windows
> Создайте ярлыки на рабочем столе!
Docker for Windows - для Windows 10 Professional, Enterprise
Внимательно прочитайте инструкцию!
Вам будет необходимо включить поддержку Hyper-V, после чего запуск виртуалок в VirtualBox станет невозможен
до отключения Hyper-V.
Если не уверены или используете VirtualBox - ставьте Docker Toolbox for Windows выше.
Docker Toolbox for macOS - для macOS
Важная информация для пользователей WINDOWS
Из-за ограничений доступа Docker Toolbox for Windows к файловой системе хост-машины,
работа возможна только из домашней директории текущего пользователя!
Например, можно склонировать репозиторий в [C:/Users/$USER/Denwer],
где $USER - имя вашего пользователя в Windows.
Для упрощения дальнейших объяснений мы будем устанавливать Denwer в папку Denwer
,
а имя нашего пользователя в Windows будет User
.
Полный путь инсталяции: C:/Users/User/Denwer
P.S. Существует способ обойти данное ограничение и установить Denwer в произвольную директорию, этим мы займемся немного позже (см. Перенос Denwer на диск D).
-
Запустите "Docker Quickstart Terminal" с рабочего стола.
Первый запуск может быть долгим, т.к. создается виртуалка в VirtualBox -
Перейдите в папку со склонированным репозиторием
# абсолютный путь имеет схожий с *nix формат /drive/dir1/dir2/....
cd /c/Users/User/Denwer
# или
cd ~/Denwer
- Запустим Denwer (первый запуск будет долгим, т.к. собирается кастомный образ PHP)
docker-compose up -d
- Запустите "Docker Quickstart Terminal" с рабочего стола.
- Перейдите в папку со склонированным репозиторием
cd /c/Users/User/Denwer
- Проверим состояние контейнеров
docker-compose ps
- Видим что все контейнеры находятся в рабочем состоянии (State = Up).
Name Command State Ports
----------------------------------------------------------------------------------
denwer_adminer entrypoint.sh docker-php-e ... Up 0.0.0.0:8080->8080/tcp
denwer_memcached docker-entrypoint.sh memcached Up 11211/tcp
denwer_mysql docker-entrypoint.sh --inn ... Up 3306/tcp, 33060/tcp
denwer_nginx nginx -g daemon off; Up 0.0.0.0:80->80/tcp
denwer_php docker-php-entrypoint php-fpm Up 9000/tcp
denwer_redis docker-entrypoint.sh redis ... Up 6379/tcp
Если что-то не работает - смотрим проблемы и их решения
- Открываем в браузере
http://192.168.99.100
- Видим вывод тестового скрипта, который пытаеся связаться с MySQL, Redis и Memcache
/var/www/projects/default/public/index.php:8:string '2018-10-03 12:42:33' (length=19)
/var/www/projects/default/public/index.php:14:int 1538570553
/var/www/projects/default/public/index.php:20:string '1538570553' (length=10)
- Если ничего не открылось - значит Denwer получил другой IP адрес, а не 192.168.99.100.
Смотрим какой IP получил Denwer
Denwer 5 поддерживает мультипроектность!
Подробнее об этом читайте в мультипроектность Denwer
- Запустите "Docker Quickstart Terminal" с рабочего стола.
- Перейдите в папку со склонированным репозиторием
cd /c/Users/User/Denwer
- Остановим Denwer
docker-compose down
- Проверим состояние контейнеров
docker-compose ps
- Ни одного запущенного контейнера =)
Name Command State Ports
------------------------------
-
./etc
Здесь лежат конфиги компонентов, которые пробрасываются внутрь контейнера (например nginx.conf, php.ini).
После изменений в конфигах нужно перезапустить Denwer и он подтянет все изменения! -
./var
Постоянное хранилище для stateful-контейнеров (БД). Можно смело удалять все файлы (кроме файла .gitkeep) внутри папокmysql
илиredis
, это обнулит БД и заставит Denwer инициализировать ее пустой заново (сначала выключаем Denwer, потом чистим, потом включаем). -
./env
Файлы окружения, которые пробрасываются внутрь контейнеров. -
./home
Здесь лежат ваши проекты на PHP. (см. где положить PHP код) -
./docker-compose.yml
Описание всех контейнеров комплекса для Docker Compose.
Denwer предлагает два подхода по размещению кода внутри:
- Многопроектность с поддержкой доменов для каждого проекта
- Однопроектность по IP
- Положите все ваши файлы в
./home/default
- Ваш сайт будет доступен по IP
http://192.168.99.100
(если не работает - Denwer получил другой IP, см. какой IP получил Denwer ) - Обратите внимание,
index.php
должен находится в подпапкеpublic
, а не в корне проекта! (./home/default/public/index.php
)
- Каждая папка внутри
./home
является самостоятельным проектом и доступна по имени вида*.denwer
(например, проект по умолчаниюdefault
, который распологается в./home/default
доступен по адресуhttp://default.denwer/
) - Необходимо добавить запись о домене
default.denwer
в файлC:\Windows\System32\drivers\etc\hosts
на вашем ПК:
192.168.99.100 default.denwer
192.168.99.100 project1.denwer
192.168.99.100 project2.denwer
- Вместо
192.168.99.100
используйте IP вашего Denwer. (Какой IP получил Denwer) - По умолчанию файл
C:\Windows\System32\drivers\etc\hosts
защищен от записи. Используйте google для разблокировки :)
- Останаливаем Denwer
- Выключаем нашу docker machine
docker-machine stop default
- Копируем нашу установку Denwer на новое место.
- Старый путь установки:
C:\Users\User\Denwer
- Новый путь установки:
D:\Denwer
(можете выбрать любой удобный для себя)
- Старый путь установки:
- Открываем VirtualBox, заходим в настройки нашей виртуалки с Docker (называется default)
- Переходим в подпункт
Общие папки
и добавляем новую общую папку (плюсик справа) с такими настройками:- Путь к папке:
D:\Denwer
- Имя папки:
d/Denwer
- Автоподключение: да
- Путь к папке:
- Обратите внимание, что
Имя папки
должно повторятьПуть к папке
с учетом особенностей маппинга пути Windows на Lunix:E:\Work\PurpleGames\Denwer
=>e/Work/PurpleGames/Denwer
D:\SomeFolder\DENWER
=>d/SomeFolder/DENWER
- Запускаем нашу Docker Machine
docker-machine start default
- Запускаем Denwer
Если что-то не работает - смотрим проблемы и их решения
- Запустите "Docker Quickstart Terminal" с рабочего стола.
- Выведите список докер-машин командой
docker-machine ls
- Смотрим IP в выводе в колонке URL (в моем случае IP = 192.168.99.100):
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
default * virtualbox Running tcp://192.168.99.100:2376 v18.06.1-ce
- Открываем в браузере
http://192.168.99.100
К сожалению, запуск composer весьма геморный. Я так и не придумал, как сделать проще.
- Запустите "Docker Quickstart Terminal" с рабочего стола.
- Запустите Denwer если он еще не запущен.
- Выведите список докер-контейнеров командой
docker ps
Получим список запущенных контейнеров и их ID:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fb89fba895e6 nginx:alpine "nginx -g 'daemon of…" 15 minutes ago Up 15 minutes 0.0.0.0:80->80/tcp denwer_nginx
0990ee151622 mysql:5.7 "docker-entrypoint.s…" 15 minutes ago Up 15 minutes 3306/tcp, 33060/tcp denwer_mysql
792ddf6a2d36 adminer:latest "entrypoint.sh docke…" 15 minutes ago Up 15 minutes 0.0.0.0:8080->8080/tcp denwer_adminer
45429bd1a9be redis:latest "docker-entrypoint.s…" 15 minutes ago Up 15 minutes 6379/tcp denwer_redis
9107c023ae3a memcached:latest "docker-entrypoint.s…" 15 minutes ago Up 15 minutes 11211/tcp denwer_memcached
270523e08605 denwer5_php "docker-php-entrypoi…" 15 minutes ago Up 15 minutes 9000/tcp denwer_php
- Нас интересует контейнер c именем (NAMES)
denwer_php
- Смотрим
CONTAINER ID
для контейнераdenwer_php
=270523e08605
- Заходим в интерактивном режиме в контейнер:
# указан полный контейнер id
docker exec -it 270523e08605 bash
# можно указать первые три символа, так быстрее
docker exec -it 270 bash
- Мы вошли внутрь конейтера, находимся в
/var/www/html
root@270523e08605:/var/www/html#
- Переходим внутрь нашего проекта (я перейду в проект по умочанию
default
)
cd /var/www/projects/default
- Выполняем
composer install
илиcomposer update
- Открываем в браузере
http://192.168.99.100:8080
, пользуемся (см. логин и пароль к MySQL). - Если не открывается, значит Denwer получил другой IP (см. какой IP получил Denwer)
Нигде. Используйте Adminer.
- Смотрите файл
./home/default/index.php
, там есть примеры подключения ко всем БД. - Если файл потерялся, то вот креды:
Mysql:
host=mysql
port=3306
user=root
pass=root
Redis:
host=redis
port=6379
Memcached:
host=memcached
port=11211
Для этого нужно пробросить порты из виртуальных машин на хост систему.
- Остановите Denwer
- Откройте файл
./docker-compose.yml
- Найдите секцию
ports
для сервисовmysql
,redis
иmemcached
- Откомментируйте их (убрать решекти с двух строк для каждого сервиса)
- Должно получиться так
ports:
- "6379:6379"
- Запустите Denwer
- Подключайтесь к внешнему IP Denwer какой IP получил Denwer
- mkdir
./build/php
- Clone repository
https://github.com/Shcneider/denwer5-php7.2-docker-image
into./build/php
- Add custom extensions in
Dockerfile
- Edit
docker-compose.yml
: commentimage
section of servicephp
, uncommentbuild
of servicephp
- Run
docker-compose build
- Run Denwer
- Your custom php image is ready and work!
- mkdir
./build/php
- Clone repository
https://github.com/Shcneider/denwer5-php7.2-docker-image
into./build/php
- Change PHP version in
Dockerfile
(first line) - Edit
docker-compose.yml
: commentimage
section of servicephp
, uncommentbuild
of servicephp
- Run
docker-compose build
- Run Denwer
- Your custom php image is ready and work!
@todo