В данной статье мы рассмотрим настройку окружения для PHP разработчиков с использованием Vagrant, Docker, Xdebug, PHPUnit, и интеграцию с IDE PHPStorm.

+

Требования


  • Окружение должно развертываться на Windows, MacOS, Linux
  • Установка должна быть максимально простой
  • Быстрая работа с файловой системой
  • Интеграция с IDE PHPStorm
  • Несколько версии PHP интерпретаторов (5.6, 7.0)


Подготовка


Мы не будем заострять свое внимание на установке необходимых инструментов под определенные ОС, инструкции по установке есть на официальных сайтах, ссылки прилагаются.


Что входит в сборку?


  • Nginx
  • MySQL 5 (Percona)
  • MongoDB 3
  • Redis 3
  • PHP 5.6, 7.0 CLI + FPM

PHP-extensions

5.6
  • cli
  • fpm
  • bcmath
  • gd
  • gmp
  • intl
  • mbstring
  • mcrypt
  • pdo
  • mysqlnd
  • crypto
  • geoip
  • imagick
  • jsonc
  • memcache
  • memcached
  • mongodb
  • ssh2
  • xdebug
  • soap
  • xml
  • opcache
  • redis
7.0
  • cli
  • fpm
  • bcmath
  • gd
  • gmp
  • intl
  • mbstring
  • mcrypt
  • pdo
  • mysqlnd
  • crypto
  • geoip
  • imagick
  • memcache
  • memcached
  • mongodb
  • ssh2
  • xdebug
  • soap
  • xml
  • opcache
  • redis

Настройка и конфигурирование


Внимание! Все описанные настройки и файлы выложены на GitHub. Если у вас возникают вопросы по использованию Vagrant или Docker обратитесь к официальной документации.

Развертывание окружения чуть-чуть отличается на разных ОС:

  • MacOS все пройдет, как положено без дополнительных действий.
  • Windows необходимо запустить вспомогательный скрипт hosts-set.cmd для установки прав текущему пользователю на запись для hosts файла до запуска vagrant up, также если у вас имя текущего пользователя содержит любые символы non-ACSII, то вам придется сменить путь до вашей рабочей директории vagrant.d используя переменную окружения VAGRANT_HOME. Если в вашей ОС нет NFS, установите его дополнительно, можно как vagrant плагин vagrant-winnfsd.
  • Linux на усмотрение, можно поставить Vagrant с NFS сервером или просто использовать docker-compose инструкции.

hosts-set.cmd
@if (1==1) @if(1==0) @ELSE
@echo off&SETLOCAL ENABLEEXTENSIONS
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"||(
    cscript //E:JScript //nologo "%~f0"
    @goto :EOF
)
CACLS %SystemRoot%\system32\drivers\etc\hosts /E /G %USERNAME%:W
@goto :EOF
@end @ELSE
ShA=new ActiveXObject("Shell.Application")
ShA.ShellExecute("cmd.exe","/c \""+WScript.ScriptFullName+"\"","","runas",5);
WScript.Sleep(500)
@end

Гостевая ОС будет работать на Ubuntu 14.04 (Trusty), статическом IP адресе 10.0.0.2 и в качестве share-папки будем использовать монтирование через NFS.

Для удобства создайте папку под названием dockrant (Docker + Vagrant = Dockrant), далее в статье мы будем отталкиваться от этой папки.

Определимся со структурой папок:

./dockrant — наша корневая папка
./dockrant/ssh — SSH ключики для гостевой ОС (в данном туториале используем стандартные ключи vagrant)
./dockrant/share — share-папка между хост и гостевой ОС
./dockrant/share/tools — папка с нашими инструментами и bash скриптами
./dockrant/vagrant/build —  исполняемые bash скрипты при поднятии гостевой ОС

Теперь нам необходимо по структуре папок описанных выше положить все необходимые наши скрипты и инструкции, пойдем по списку.

./dockrant/ssh — положим два файла id_rsa (приватный ключ) и id_rsa.pub (публичный ключ)

