构建/发布管理 使用 Vagrant 打造跨平台开发环境

laofo · 发布于 2015年6月29日 · 263 次阅读
4

Vagrant 是一款用来构建虚拟开发环境的工具,非常适合 php/python/ruby/java 这类语言开发 web 应用,“代码在我机子上运行没有问题”这种说辞将成为历史。

我们可以通过 Vagrant 封装一个 Linux 的开发环境,分发给团队成员。成员可以在自己喜欢的桌面系统(Mac/Windows/Linux)上开发程序,代码却能统一在封装好的环境里运行,非常霸气。

安装步骤

  1. 安装 VirtualBox

虚拟机还是得依靠 VirtualBox 来搭建,免费小巧。 下载地址:https://www.virtualbox.org/wiki/Downloads

  • 虽然 Vagrant 也支持 VMware,不过 VMware 是收费的,对应的 Vagrant 版本也是收费的
  1. 安装 Vagrant

下载地址:http://downloads.vagrantup.com/ 根据提示一步步安装。

此外,还得下载官方封装好的基础镜像: Ubuntu precise 32 VirtualBox http://files.vagrantup.com/precise32.box Ubuntu precise 64 VirtualBox http://files.vagrantup.com/precise64.box

如果你要其他系统的镜像,可以来这里下载:http://www.vagrantbox.es/

  • 鉴于国内网速,我们将下载镜像的步骤单独剥离出来了
  1. 添加镜像到 Vagrant

假设我们下载的镜像存放路径是 ~/box/precise64.box,在终端里输入:

$ vagrant box add hahaha ~/box/precise64.box hahaha 是我们给这个 box 命的名字,~/box/precise64.box 是 box 所在路径

  1. 初始化开发环境

创建一个开发目录(比如:~/dev),你也可以使用已有的目录,切换到开发目录里,用 hahaha 镜像初始化当前目录的环境:

$ cd ~/dev # 切换目录 $ vagrant init hahaha # 初始化 $ vagrant up # 启动环境 你会看到终端显示了启动过程,启动完成后,我们就可以用 SSH 登录虚拟机了,剩下的步骤就是在虚拟机里配置你要运行的各种环境和参数了。

$ vagrant ssh # SSH 登录 $ cd /vagrant # 切换到开发目录,也就是宿主机上的 ~/dev ~/dev 目录对应虚拟机中的目录是 /vagrant

Windows 用户注意:Windows 终端并不支持 ssh,所以需要安装第三方 SSH 客户端,比如:Putty、Cygwin 等。

  1. 其他设置

Vagrant 初始化成功后,会在初始化的目录里生成一个 Vagrantfile 的配置文件,可以修改配置文件进行个性化的定制。

Vagrant 默认是使用端口映射方式将虚拟机的端口映射本地从而实现类似 http://localhost:80 这种访问方式,这种方式比较麻烦,新开和修改端口的时候都得编辑。相比较而言,host-only 模式显得方便多了。打开 Vagrantfile,将下面这行的注释去掉(移除 #)并保存:

config.vm.network :private_network, ip: "192.168.33.10" 重启虚拟机,这样我们就能用 192.168.33.10 访问这台机器了,你可以把 IP 改成其他地址,只要不产生冲突就行。

  1. 打包分发

当你配置好开发环境后,退出并关闭虚拟机。在终端里对开发环境进行打包:

$ vagrant package 打包完成后会在当前目录生成一个 package.box 的文件,将这个文件传给其他用户,其他用户只要添加这个 box 并用其初始化自己的开发目录就能得到一个一模一样的开发环境了。

  1. 常用命令

$ vagrant init # 初始化 $ vagrant up # 启动虚拟机 $ vagrant halt # 关闭虚拟机 $ vagrant reload # 重启虚拟机 $ vagrant ssh # SSH 至虚拟机 $ vagrant status # 查看虚拟机运行状态 $ vagrant destroy # 销毁当前虚拟机 更多内容请查阅官方文档 http://docs.vagrantup.com/v2/cli/index.html

  1. 注意事项

使用 Apache/Nginx 时会出现诸如图片修改后但页面刷新仍然是旧文件的情况,是由于静态文件缓存造成的。需要对虚拟机里的 Apache/Nginx 配置文件进行修改:

Apache 配置添加:

EnableSendfile off

Nginx 配置添加:

sendfile off; SegmentFault 团队就是用这种方式统一开发环境的 本篇文章所用程序版本 VirtualBox 4.2.16,Vagrant 1.2.7

转自http://segmentfault.com/a/1190000000264347

共收到 1 条回复
4
laofo · #1 · 2015年6月29日

作者: JeremyWei | 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明 网址: http://weizhifeng.net/learn-vagrant-01.html

介绍

Vagrant可以为你提供可配置、可再生、便携的工作环境,它主要是一个中间层技术,它的下层是VirtualBox, VMware, AWS或者其他provider,它的上层是provisioning工具,比如shell scripts, Chef, or Puppet等可以自动化安装和配置软件的工具。

对你有什么用

对于开发人员来说,Vagrant可以帮你统一团队成员的开发环境。如果你或者你的伙伴创建了一个Vagrantfile,那么你只需要执行vagrant up就行了,所有的软件都会安装并且配置好。团队成员可以通过相同的Vagrantfile来创建他们的开发环境,无论他们是在Linux, Mac OS X, 或者Windows下,这样就可以保证你团队成员的代码是跑在相同的环境中,从而避免令人烦躁的【在我的机器上是可以的】问题。

