找回密码
 FreeOZ用户注册
查看: 2974|回复: 24
打印 上一主题 下一主题

[IT技术] 使用 Vagrant 打造跨平台开发环境

[复制链接]
跳转到指定楼层
1#
发表于 19-7-2014 20:38:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?FreeOZ用户注册

x
转自:http://blog.segmentfault.com/fenbox/1190000000264347?page=1

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

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

安装步骤

1. 安装 VirtualBox

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

* 虽然 Vagrant 也支持 VMware,不过 VMware 是收费的,对应的 Vagrant 版本也是收费的

2. 安装 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/

* 鉴于国内网速,我们将下载镜像的步骤单独剥离出来了

3. 添加镜像到 Vagrant

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

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

4. 初始化开发环境

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

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

  1. $ vagrant ssh  # SSH 登录
  2. $ cd /vagrant  # 切换到开发目录,也就是宿主机上的 `~/dev`
复制代码
~/dev 目录对应虚拟机中的目录是 /vagrant

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

5. 其他设置

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

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

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

6. 打包分发

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

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

7. 常用命令

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

8. 注意事项

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

  1. # Apache 配置添加:
  2. EnableSendfile off

  3. # Nginx 配置添加:
  4. sendfile off;
复制代码
SegmentFault 团队就是用这种方式统一开发环境的

本篇文章所用程序版本 VirtualBox 4.2.16,Vagrant 1.2.7

相关帖子

回复  

使用道具 举报

2#
 楼主| 发表于 19-7-2014 20:40:24 | 只看该作者

vagrant是一个非常棒的工具,做Linux开发的同学一定不能错过。

还有一个类似工具是docker,可以和vagrant一起配合使用:
https://www.docker.com/
回复  

使用道具 举报

3#
发表于 19-7-2014 23:43:53 | 只看该作者
在虚拟机里开发,这个不知道行不行。我们个人使用的机器配置不是很高,直接在native环境下都很慢的,如果放到虚拟机机里,不知道怎么样。我认为类似docker或者是vagrant可能更适合需要简化系统创建过程的场合吧,比如说需要快速创建服务器集群。而且通过保留创建环境的脚本,也能更清楚滴知道各个环境的配置情况。以前很头疼的版本管理也解决了。我知道有些政府部门和大型企业有几千个虚拟机,这种工具对他们来说就太好了。但是对于程序员可能就帮助不是特别大了吧。
回复  

使用道具 举报

4#
 楼主| 发表于 20-7-2014 00:32:44 | 只看该作者



Vagrant其实不是用于生产环境,而主要是用户开发环境的快速配置,现在的机子跑虚拟机都很快了。

生产环境的几千台机器的部署有专门的部署配置和工具,我所了解的,可以用chef或puppet来进行服务器的配置和软件包安装(如果需要修改配置和更新软件包,只要在chef服务器上进行单点修改,chef 客户端就可以自动将修改更新到本地服务器,puppet也是近似的原理),然后用Capistrano进行代码部署(当然是测试好的代码)。

(这些都是我刚学到的半桶水,有遗漏或谬误之处,欢迎大家补充指正)
回复  

使用道具 举报

5#
 楼主| 发表于 20-7-2014 00:40:43 | 只看该作者
现在有一个新名词叫devops:
http://zh.wikipedia.org/wiki/DevOps

用编程的办法来做系统运维。
回复  

使用道具 举报

6#
发表于 20-7-2014 01:07:04 | 只看该作者
ubuntuhk 发表于 19-7-2014 22:40
现在有一个新名词叫devops:
http://zh.wikipedia.org/wiki/DevOps

DevOps可不是新名词哦
回复  

使用道具 举报

7#
发表于 20-7-2014 01:08:35 | 只看该作者
ubuntuhk 发表于 19-7-2014 22:32
Vagrant其实不是用于生产环境,而主要是用户开发环境的快速配置,现在的机子跑虚拟机都很快了。

生 ...

chef对于Windows来讲就是shit。bug一堆,而且内存泄漏。
回复  

使用道具 举报

8#
发表于 20-7-2014 01:14:38 | 只看该作者
ubuntuhk 发表于 19-7-2014 21:40
现在有一个新名词叫devops:
http://zh.wikipedia.org/wiki/DevOps

DevOp 也可以是既做开发又做日常维护,很多公司招人时就招DevOps,不一定是几个部门之间合作。
回复  

使用道具 举报

9#
 楼主| 发表于 20-7-2014 13:17:53 | 只看该作者
superopengl 发表于 20-7-2014 00:07
DevOps可不是新名词哦