id_rsa
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzI
w+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoP
kcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2
hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NO
Td0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcW
yLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQIBIwKCAQEA4iqWPJXtzZA68mKd
ELs4jJsdyky+ewdZeNds5tjcnHU5zUYE25K+ffJED9qUWICcLZDc81TGWjHyAqD1
Bw7XpgUwFgeUJwUlzQurAv+/ySnxiwuaGJfhFM1CaQHzfXphgVml+fZUvnJUTvzf
TK2Lg6EdbUE9TarUlBf/xPfuEhMSlIE5keb/Zz3/LUlRg8yDqz5w+QWVJ4utnKnK
iqwZN0mwpwU7YSyJhlT4YV1F3n4YjLswM5wJs2oqm0jssQu/BT0tyEXNDYBLEF4A
sClaWuSJ2kjq7KhrrYXzagqhnSei9ODYFShJu8UWVec3Ihb5ZXlzO6vdNQ1J9Xsf
4m+2ywKBgQD6qFxx/Rv9CNN96l/4rb14HKirC2o/orApiHmHDsURs5rUKDx0f9iP
cXN7S1uePXuJRK/5hsubaOCx3Owd2u9gD6Oq0CsMkE4CUSiJcYrMANtx54cGH7Rk
EjFZxK8xAv1ldELEyxrFqkbE4BKd8QOt414qjvTGyAK+OLD3M2QdCQKBgQDtx8pN
CAxR7yhHbIWT1AH66+XWN8bXq7l3RO/ukeaci98JfkbkxURZhtxV/HHuvUhnPLdX
3TwygPBYZFNo4pzVEhzWoTtnEtrFueKxyc3+LjZpuo+mBlQ6ORtfgkr9gBVphXZG
YEzkCD3lVdl8L4cw9BVpKrJCs1c5taGjDgdInQKBgHm/fVvv96bJxc9x1tffXAcj
3OVdUN0UgXNCSaf/3A/phbeBQe9xS+3mpc4r6qvx+iy69mNBeNZ0xOitIjpjBo2+
dBEjSBwLk5q5tJqHmy/jKMJL4n9ROlx93XS+njxgibTvU6Fp9w+NOFD/HvxB3Tcz
6+jJF85D5BNAG3DBMKBjAoGBAOAxZvgsKN+JuENXsST7F89Tck2iTcQIT8g5rwWC
P9Vt74yboe2kDT531w8+egz7nAmRBKNM751U/95P9t88EDacDI/Z2OwnuFQHCPDF
llYOUI+SpLJ6/vURRbHSnnn8a/XG+nzedGH5JGqEJNQsz+xT2axM0/W/CRknmGaJ
kda/AoGANWrLCz708y7VYgAtW2Uf1DPOIYMdvo6fxIB5i9ZfISgcJ/bbCUkFrhoH
+vq/5CIWxCPp0f85R4qxxQ5ihxJ0YDQT9Jpx4TMss4PSavPaBH3RXow5Ohe+bYoQ
NE5OgEXk2wVfZczCZpigBKbKZHNYcelXtTt/nP3rsCuGcM4h53s=
-----END RSA PRIVATE KEY-----
id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzIw+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoPkcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NOTd0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcWyLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQ== vagrant insecure public key

./dockrant/share/ — создадим файл phpinfo.php с phpinfo() функцией, чтобы потом проверить работоспособность

phpinfo.php
<?php
phpinfo();

./dockrant/share/tools/ — положим несколько вспомогательных скриптов для запуска PHP интерпретаторов из под Docker exec и PHPUnit (скачайте c сайта phpunit.phar)