对于运维人员来说,Vagrant可以给你提供一次性,并且与线上一致的服务器环境,你可以利用VirtualBox或者VMware来测试你的shell scripts, Chef cookbooks, Puppet modules等管理脚本。你不需要再苦逼的登录到线上服务器提心吊胆的测试了,Vagrant可以解救你。

对于设计人员来说,Vagrant可以帮你处理一切,你只需要专注在设计上就好了。一旦开发人员帮你配置好了Vagrant之后,你只需要执行vagrant up,然后开始设计。

安装

Vagrant的安装非常简单,直接下载对应操作系统的版本就可以了。

第一印象

$ vagrant init hashicorp/precise32 $ vagrant up 执行以上命令之后,你已经拥有了一个Ubuntu 12.04 LTS 32-bit系统运行在VirtualBox中。 你可以通过vagrant ssh登录到这个虚拟机中,如果你不需要它了,可以通过vagrant destroy来销毁。

建立项目

建立Vagrant项目的第一步是配置Vagrantfile。执行如下命令

$ mkdir my_vagrant $ cd my_vagrant $ vagrant init 这会在当前目录下生成一个Vagrantfile文件,这个文件就是一切的开始,对了,你最好把它添加到版本库中,这样你的小伙伴也可以通过它来初始化开发环境了。

Box

Vagrant使用的image叫做box,如果你执行过上面的命令,那么你已经在本地拥有了一个box。如果没有执行,那么你需要执行

$ vagrant box add hashicorp/precise32 这会从Vagrant Cloud中下载hashicorp/precise32。 我们接下来需要配置我们的项目来使用这个box,编辑Vagrantfile文件并修改为:

Vagrant.configure("2") do |config| config.vm.box = "hashicorp/precise32" end 除了hashicorp/precise32,你可以在Vagrant Cloud找到更多适合你的box。

启动

$ vagrant up 就这么简单。完成之后,你就拥有了一个Ubuntu系统,你可以通过

$ vagrant ssh 登录它,然后随意执行任何命令,除了rm -rf /,原因接下来说明。

目录同步

虽说如此容易的启动一个虚拟机的确很酷,但不是所有人都喜欢通过终端来编辑文件(Vim党和Emacs党勿喷),所以Vagrant提供了一个目录同步的功能。默认情况下Vagrant会把你的项目目录(存储Vagrantfile的那个)与虚拟机中的/vagrant进行同步(这就是为什么你不要执行rm -rf /的原因,否则你会把项目目录删掉)。我们可以登录到虚拟机上验证一下。

$ vagrant up ... $ vagrant ssh ... vagrant@precise32:~$ ls /vagrant Vagrantfile 如果你不确信,可以创建一个文件看看:

vagrant@precise32:~$ touch /vagrant/foo vagrant@precise32:~$ exit $ ls foo Vagrantfile 怎么样?没骗你吧。通过目录同步功能,你还可以继续使用最爱的编辑器来修改虚拟机中的文件。

配置

假设我们的业务需要安装Apache,传统的做法是在虚拟机上手动安装并配置,如果这样那么使用Vagrant的人都需要重复一遍。幸好Vagrant提供了自动配置(automated provisioning)的功能。通过这个特性,Vagrant会在你执行vagrant up的时候自动安装所需的软件。

在你的项目目录(即包含Vagrantfile的目录)下创建Bash脚本bootstrap.sh,内容如下:

#!/usr/bin/env bash

apt-get update apt-get install -y apache2 rm -rf /var/www ln -fs /vagrant /var/www 接下来,我们来配置让Vagrant在启动虚拟机的时候自动执行以上脚本,在Vagrantfile中添加如下内容:

Vagrant.configure("2") do |config| config.vm.box = "hashicorp/precise32" config.vm.provision :shell, path: "bootstrap.sh" end provision这一行告诉Vagrant使用shell provisioner来配置虚拟机,要执行的脚本是bootstrap.sh。

接下来执行vagrant up来启动虚拟机,之后你可以登录到虚拟机来验证Apache时候已经安装成功:

$ vagrant ssh ... vagrant@precise32:~$ wget -qO- 127.0.0.1 网络

总是在终端里边访问Apache不是什么好的主意,所以这个部分我们会对Vagrant的网络进行配置,让它可以通过宿主机器(Host machine)来访问。

我们用端口映射来实现对Apache服务的访问,编辑Vagrantfile文件如下:

Vagrant.configure("2") do |config| config.vm.box = "hashicorp/precise32" config.vm.provision :shell, path: "bootstrap.sh" config.vm.network :forwarded_port, host: 4567, guest: 80 end forwarded_port这一行把宿主机器的4567端口映射到了客户机器(Guest machine)的80端口。然后通过vagrant reload重启虚拟机,重启完成之后你用浏览器打开 http://127.0.0.1:4567WEB页面了。就可以访问到

参考

http://docs.vagrantup.com/v2/getting-started/index.html http://docs.vagrantup.com/v2/getting-started/project_setup.html http://docs.vagrantup.com/v2/getting-started/boxes.html http://docs.vagrantup.com/v2/getting-started/up.html http://docs.vagrantup.com/v2/getting-started/provisioning.html

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册