应该是最近五年才出现的名词,对我来说很新鲜,可能已经有很多了从事了DevOps这种岗位好几年了,你也是?
回复  

使用道具 举报

10#
 楼主| 发表于 20-7-2014 13:18:58 | 只看该作者
superopengl 发表于 20-7-2014 00:08
chef对于Windows来讲就是shit。bug一堆,而且内存泄漏。


chef在Linux世界还是比较流行,不过用的是Ruby,我看起来有点吃力。

你们采用Windows平台部署产品吗?除了Chef,应该有其它更好的选择吧?
回复  

使用道具 举报

11#
 楼主| 发表于 20-7-2014 13:19:53 | 只看该作者
trisun 发表于 20-7-2014 00:14
DevOp 也可以是既做开发又做日常维护,很多公司招人时就招DevOps,不一定是几个部门之间合作。


哈,我感觉我做DevOp应该会适应得比较快,会开发也会点系统维护,哈。
回复  

使用道具 举报

12#
发表于 20-7-2014 15:31:04 | 只看该作者
最开始入行的那年月开发人员就是又得上厅堂又要下厨房的,现在又轮回回去了。
搞搞系统维护的确是挺有意思的。我很怀念当初需要编译Linux内核的日子。
回复  

使用道具 举报

13#
发表于 20-7-2014 15:33:28 | 只看该作者
ubuntuhk 发表于 20-7-2014 12:19
哈,我感觉我做DevOp应该会适应得比较快,会开发也会点系统维护,哈。

我看到stackoverflow上面有人说Vagrant的overhead比较高,是这样吗?我是使用Win7做开发,可不可以使用Vagrant + VPC建立环境呢?
回复  

使用道具 举报

14#
发表于 20-7-2014 16:20:26 | 只看该作者
full-stack engineering/devops = 公司太cheap请不起系统管理员,^_^

Vagrant 确实是个好东西,我就在用他来统一所有工程师的开发环境,Vagrantfile如下
  1. VAGRANTFILE_API_VERSION = "2"

  2. Vagrant.configure(VAGRANTFILE_API_VERSION) do |inst|
  3.   inst.vm.define "web" do |config|
  4.     config.vm.hostname = "web-dev"
  5.     config.vm.box = "dlp"
  6.     config.vm.network "private_network", ip: "192.168.33.10"
  7.     config.vm.network "forwarded_port", guest: 80, host: 8089
  8.     config.ssh.forward_agent = false
  9.     config.vm.synced_folder "web", "/web", :owner => "www-data", :group => "www-data"
  10.     config.vm.synced_folder "dashboard", "/dashboard", :owner => "www-data", :group => "www-data"
  11.     config.vm.synced_folder "web/template", "/template", :owner => "www-data", :group => "www-data"
  12.     config.vm.provider "virtualbox" do |vb|
  13.       vb.customize ["modifyvm", :id, "--memory", "1024"]
  14.     end
  15.     config.vm.provision "puppet" do |puppet|
  16.       puppet.manifests_path = "manifests"
  17.       puppet.manifest_file  = "vagrant.pp"
  18.       puppet.module_path = 'manifests/modules'
  19.       puppet.facter = {
  20.         "vagrant" => 'yes'
  21.       }
  22.     end
  23.   end

  24.   inst.vm.define "queue" do |config|
  25.     config.vm.box = "dlp"
  26.     config.vm.network "private_network", ip: "192.168.33.11"
  27.     config.ssh.forward_agent = false
  28.     config.vm.provider "virtualbox" do |vb|
  29.       vb.customize ["modifyvm", :id, "--memory", "512"]
  30.     end
  31.     config.vm.provision "puppet" do |puppet|
  32.       puppet.manifests_path = "manifests"
  33.       puppet.manifest_file  = "queue.pp"
  34.       puppet.module_path = 'manifests/modules'
  35.       puppet.facter = {
  36.         "vagrant" => 'yes'
  37.       }
  38.     end
  39.   end

  40.   inst.vm.define "database" do |config|
  41.     config.vm.box = "dlp"
  42.     config.vm.network "private_network", ip: "192.168.33.12"
  43.     config.ssh.forward_agent = false
  44.     config.vm.synced_folder "seed", "/seed"
  45.     config.vm.provider "virtualbox" do |vb|
  46.       vb.customize ["modifyvm", :id, "--memory", "1024"]
  47.     end
  48.     config.vm.provision "puppet" do |puppet|
  49.       puppet.manifests_path = "manifests"
  50.       puppet.manifest_file  = "database.pp"
  51.       puppet.module_path = 'manifests/modules'
  52.     end
  53.   end
  54. end