php56
#!/bin/bash
CMD="export IDE_PHPUNIT_PHPUNIT_PHAR='$IDE_PHPUNIT_PHPUNIT_PHAR'"
CMD+=" && export IDE_PHPUNIT_VERSION='$IDE_PHPUNIT_VERSION'"
CMD+=" && export SSH_CLIENT='$SSH_CLIENT'"
CMD+=" && export JETBRAINS_REMOTE_RUN='$JETBRAINS_REMOTE_RUN'"
CMD+=" && export DEBUG_CONFIG='$XDEBUG_CONFIG'"
CMD+=" && export XDEBUG_CONFIG='$XDEBUG_CONFIG'"
CMD+=" && php56 $@"
docker exec share_php_1 bash -c "$CMD"
php56tty
#!/bin/bash
CMD+="php56 $@"
docker exec -t -i share_php_1 bash -c "$CMD"
php70
#!/bin/bash
CMD="export IDE_PHPUNIT_PHPUNIT_PHAR='$IDE_PHPUNIT_PHPUNIT_PHAR'"
CMD+=" && export IDE_PHPUNIT_VERSION='$IDE_PHPUNIT_VERSION'"
CMD+=" && export SSH_CLIENT='$SSH_CLIENT'"
CMD+=" && export JETBRAINS_REMOTE_RUN='$JETBRAINS_REMOTE_RUN'"
CMD+=" && export DEBUG_CONFIG='$XDEBUG_CONFIG'"
CMD+=" && export XDEBUG_CONFIG='$XDEBUG_CONFIG'"
CMD+=" && php70 $@"
docker exec share_php_1 bash -c "$CMD"
php70tty
#!/bin/bash
CMD+="php70 $@"
docker exec -t -i share_php_1 bash -c "$CMD"

Для php* скриптов мы не используем TTY, эти скрипты нужны для корректной настройки интеграции с IDE в использовании remote интерпретаторов, скрипты php*tty нужны для ручного использования запуска PHP скриптов, в том числе и в интерактивном режиме php -a.

./dockrant/vagrant/build/php/ — положим init.sh bash скрипт для копирования исполняемых файлов запуска PHP интерпретаторов.

init.sh
#!/bin/bash
cp /share/tools/php56 /usr/bin/php56 && chmod +x /usr/bin/php56
cp /share/tools/php70 /usr/bin/php70 && chmod +x /usr/bin/php70
cp /share/tools/php56tty /usr/bin/php56tty && chmod +x /usr/bin/php56tty
cp /share/tools/php70tty /usr/bin/php70tty && chmod +x /usr/bin/php70tty

./dockrant/vagrant/build/docker/ — положим init.sh и docker-compose.sh bash скрипты для установки docker-compose и команд на сборку контейнеров при поднятии гостевой ОС.

init.sh
#!/bin/bash
/usr/local/bin/docker-compose -f /share/docker-compose.yml build
/usr/local/bin/docker-compose -f /share/docker-compose.yml up -d
docker-compose.sh
#!/bin/bash
curl -L https://github.com/docker/compose/releases/download/1.8.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

Docker-compose


Создадим файл ./dockrant/share/docker-compose.yml

Теперь опишем инструкции для создания docker-контейнеров, мы не будем описывать инструкции для сборки каждого образа, возьмём готовые.

Собираем из следующих образов:

  • redis:3
  • percona:5
  • gurukami/php:5.6
  • gurukami/php:7.0 (для FPM используется по умолчанию)
  • gurukami/nginx
  • mongo:3

docker-compose.yml
version: '2'
services:
  redis:
    image: redis:3.0
  mysql:
    image: percona:5
    environment:
      - MYSQL_ROOT_PASSWORD=gurukami
    volumes:
      - /share:/share
  php56:
    image: gurukami/php:5.6
    links:
      - mysql
      - mongo
      - redis
    volumes:
      - /share:/share
      - /home:/home
      - /tmp/:/tmp/
  php:
    image: gurukami/php:7.0
    links:
      - mysql
      - mongo
      - redis
    volumes:
      - /share:/share
      - /home:/home
      - /tmp/:/tmp/
  mongo:
    image: mongo:3
    ports:
      - "27017:27017"
  nginx:
    image: gurukami/nginx:latest
    depends_on:
      - php
    links:
      - php
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /share:/share

Vagrantfile


Создайте в папке dockrant файл Vagrantfile и запишите туда следующие инструкции

Vagrantfile
Vagrant.require_version ">= 1.8.6"

