Skip to content

Latest commit

 

History

History
388 lines (301 loc) · 19.4 KB

README_RU.md

File metadata and controls

388 lines (301 loc) · 19.4 KB

Denwer 5 (со вкусом Docker)

Лет десять назад Дмитрий Котеров создал отличный проект под названием 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 в помощь

Быстрая навигация

Как использовать?

1. Установите Docker

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

2. Клонируйте этот репозиторий

Важная информация для пользователей WINDOWS

Из-за ограничений доступа Docker Toolbox for Windows к файловой системе хост-машины, 
работа возможна только из домашней директории текущего пользователя!
Например, можно склонировать репозиторий в [C:/Users/$USER/Denwer], 
где $USER - имя вашего пользователя в Windows.

Для упрощения дальнейших объяснений мы будем устанавливать Denwer в папку Denwer, а имя нашего пользователя в Windows будет User.
Полный путь инсталяции: C:/Users/User/Denwer

P.S. Существует способ обойти данное ограничение и установить Denwer в произвольную директорию, этим мы займемся немного позже (см. Перенос Denwer на диск D).

3. Запуск Denwer

  • Запустите "Docker Quickstart Terminal" с рабочего стола.
    Первый запуск может быть долгим, т.к. создается виртуалка в VirtualBox

  • Перейдите в папку со склонированным репозиторием

# абсолютный путь имеет схожий с *nix формат /drive/dir1/dir2/....
cd /c/Users/User/Denwer
# или
cd ~/Denwer
  • Запустим Denwer (первый запуск будет долгим, т.к. собирается кастомный образ PHP)
docker-compose up -d

4. Проверка состояния Denwer

  • Запустите "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

Если что-то не работает - смотрим проблемы и их решения

5. Открываем в браузере и видим что все работает

  • Открываем в браузере 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

6. Остановка Denwer

  • Запустите "Docker Quickstart Terminal" с рабочего стола.
  • Перейдите в папку со склонированным репозиторием
cd /c/Users/User/Denwer
  • Остановим Denwer
docker-compose down
  • Проверим состояние контейнеров
docker-compose ps
  • Ни одного запущенного контейнера =)
Name   Command   State   Ports
------------------------------

Описание внутренней структуры Denwer 5

  • ./etc
    Здесь лежат конфиги компонентов, которые пробрасываются внутрь контейнера (например nginx.conf, php.ini).
    После изменений в конфигах нужно перезапустить Denwer и он подтянет все изменения!

  • ./var
    Постоянное хранилище для stateful-контейнеров (БД). Можно смело удалять все файлы (кроме файла .gitkeep) внутри папок mysql или redis, это обнулит БД и заставит Denwer инициализировать ее пустой заново (сначала выключаем Denwer, потом чистим, потом включаем).

  • ./env
    Файлы окружения, которые пробрасываются внутрь контейнеров.

  • ./home
    Здесь лежат ваши проекты на PHP. (см. где положить PHP код)

  • ./docker-compose.yml
    Описание всех контейнеров комплекса для Docker Compose.

Куда положить PHP код

Denwer предлагает два подхода по размещению кода внутри:

  • Многопроектность с поддержкой доменов для каждого проекта
  • Однопроектность по IP

Один проект, доступ по 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 на диск D

  • Останаливаем 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

F.A.Q

Как узнать какой IP у 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?

К сожалению, запуск 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

Где найти Adminer?

Где найти PhpMyAdmin?

Нигде. Используйте Adminer.

Как с PHP подключиться к MySQL, Redis, Memcache?

  • Смотрите файл ./home/default/index.php, там есть примеры подключения ко всем БД.
  • Если файл потерялся, то вот креды:
Mysql:
    host=mysql
    port=3306
    user=root
    pass=root
    
Redis:
    host=redis
    port=6379
    
Memcached:
    host=memcached
    port=11211        

Как с компа подключиться к MySQL, Redis, Memcache?

Для этого нужно пробросить порты из виртуальных машин на хост систему.

  • Остановите Denwer
  • Откройте файл ./docker-compose.yml
  • Найдите секцию ports для сервисов mysql, redis и memcached
  • Откомментируйте их (убрать решекти с двух строк для каждого сервиса)
  • Должно получиться так
ports:
  - "6379:6379"

Как мне включить расширение PHP (любое)?

  • 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: comment image section of service php, uncomment build of service php
  • Run docker-compose build
  • Run Denwer
  • Your custom php image is ready and work!

Как поменять версию PHP на 7.1, 7.0, 5.6?

  • 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: comment image section of service php, uncomment build of service php
  • Run docker-compose build
  • Run Denwer
  • Your custom php image is ready and work!

Проблемы и их решения

@todo