使用 Vagrant 设置环境
不久前,每当你开始为一家新公司工作时,你都会在最初的几天里花费大量时间来设置你的新环境,也就是在你的新电脑上安装所有必要的工具,以便能够编写代码。这让人非常沮丧,因为即使要安装的软件都是一样的,但总有一些东西会出现故障或丢失,这样你就会减少用于提高工作效率的时间。
Vagrant 简介
幸运的是,人们试图解决这个大问题。首先,我们有了虚拟机,即在自己的电脑中模拟电脑。有了虚拟机,我们就可以在 MacBook 中使用 Linux,这样开发人员就可以共享环境。这是很好的一步,但仍然存在一些问题;例如,虚拟机在不同环境之间移动的体积相当大,而且如果开发人员想要进行更改,他们必须对组织中所有现有的虚拟机进行相同的更改。
经过一番讨论,一群工程师想出了解决这些问题的办法,于是我们就有了 Vagrant。这个神奇的软件允许你用简单的配置文件管理虚拟机。其原理很简单:配置文件指定了我们需要从一组在线可用的虚拟机中使用哪台基础虚拟机,以及如何对其进行自定义—即首次启动虚拟机时要运行哪些命令—这就是所谓的 "配置"。你可能会从一个公共资源库中获取 Vagrant 配置,如果配置发生变化,你可以获取变化并重新配置你的机器。很简单吧?
安装 Vagrant
如果你还没有 Vagrant,安装也很简单。你需要访问 https://www.vagrantup.com/downloads.html 上的 Vagrant 下载页面,然后选择你正在使用的操作系统。执行安装程序(不需要任何额外配置),然后就可以开始了。
使用 Vagrant
使用 Vagrant 非常简单。最重要的部分是 Vagrantfile
文件。该文件包含我们要使用的基础镜像的名称,以及我们要应用的其他配置。以下内容是获得一个带有 PHP 7、MySQL、Nginx 和 Composer 的 Ubuntu 虚拟机所需的配置。将其保存为 Vagrantfile
,放在本书示例目录的根目录下。
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.box = "ubuntu/trusty32"
config.vm.network "forwarded_port", guest: 80, host: 8080
config.vm.provision "shell", path: "provisioner.sh"
end
如你所见,文件很小。基础镜像的名称是 ubuntu/trusty32
,发送到 8080
端口的信息将重定向到虚拟机的 80
端口,配置将基于 provisioner.sh
脚本进行。你需要创建这个文件,它将包含我们需要的不同组件的所有设置。这是你需要添加到该文件中的内容:
#!/bin/bash
sudo apt-get install python-software-properties -y
sudo LC_ALL=en_US.UTF-8 add-apt-repository ppa:ondrej/php -y
sudo apt-get update
sudo apt-get install php7.0 php7.0-fpm php7.0-mysql -y
sudo apt-get --purge autoremove -y
sudo service php7.0-fpm restart
sudo debconf-set-selections <<< 'mysql-server mysql-server/root_
password password root'
sudo debconf-set-selections <<< 'mysql-server mysql-server/root_
password_again password root'
sudo apt-get -y install mysql-server mysql-client
sudo service mysql start
sudo apt-get install nginx -y
sudo cat > /etc/nginx/sites-available/default <<- EOM
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
root /vagrant;
index index.php index.html index.htm;
server_name server_domain_or_IP;
location / {
try_files \$uri \$uri/ /index.php?\$query_string;
}
location ~ \.php\$ {
try_files \$uri /index.php =404;
fastcgi_split_path_info ^(.+\.php)(/.+)\$;
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
include fastcgi_params;
}
}
EOM
sudo service nginx restart
文件看起来很长,但我们要做的事情很多。在文件的第一部分,我们将添加必要的存储库,以便能够获取 PHP 7(因为它不附带官方存储库),然后进行安装。然后,我们将尝试安装 MySQL、服务器和客户端。我们将在此配置中设置 root 密码,因为 Vagrant 无法手动设置。因为这是一台开发机器,所以这并不是什么大问题,但你可以在完成后随时更改密码。最后,我们将安装并配置 Nginx,使其监听 8080 端口。
要启动虚拟机,需要在 Vagrantfile
所在目录下执行以下命令:
$ vagrant up
第一次执行时,它会花费一些时间,因为它必须从资源库下载镜像,然后执行 provisioner.sh
文件。输出结果应该与此类似,后面还有一些输出信息:

要访问新虚拟机,请在存放 Vagrantfile
文件的同一目录下运行以下命令:
$ vagrant ssh
Vagrant 会启动虚拟机的 SSH 会话,这意味着你已经进入了虚拟机。你可以在 Ubuntu 系统的命令行中做任何事情。要退出,只需按下 Ctrl + D。
将文件从笔记本电脑共享到虚拟机很简单:只需将它们移动或复制到与 Vagrantfile
文件所在目录相同的位置,它们就会 "神奇地" 出现在虚拟机的 /vagrant
目录中。它们将被同步,因此你在虚拟机中做的任何改动都会反映在笔记本电脑的文件中。
一旦你有了网络应用程序,并想通过网络浏览器对其进行测试,请记住我们会转发端口。这意味着,要访问虚拟机的 80
端口(网络应用程序的常用端口),就必须在浏览器上指向 8080
端口;举例如下: http://localhost:8080 。