required_plugins = %w(vagrant-hostsupdater)
plugins_to_install = required_plugins.select { |plugin| not Vagrant.has_plugin? plugin }
if not plugins_to_install.empty?
  puts "Installing plugins: #{plugins_to_install.join(' ')}"
  if system "vagrant plugin install #{plugins_to_install.join(' ')}"
    exec "vagrant #{ARGV.join(' ')}"
  else
    abort "Installation of one or more plugins has failed. Aborting."
  end
end

Vagrant.configure(2) do |config|

  config.vm.box = "ubuntu/trusty64"
  config.vm.hostname = "gurukami.local"

  config.ssh.insert_key = false

  config.hostsupdater.aliases = [
    "sandbox.local"
  ]

  config.nfs.map_uid = Process.uid
  config.nfs.map_gid = Process.gid

  config.vm.network :private_network, ip: "10.0.0.2"
  config.vm.network :forwarded_port, guest: 22, host: 2202, id: "ssh"

  config.vm.provider :virtualbox do |vb|
    vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
    vb.name = "Gurukami (Dockrant)"
    vb.memory = 1024
    vb.cpus = 2
  end

  config.vm.provision "fix-no-tty", type: "shell" do |s|
    s.privileged = false
    s.inline = "sudo sed -i '/tty/!s/mesg n/tty -s \\&\\& mesg n/' /root/.profile"
  end

  config.vm.provision "shell", inline: 'mkdir /vagrant', run: "once"
  config.vm.provision "shell", inline: 'echo "nameserver 8.8.8.8" >> /etc/resolv.conf', run: "always"
  config.vm.provision "shell", path: './vagrant/build/php/init.sh', run: "once"
  config.vm.provision "shell", path: './vagrant/build/docker/docker-compose.sh', run: "once"

  config.vm.provision :docker
  config.vm.provision "shell", path: './vagrant/build/docker/init.sh', run: "always"

  config.vm.synced_folder ".", "/vagrant", disabled: true
  config.vm.synced_folder "./share", "/share", nfs: true, nfs_udp: false
end


Тюнинг:

  • При необходимости шаринга можно добавить опцию config.vm.network :public_network, чтобы поднять на публичном интерфейсе или использовать vagrant share
  • Увеличить использование выделенной памяти vb.memory, по умолчанию стоит 1024 MB
  • Увеличить кол-во использованных процессоров vb.cpus, по умолчанию стоит 2

Запуск


В папке dockrant запускаем команду

vagrant up --provider virtualbox

После сборки откроем в браузере — sandbox.local/phpinfo.php


Docker-machine


Для того чтобы наша виртуальная машина работала как docker-machine нам необходимо добавить её используя generic драйвер, запускаем из под папки dockrant

docker-machine create --driver generic --generic-ip-address=10.0.0.2 --generic-ssh-key ./ssh/id_rsa --generic-ssh-user vagrant sandbox

После создания docker-machine, гостевую машину нужно перезагрузить, т.к. после установки все docker контейнеры останавливаются

vagrant reload

PHP-CLI


Запуск PHP скриптов осуществляется на гостевой машине (10.0.0.2), помните, что между хост-машиной и гостевой есть /share папка.

php56 /path/to/file
php70 /path/to/file

Запуск PHP интерпретаторов в интерактивном режиме

php56tty -a
php70tty -a

Интеграция с PHPStorm


Мы настроим дебаггер с помощью XDebug, прикрутим PHPUnit а также добавим управление нашими контейнерами через плагин Docker Integration, с помощью которого можно будет смотреть логи наших сервисов, перезагружать контейнеры, исполнять скрипты.

Добавим в настройки наши PHP интерпретаторы, открываем настройки Languages & Frameworks > PHP



Добавляем сначала 5.6 версию, потом повторяем для версии 7.0, нажимаем на кнопку ...

Затем нажав на + выбираем Remote...



В всплывающем окне выбираем тип Vagrant и указываем путь до PHP интерпретатора на гостевой ОС /usr/bin/php56




Теперь добавим наш удаленный сервер в список для работы с дебаггером по запросу из браузера
Language & Frameworks > PHP > Servers. Пропишем path mappings до нашей /share папки чтобы IDE смог распознать запросы по путям между хост машиной и гостевой



