Vagrant: самый простой и быстрый способ создания изолированной среды разработки

Разработка 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.04
  • config.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 под свои задачи.

Обязательно загляните в документацию, мы рассмотрели не все настройки. Покопайтесь в каталоге с образами, возможно там вы найдете готовый образ со всем необходимым или создадите собственный. Удачи!

Евгений Прокопьев
Евгений Прокопьев
Привет! Меня зовут Евгений Прокопьев. Я разрабатываю сложные web-приложения для бизнеса. В своей работе использую: PHP, Python, JavaScript, SQL, HTML, CSS и много сопутствующих технологий.

Рассылка от программиста

Подпишись и получай полезные материалы