Разработка web-приложений начинается с настройки окружения, в котором будет запускаться и тестироваться код. Необходима среда разработки, в которой, к примеру установлена операционная система Linux со специфичными настройками, зависимости проекта и необходимые программы (MySQL, Nginx, PHP и т.д.).
От проекта к проекту требования могут меняться. Разработчик может работать над несколькими проектами одновременно и у каждого из них будут разные зависимости. Так же над каждым проектом может работать команда.
Как не засорять операционную систему лишними программами? Как избежать конфликтов и несовместимости версий программного обеспечения? Как описать процесс настройки рабочего окружения так, чтобы другие члены команды смогли то же самое воспроизвести на своих компьютерах?
Vagrant создает изолированные среды разработки, основная система остается чистой. При этом не жертвуя привычными инструментами разработки (редакторы, браузеры и т. д.).
Описав процесс настройки в специальном файле, рабочее окружения легко пересоздать на другом компьютере. Vagrant работает в Windows, Mac и Linux.
Дочитав до конца вы научитесь применять Vagrant в своих проектах. Для быстрого старта мы рассмотрим только необходимые команды, которые используются каждый день.
Как это работает
Vagrant консольная утилита, которая управляет виртуальными машинами. По умолчанию Vagrant работает с системой виртуализации VirtualBox. Такая связка доступна в операционных системах Windows, Mac и Linux.
В папке проекта создается файл Vagrantfile с описанием конфигурации виртуальной машины. В котором указывается операционная система, выделяемые ресурсы, сетевые настройки и скрипты по установке и настройке дополнительных программ.
Команда vagrant up
на основе Vagrantfile создает и запускает виртуальную машину. Во время ее работы папка проекта синхронизируется между основной операционной системой и операционной системой виртуальной машины.
Разработка ведется в основной операционной системе в привычных программах (браузер, IDE и т.д.), а код запускается в изолированном окружении виртуальной машины.
Достаточно поделиться Vagrantfile с членами команды, чтобы они так же легко и быстро развернули среду разработки с теми же зависимостями и настройками.
Установка
Сначала скачайте и установите VirtualBox для своей операционной системы. Затем скачайте и установите Vagrant.
Откройте терминал если вы используете Linux или Mac. В Windows установите и запустите эмулятор Git BASH. Для проверки успешной установки введите команду:
vagrant -v
Если видите что-то вроде этого, установка прошла успешно:
Vagrant 2.1.2
Использование
Для демонстрации создадим папку проекта и перейдем в нее:
// создание папки проекта
mkdir newapp
// переход в папку
cd newapp
Наше web-приложение будет состоять из одного файла, которое будет выводить информацию о текущей конфигурации PHP. Создайте в папке проекта файл index.php
со следующим содержимым:
<?php
phpinfo();
Создание Vagrantfile
Теперь займемся созданием рабочего окружения в котором будет выполняться код приложения. Введите в терминале:
vagrant init -m bento/ubuntu-18.04
Команда vagrant init
создает файл Vagrantfile в текущей директории. В нем на языке Ruby описывается конфигурация виртуальной машины. Синтаксис простой и понятный даже если вы никогда не использовали Ruby. Содержимое созданного файла Vagrantfile:
Vagrant.configure("2") do |config|
config.vm.box = "bento/ubuntu-18.04"
end
При создании Vagrantfile мы указали название бокса bento/ubuntu-18.04
. Бокс это образ операционной системы, который так же может содержать установленные программы (LAMP, Python и т.д).
Разработчики Vagrant рекомендуют использовать образы Bento, которые хранятся в специальном каталоге вместе с остальными образами.
Перед созданием виртуальной машины добавим еще несколько настроек в Vagrantfile:
Vagrant.configure("2") do |config|
config.vm.box = "bento/ubuntu-18.04"
config.vm.provider "virtualbox" do |vb|
vb.name = "newapp"
vb.memory = "1024"
vb.cpus = 1
end
config.vm.hostname = "newapp"
config.vm.synced_folder ".", "/home/vagrant/code",
owner: "www-data", group: "www-data"
config.vm.network "forwarded_port", guest: 80, host: 8000
config.vm.network "forwarded_port", guest: 3306, host: 33060
config.vm.network "private_network", ip: "192.168.10.100"
config.vm.provision "shell", path: "provision.sh"
end
config.vm.box
— базовый образ. В нашем случае Ubuntu 18.04config.vm.provider
— система виртуализации. Доступные провайдеры: VirtualBox, VMware, Hyper-V, Docker и др.config.vm.hostname
— имя хоста.config.vm.synced_folder
— синхронизация папок. Первым параметром передается путь хостовой (основной) машины, вторым параметром передается путь гостевой (виртуальной машины)config.vm.network
— настройки сети. Мы настроили перенаправление портов и статический ip-адрес, к которому привяжем доменnewapp.loc
. Доступны и другие настройки.config.vm.provision
— служит для автоматической установки и настройки программного обеспечения. Мы использовали самый простой способ Shell-скрипт, также доступны другие: Ansible, Chef, Puppet и др.
Для удобства настройка системы вынесена в отдельный файл provision.sh
. Во время установки Vagrant запустит его внутри созданной виртуальной машины. Содержимое файла provision.sh
:
apt-get update
apt-get -y upgrade
apt-add-repository ppa:ondrej/php -y
apt-get update
apt-get install -y software-properties-common curl zip
apt-get install -y php7.2-cli php7.2-fpm \
php7.2-pgsql php7.2-sqlite3 php7.2-gd \
php7.2-curl php7.2-memcached \
php7.2-imap php7.2-mysql php7.2-mbstring \
php7.2-xml php7.2-json php7.2-zip php7.2-bcmath php7.2-soap \
php7.2-intl php7.2-readline php7.2-ldap
apt-get install -y nginx
rm /etc/nginx/sites-enabled/default
rm /etc/nginx/sites-available/default
cat > /etc/nginx/sites-available/newapp <<EOF
server {
listen 80;
server_name .newapp.loc;
root "/home/vagrant/code";
index index.html index.htm index.php;
charset utf-8;
location / {
try_files \$uri \$uri/ /index.php?\$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
access_log off;
error_log /var/log/nginx/newapp-error.log error;
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
}
}
EOF
ln -s /etc/nginx/sites-available/newapp /etc/nginx/sites-enabled/newapp
service nginx restart
Структура проекта:
newapp/
index.php
provision.sh
Vagrantfile
Создаем виртуальную машину. В первый раз процесс займет больше времени, Vagrant должен скачать образ с операционной системой. Выполните команду, которая создаст и запустит виртуальную машину:
vagrant up
Изолированное окружение готово! Откройте браузер и введите:
http://localhost:8000
Локальный домен
Привязывать локальный домен не обязательно, но иногда это удобно. Ранее мы настроили Nginx на работу с доменом newapp.loc
и настроили статический ip-адрес. Добавим информацию о перенаправлении в файл hosts
. Я использую операционную систему Ubuntu, у меня процесс выглядит так:
sudo su
echo '192.168.10.100 newapp.loc' >> /etc/hosts
Откройте браузер и введите:
http://newapp.loc
Часто используемые команды
Запуск и перезагрузка
Чтобы запустить или создать виртуальную машину используется команда:
// creates and configures guest machines
vagrant up
Для перезагрузки виртуальной машины используется команда:
// reload
vagrant reload
// reload and run provisioners
vagrant reload --provision
Если после первого запуска потребуется сгенерировать ключи, выполните команду:
// Linux or Mac
ssh-keygen
// Windows
ssh-keygen.exe
Подключение
Для подключения к запущенной виртуальной машине по протоколу ssh используется команда:
vagrant ssh
Остановка
Для остановки виртуальной машины используется команда:
vagrant halt
Удаление
Чтобы удалить виртуальную машину используется команда:
vagrant destroy
Проверка
Для проверки состояния виртуальной машины используются команды:
// tell you the state of the machines...
vagrant status
// tell you the state of all active Vagrant environments on the system
vagrant global-status
Доступные команды
Для просмотра всех доступных команд запустите в терминале:
vagrant
Коротко о главном
Подводя итоги пройдемся по основным моментам рабочего процесса. В корне проекта вместе с исходным кодом лежит файл Vagrantfile. Для разворачивания рабочего окружения достаточно выполнить одну команду vagrant up
. Если Vagrantfile изменился, выполните команды vagrant destroy
и vagrant up
, виртуальная машина будет пересоздана с новыми настройками. Используя систему контроля версий члены команды также легко пересоздадут окружение на своих компьютерах.
Каждый день, работая над проектом, запускаем сначала виртуальную машину командой vagrant up
. Исходный код проекта автоматически синхронизируется с виртуальной машиной. Порты проброшены. Работаем над проектом в привычном редакторе кода и браузере. Если по каким-то причинам необходимо попасть в виртуальную машину, выполняем команду vagrant ssh
. Закончив работу останавливаем виртуальную машину командой vagrant halt
.
P.S. Используйте пример файла Vagrantfile из этой статьи. Измените настройки и скрипт provision.sh
под свои задачи.
Обязательно загляните в документацию, мы рассмотрели не все настройки. Покопайтесь в каталоге с образами, возможно там вы найдете готовый образ со всем необходимым или создадите собственный. Удачи!