Настроим PHPUnit, идем в настройки Language & Frameworks > PHP > PHPUnit и для каждой версии PHP интерпретатора пропишем путь до /share/tools/phpunit.phar





Мы почти готовы к отладке нашего приложения, но еще осталось настроить конфигурации запуска


Настроим удаленную отладку PHP Remote Debug





Ставим breakpoint к примеру в файле phpinfo.php на 2 строчке, запускаем дебаггер, переходим в браузере на страницу sandbox.local/phpinfo.php и видим, что наш дебаггер сработал в IDE







Теперь перейдем к PHPUnit


Создадим проcтенький Unit test файл под именем Test.php в ./dockrant/share папке

Test.php
<?php

class Test extends PHPUnit_Framework_TestCase
{
    public function testSomething()
    {
        $this->assertTrue(true);
    }
}

Настроим конфигурацию запуска



Запускаем Unit test





Также можно запустить Unit test с дебаггером





Теперь настроим плагин Docker Integration, после установки плагина необходимо добавить нашу машину в настройках Build, Execution, Deployment > Docker как правило папки docker-machines лежат в вашей домашней директории текущего пользователя, нам нужен sandbox docker-machine который мы создавали по инструкции вверху используя generic драйвер



Внизу вкладка Docker будет показана после перезагрузки IDE



Итог


Мы имеем окружение с полным набором необходимых сервисов и утилит разворачиваемое на большинстве операционных систем.

Развертывание окружения было протестировано на:

  • Windows 10
  • MacOS Sierra 10.12
  • Ubuntu 14.04 Desktop

Спасибо за прочтение, надеюсь эта статья поможет вам организовать удобное окружение.
Поделиться с друзьями
-->