复制代码
当然这个三台虚拟机的overhead确实是高,不过8G内存的ubuntu跑的一点问题没有。

其中

  1.     config.vm.synced_folder "web", "/web", :owner => "www-data", :group => "www-data"
复制代码
是用来解决一个vbox的share_folder的坑

评分

参与人数 1威望 +50 收起 理由
ubuntuhk + 50 赞一个!

查看全部评分

回复  

使用道具 举报

15#
发表于 20-7-2014 16:22:30 | 只看该作者
还有个好处是可以通过 puppet/chef 达到生产环境和开发环境的统一
回复  

使用道具 举报

16#
发表于 20-7-2014 18:08:39 | 只看该作者
docker还是更轻量一些。
回复  

使用道具 举报

17#
发表于 21-7-2014 14:33:01 | 只看该作者
ubuntuhk 发表于 20-7-2014 11:17
应该是最近五年才出现的名词,对我来说很新鲜,可能已经有很多了从事了DevOps这种岗位好几年了,你也是 ...

俺不是干这个的。公司有这个部门,我们开发的产品需要移交给DevOps部门做部署和配置。

评分

参与人数 1威望 +20 收起 理由
ubuntuhk + 20 谢谢分享!

查看全部评分

回复  

使用道具 举报

18#
发表于 21-7-2014 14:35:43 | 只看该作者
ubuntuhk 发表于 20-7-2014 11:18
chef在Linux世界还是比较流行,不过用的是Ruby,我看起来有点吃力。

你们采用Windows平台部署产品吗 ...

公司部分产品是由chef部署在windows上的。chef在我们windows developer中口碑很差。至于DevOps部门有什么knowhow或work around我就不知道了
回复  

使用道具 举报

19#
 楼主| 发表于 23-7-2014 21:22:18 | 只看该作者
cfk 发表于 20-7-2014 15:20
full-stack engineering/devops = 公司太cheap请不起系统管理员,^_^

Vagrant 确实是个好东西,我就在用 ...


谢谢分享这个Vagrant配置,可以把web、db和queue服务都分离开来,很棒
回复  

使用道具 举报

20#
 楼主| 发表于 23-7-2014 21:23:24 | 只看该作者
cfk 发表于 20-7-2014 15:22
还有个好处是可以通过 puppet/chef 达到生产环境和开发环境的统一

我看你的Vagrant配置用的是Puppet,有没有和Chef比较过,哪个更容易配置管理一些?(对于不懂Ruby和Python的php engineer来说。)
回复  

使用道具 举报

21#
 楼主| 发表于 23-7-2014 21:24:09 | 只看该作者
coredump 发表于 20-7-2014 17:08
docker还是更轻量一些。


docker只能用在Linux上,Vagrant可以用在各种跨平台环境,二者还是有区别,相比较而言,如果是mac和windows上,就只能采用Vagrant的方案了。
回复  

使用道具 举报

22#
 楼主| 发表于 23-7-2014 21:24:52 | 只看该作者
superopengl 发表于 21-7-2014 13:35
公司部分产品是由chef部署在windows上的。chef在我们windows developer中口碑很差。至于DevOps部门有什么 ...


这或许是因为chef原本是给Linux开发的,而windows版本的移植写得太差导致的吧。
回复  

使用道具 举报

23#
发表于 24-7-2014 00:12:13 | 只看该作者
这个东西配置还是太复杂,如果能和nodejs+npm那样简单的环境配置就好了。
回复  

使用道具 举报

24#
发表于 24-7-2014 00:22:37 | 只看该作者
ubuntuhk 发表于 23-7-2014 20:24
docker只能用在Linux上,Vagrant可以用在各种跨平台环境,二者还是有区别,相比较而言,如果是mac和win ...

这种情况下就用一个Linux虚拟机,然后虚拟机里面用docker比较好。整体开发效率和部署性能都更好一些
回复  

使用道具 举报

25#
 楼主| 发表于 5-8-2014 22:59:15 | 只看该作者
分享一篇有关Vagrant的slides,感觉讲得不错:
http://www.slideshare.net/ihower/vagrant-osdc
回复  

使用道具 举报

您需要登录后才可以回帖 登录 | FreeOZ用户注册

本版积分规则

小黑屋|手机版|Archiver|FreeOZ论坛

GMT+11, 14-11-2025 15:23 , Processed in 0.030683 second(s), 45 queries , Gzip On, Redis On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表