Комментарии (53)


  1. istui
    31.10.2016 16:26

    Пожалуй, лучшее возможное, достойное завершение недавнего «цикла» статей про то, «как поднять две версии на одной машине».
    Спасибо!

    Единственное, что хотелось бы увидеть еще — сравнение производительности по сравнению с «локальной» установкой.


    1. Fesor
      31.10.2016 16:31

      если у вас хост linux и все в докере разницы по производительности практически нет. Если же хост mac/windows то добавляются накладные расходы на волумы с хоста, обычно либо шаред фолдеры (очень медленно) либо NFS (терпимо).


    1. nerufa
      31.10.2016 20:22

      Пожалуйста :) Тест производительности специально не делал, исходя из всех вариантов NFS является быстрее чем virtualbox шаред папки (тестов есть куча в интернетах). Тут ведь как, накладных расходов в виртуалки с докером минимальны, только все ложится на NFS между гостевой и хост машиной.

      Окружение мне приходилось делать исходя из разных ОС у ребят в команде, поэтому искал оптимальный вариант. Также сделал возможность запуска PHP скриптов и полную настройку с IDE PHPStrorm, что было весьма не просто.


  1. stranger777
    31.10.2016 19:35

    Не понятно, зачем в статью выкладывать ключи… смысл шифроввания теряется. Может, я чего-то не знаю, не понимаю здесь?..


    1. nerufa
      31.10.2016 20:13
      +2

      В статье я сделал пометку, что ключи используются стандартные от Vagrant, поменять их на свои вам не составляет никакого труда.


      1. stranger777
        31.10.2016 22:07

        Понятно, спасибо.


  1. E_STRICT
    31.10.2016 19:44
    +3

    А какой смысл устанавливать Vagrant и Docker одновременно?


    1. iborzenkov
      31.10.2016 20:00

      Он хотел докер под мак — а под мак, как и под винду докер пашет только в виртуалке с линуксом.


      1. ualinker
        31.10.2016 20:06

        1. iborzenkov
          31.10.2016 20:45

          Ну уж извините, не знал. Надо-же с фряхи портировали виртуалку.


        1. grossws
          31.10.2016 21:22

          @iborzenkov прав, Docker for Mac работает всё так же на виртуалке, используется HyperKit, который содержит гипервизор (на базе xhyve/bhyve). Можно прочитать про это, например, на официальном сайте.


          Они раскрывают не сильно много (в репозитории docker/for-mac вообще лежит заглушка), но они просто перехали с внешних гипервизоров на Hypervisor.framework и запускают более легковесную виртуалку.


          1. ualinker
            31.10.2016 21:29

            Вы правы. Но это всё равно не оправдывает использование Vagrant.


            1. grossws
              31.10.2016 21:32

              Вариант с docker for mac, если правильно помню, требует относительно нового проца с поддержной EPT, так что может быть и оправдано, хотя, имхо, проще будет использовать в этом случае их же toolbox, который даст некоторое удобство и использует тот же virtualbox.


      1. Fesor
        31.10.2016 23:44

        Я испольую dinghy. Docker под мак который без виртуалбокса работает пока не избавляет от необходимости иметь виртуалку и париться с NFS.


    1. nerufa
      31.10.2016 20:15
      -1

      Смысл был в развертывания окружения под разные платформы, чтобы все работало одинаково


      1. ualinker
        31.10.2016 20:30
        +1

        У Docker уже есть нативные клиенты под все платформы, которые вы затрагиваете. Из-за этого из списка выпадает целый Vagrant за ненадобностью, забирая с собой часть оверхеда. Исправьте статью, не распространяйте устаревшие знания.


        1. nerufa
          31.10.2016 20:36

          Спасибо за замечание, нужно сначала изучить эту тему досконально. Насколько помню были несколько проблем не решенных докером.


          1. Fesor
            31.10.2016 23:45
            +1

            "нативные клиенты под все платформы" да, а вот нативных демонов нет. Всеравно под мак и винду поднимается виртуалка с linux.


            1. grossws
              01.11.2016 01:04

              Если говорить именно про клиенты, то они всё время существования всяких boot2docker, docker toolbox и т. п. были нативные под все платформы и использовали переменную окружения DOCKER_HOST, которая содержала нужный сокет, экспонированный с виртуалки.


              1. Fesor
                01.11.2016 02:23

                И в этом крутота докера! Можно подключить клиент к любому докер демону (на удаленном хосте например) и задеплоить приложение в одну команду на хосте! Клево же!


        1. iborzenkov
          31.10.2016 21:46
          +1

          Нативные клиенты то есть — клиент написать дело не хитрое.
          Только вот сервер докера для запуска никсовой машины должен быть либо на линуксе либо на какой-то виртуалке — обычно это virtualbox через vagrant, но как вы мне писали что я не угадал может быть что-то еще.
          Наверное производительность xhyve будет повыше vb, не знаю, но оверхед останется, так как запускаются разные ядра — линуксовое на mac.

          В данном случае автор накостылил с NFS — вопрос что он сделал с virtualbox что он работает у него медленнее NFS — у NFS жалобы как раз на скорость. По сути первую часть статьи можно было заменить командой `docker-machine create` по дефолту и указать что на линуксе нужно просто поставить docker.

          Поэтому я и говорю — установка docker-machine + LAMP в картинках.


          1. nerufa
            31.10.2016 22:20

            Увы, но virtualbox из коробки работает медленно на практике, это сильно заметно при работе с PHP скриптами. А про линукс в статье написано, или использовать связку предложенную или нативно использовать докер. У вагранта есть свои прелести, статический адрес, тот же NFS, хост-менеджер. Опять же как говорится на вкус и цвет…


            1. Fesor
              31.10.2016 23:46
              +1

              но virtualbox из коробки работает медленно

              На самом деле нет. Медленно работают шаредфолдеры. Заменить их на nfs или smb под виндой и норм. Жить можно.


              1. nerufa
                01.11.2016 00:21

                Да, верно, речь именно про share папки, что собственно и сделано с помощью vagrant. Вся прелесть это развернуть окружение максимально быстро.


                1. Fesor
                  01.11.2016 02:32

                  Из интересного добавлю: http://docker-sync.io/


                  1. nerufa
                    01.11.2016 02:35

                    Да, неплохая вещь, игрался с ним


              1. gvozd1989
                01.11.2016 10:24

                Какой NFS сервер посоветуете для Windows?


                1. fog
                  01.11.2016 11:43

                  Попробуйте плагин к варгранту winnfsd


  1. iborzenkov
    31.10.2016 19:52

    Блин, руки за такое оторвать, по самую голову!
    Костыли под мак притягиваете в линукс.

    Короче говоря статья называется взял инструкцию для поднятия docker-machine и прикрутил туда LAMP из готовых контейнеров, плюс еще с ключами прокололся.


    1. nerufa
      31.10.2016 20:16

      Для вас может так и называется, суть вы увы не уловили


      1. Fesor
        31.10.2016 23:46
        +1

        я подозреваю что он имел ввиду что "вагрант в этой связке не нужен".


        1. iborzenkov
          01.11.2016 00:15
          +1

          Ну это по мелочи. Вагрант нужен на маке и винде (или не вагрант).
          Основная претензия — вместо того чтобы разобраться в сути он взял костыли для мака в картинках и перенес все на все системы.
          Начало статьи — как настроить docker-machine. Со второй половины — удаленный интерпретатор и плагин докер в phpstorm в картинках.
          Суть всего LAMP — docker-compose.yml причем наполовину, если уж надо 5.6 — почему не два nginx или разруливание по какому-то параметру.
          Все это пример очень плохого мануала.


  1. furyon
    31.10.2016 20:17

    С недавних пор докер стал работать с виндой без всяких тулбоксов, docker-compose тоже есть. Кроме того там еще замутили красивый UI для работы с докером, в котором есть много полезных данных про окружение и тп. После того как я на винде работал через VB, нативный виндо-докер показался сказкой. Но насколько я помню работает только на win 10 pro и интерпрайз.


    1. grossws
      31.10.2016 21:25
      +1

      Да, с включенным hyper-v, они стали использовать нативную виртуализацию, но внутри там всё то же (или почти то же) минималистичное ядро, как и в toolbox.


    1. Yeah
      01.11.2016 15:13
      +2

      Так-то оно так, но есть нюанс: работает он через hyper-v, а включение hyper-v автоматически блокирует возможную работу обычных виртуалок (virtualbox, например), так что если по каким-то причинам у вас есть проекты с Docker и без оного, то ваш вариант Docker-toolbox, который работает через Virtualbox


  1. Tantacula
    31.10.2016 20:25

    А Command Line Tools Console работает? Когда я использовал вагрант, столкнулся с тем, что приходилось исполнять команды внутри машины через терминал (artisan из laravel использовался), а без автодополнения неудобно команды вводить.


    1. nerufa
      31.10.2016 20:26

      Точно вам не отвечу, скорее всего также будет работать через SSH терминал, т.к. все-таки это remote сервер с точки зрения IDE


  1. tuslo
    01.11.2016 10:15
    +1

    Vagrant уже может сам установить Docker https://www.vagrantup.com/docs/provisioning/docker.html,
    а docker-compose как плагин:

    unless Vagrant.has_plugin?("vagrant-docker-compose")
      system("vagrant plugin install vagrant-docker-compose")  
      exit
    end
    


    1. nerufa
      01.11.2016 13:31
      +1

      В этом просто нет надобности


  1. fog
    01.11.2016 11:37

    nerufa, У вас ничего не сказано о том, что NFS по дефолту в Windows не работает, вот с сайта Vagrant

    Windows users: NFS folders do not work on Windows hosts. Vagrant will ignore your request for NFS synced folders on Windows.

    Я для того чтобы их заставить работать поставил плагин vagrant-winnfsd.
    Работает более-менее нормально, были непонятные проблемы только в проекте где было много симлинков (на windows) — некоторые файлы то не читались то не виделись то ещё что-то.
    Скорость приемлемая — далека от нативной, но намного быстрее стандартных VirtualBox Shared Folders.


    1. nerufa
      01.11.2016 13:41

      Спасибо за замечание, NFS по дефолту есть, но не во всех версиях. Добавил в статью пометку.


      1. akaSStalkALEX
        02.11.2016 15:38

        Почему бы не использовать SMB под Win?


        1. nerufa
          02.11.2016 15:40

          Ничего не мешает, задача изначально стояла другая. Упростить установку на разных ОС.


          1. akaSStalkALEX
            02.11.2016 17:07

            В чем же упрощение, если ваш способ требует дополнительного плагина, который указали выше? SMB работает из коробки, по крайней мере в Win10.


            1. nerufa
              02.11.2016 17:49

              Окружение должно работать на разных платформах, это требование. NFS есть по дефолту, только не в урезанных хоум версиях (в компаниях хоум версии не используют). Для SMB вам нужно будет дополнительно ставить Samba сервер на виртуалку и вручную прописывать mount'ы. SMB медленнее чем NFS (статья на хабре про производительность), поэтому ждать загрузки страницы от 300ms и выше для разработки вообще вредно.


              1. akaSStalkALEX
                02.11.2016 18:09

                Не припомню, чтоб приходилось ставить самбу или что-то прописывать, со скоростью тоже полный порядок. Но тут вам надо спорить с официальной документацией вагранта. И рекомендую почитать про SMB протокол и какое это отношение имеет к самбе в принципе.


  1. akaSStalkALEX
    02.11.2016 15:38

    И вроде RemoteDebug тоже настраивать нет надобности, достаточно сервера в настройках и нажатой «трубки» на панели.


    1. nerufa
      02.11.2016 15:43

      Смысл есть, здесь решается все вопросы связанные с отладкой во всех ситуациях: в браузере, cli, юнит-тестирование


      1. akaSStalkALEX
        02.11.2016 17:04

        Отладка не имеет особого отношения к тестированию и чему-то еще из выше перечисленного, она работает за счет прослушивания порта и обработки входящих соединений. Поэтому в IDE достаточно слушать порт, а за то, чтоб эти запросы приходили, отвечают настройки соответствующего PHP конфига. Все вами перечисленное работает именно как я указал в первом комментарии и, даже, название для этого есть.


        1. nerufa
          02.11.2016 17:25

          Имеет самое что есть прямое отношение, слушать порт недостаточно, т.к. есть три кейса: в браузере, cli, юнит-тестирование. В каждом из них есть свои особенности, для того чтобы не ловить все ваши соединения нужно настраивать mapping каталогов, и устанавливать idekey (bookmarklets), скрипт запущенный в CLI моде через прослушивание вообще работать не будет, т.к. неизвестно куда именно отправлять запрос, также в случае и с unit тестированием. Данное решение с автостартом отладчика покрывает все ситуации о которых я описал выше, без надобности вносить дополнительные настройки в  PHP конфиг. И опять же мы говорим про remote интерпретатор, а не локальный.


          1. akaSStalkALEX
            02.11.2016 18:03
            +1

            Наверное лучше изучить тематику получше, складывается впечатление, что вы пользуетесь инструментами, не понимая, что происходит под капотом. Маппинг каталогов необходим для того, чтоб удаленный код знал, где этот же код на хосте, чтоб во время дебага подсветить нужную строку в вашей IDE. Ключ прописывается в конфиге и IDE, а для того, чтобы в вебе активировался дебаг, надо в куки положить ваш ключ. Так называемые boorkmlets(кстати есть более удобное расширение для Chrome, может и для других браузеров тоже) именно этим и занимаются. Тесты исполняются в консольном PHP, посему третьего, указанного вами варианта не существует их всего два. И если вам неизвестно куда шлется запрос, то конфигу CLI PHP это известно. Аналогично, чтоб активировать консольный дебаг, достаточно в Linux/Mac выполнить export XDEBUG_CONFIG="idekey=key_here". В заключении, повторюсь это не теория, это работает на практике в нашей команде.


            1. nerufa
              02.11.2016 18:10
              -1

              Тема изучена досконально, с вами спорить я не собираюсь, совершенно разные уровни компетенции.


              1. akaSStalkALEX
                02.11.2016 18:15

                Ну вам виднее:)