一. 为什么要构建虚拟化开发环境?
随着业务复杂度在不断的提高, 我们的的应用被拆分成了若干个小部分, 各尽其职, 其中有些单元通过接口暴露被其他单元调用, 有些单元会出现一些问题让我们无法在正式环境上去操作, 而测试环境又不动, 因此搞一个虚拟的化的开发环境就被提上了日程.
同时也可以模拟一些没有使用过的场景, 便于后续真实部署的时候不会手忙脚乱 .
1. 保证开发环境和生产环境一致
虚拟化开发环境其实就是在本机虚拟一个生产环境,得益于硬件的低廉,开发机已经变得性能非常强劲,4核、32G内存的计算机也不需要太多的费用,跑虚拟机相当顺畅。
使用虚拟化开发环境,开发人员在本机可以使用自己喜欢或者顺手的OS(Windows、Linux、Mac OS等),而程序是运行在虚拟机中,迁移到生产环境可以避免环境不兼容导致的莫名错误。
虚拟化开发环境对于团队中开发环境OS、测试和生产环境不同的情况特别适用。
2. 简化了调试环境的部署
稍微复杂的系统,部署调试环境就会是个麻烦的事情,nginx、mysql、redis、mongodb等估计都要安装,可能还有一大堆第三方的开发库......,通过虚拟化技术可以简化这些工作。
虚拟环境可以由专人制作,然后分发给开发人员、测试人员,他们可以很方便的在本机调试。
如果生产环境还是多平台(或多个OS版本)的,可以制作多个虚拟机,简单切换一下就可以调试了。
二. 开始制作虚拟化开发环境
1. 安装VirtualBox
VirtualBox是Oracle开源的虚拟化系统,到官方网站:
https://www.virtualbox.org/wiki/Downloads/ 下载virtualbox最新的版本并安装,详细过程略过。
2. 使用vagrant
vagrant是一个用Ruby开发的工具,封装了VirtualBox的一些命令,它简化了virtualbox虚拟机的操作,增加了自动化部署软件puppet/chef的支持
通过vagrant可以很方便的创建和部署、分发虚拟化开发环境。
注意,Vagrant 是没有图形界面的,所以安装完成后也没有桌面快捷方式。具体使用方法,接下来会详细说明。
3、安装vagrant
方法一:
下载安装包, 官方网站:https://www.vagrantup.com/downloads
注意: 尽量下载最新的程序,因为VirtualBox经常升级,升级后有些接口会变化,老的vagrant可能无法使用
方法二:
vagrant是ruby开发的,如果已经安装了ruby,可以用gem安装:
gem install vagrant
Vagrant 的安装程序会自动把安装路径加入到 PATH 环境变量,所以,这时候可以通过
命令行执行 vagrant version 检查是否安装成功:
> vagrant version
Installed Version: 2.2.7
Latest Version: 2.2.8
4. 建立环境
1)建立开发环境目录(可以跳过,使用已有的目录)
在资源管理器中建一个文件夹
本文是E:workspacedevel_env
2)打开命令行窗口,vagrant的操作都是命令行的
进入E:workspacedevel_env目录中
按住shift键,在空白处按鼠标右键,在弹出菜单中点“打开命令行窗口”
3) 加一个box
box是一个zip包,包含了vagrant的配置信息和VirtualBox的虚拟机镜像文件
官方提供了一个box,https://www.vagrantup.com/docs/boxes/format
也可以选一个团队在用的系统,http://www.vagrantbox.es
或者自己做一个也行
我服务器都CentOS,选了CentOS 7.2 x64 (Minimal, Puppet 4.2.3, Guest Additions 4.3.30)
添加box的命令:
vagrant box add base 远端的box url或者本地的box文件名
vagrant box add 是添加命令
base 是box的名称,也可以任意的标题,base是默认名称
例子:
vagrant box add base https://dl.dropbox.com/u/7225008/Vagrant/CentOS-7.2-x86_64-minimal.box
vagrant box add base e:/vbox/CentOS-7.2-x86_64-minimal.box
vagrant box add "CentOS 7.2 x86_64 minimal" e:/vbox/CentOS-7.2-x86_64-minimal.box
文件被放到C:Users当前用户名.vagrant.dboxes目录下
通过vagrant box add 这样的方式安装远程的box,可能很慢,可以先用下载工具把box下到本地
4)初始化
vagrant init
如果你添加的box名称不是base,要在初始化的时候指定,例如
vagrant init "CentOS 7.2 x86_64 minimal"
初始化过程的信息
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
5)修改Vagrantfile,加一些项目需要的路径和端口映射
config.vm.forward_port 虚拟机内端口, 本机端口
config.vm.forward_port 80, 80
config.vm.forward_port 5000, 5000
config.vm.share_folder "标识", "虚拟机内路径", "本机路径"
config.vm.share_folder "v-data", "/data", "e:/workspace/data"
config.vm.share_folder "v-work", "/work", "e:/workspace/work"
我的生产环境有/data、/work两个目录,所以做了映射
5. 启动虚拟机
vagrant up
启动过程的信息
[default] Importing base box 'base'...
[default] The guest additions on this VM do not match the install version of
VirtualBox! This may cause things such as forwarded ports, shared
folders, and more to not work properly. If any of those things fail on
this machine, please update the guest additions and repackage the
box.
Guest Additions Version: 4.1.20
VirtualBox Version: 4.1.20
[default] Matching MAC address for NAT networking...
[default] Clearing any previously set forwarded ports...
[default] You are trying to forward to privileged ports (ports <= 1024). Most
operating systems restrict this to only privileged process (typically
processes running as an administrative user). This is a warning in case
the port forwarding doesn't work. If any problems occur, please try a
port higher than 1024.
[default] Forwarding ports...
[default] -- 22 => 2222 (adapter 1)
[default] -- 80 => 80 (adapter 1)
[default] -- 5000 => 5000 (adapter 1)
[default] Creating shared folders metadata...
[default] Clearing any previously set network interfaces...
[default] Booting VM...
[default] Waiting for VM to boot. This can take a few minutes.
[default] VM booted and ready for use!
[default] Mounting shared folders...
[default] -- v-work: /work
[default] -- v-data: /data
[default] -- v-root: /vagrant
6. 用ssh连入
Windows环境下,不能直接用vagrant ssh,所以会提示:
E:workspacedevel_env>vagrant ssh
`vagrant ssh` isn't available on the Windows platform. You are still able
to SSH into the virtual machine if you get a Windows SSH client (such as
PuTTY). The authentication information is shown below:
Host: 127.0.0.1
Port: 2222
Username: vagrant
Private key: C:/Users/你的账户名/.vagrant.d/insecure_private_key
必须使用第三方ssh客户端
GUI的ssh客户端:putty、Xshell4
命令行的ssh客户端:Cygwin、MinGW
命令行的方式:
ssh -i C:/Users/你账户名/.vagrant.d/insecure_private_key -p2222 vagrant@127.0.0.1
图形的方式:略过
7. 查看一下系统
df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
13G 930M 11G 8% /
tmpfs 499M 0 499M 0% /dev/shm
/dev/sda1 485M 40M 420M 9% /boot
work 203G 132G 71G 65% /work
data 203G 132G 71G 65% /data
v-root 203G 132G 71G 65% /vagrant
/vagrant 这个目录是自动映射的,被映射到e:workspacedevel_env
8. 安装一些常用的软件和模块
可以通过puppet,也可以手动安装
本机的e:workspacedevel_env会被映射到虚拟机中的/vagrant目录下,所以可以把待安装的文件包放到e:workspacedevel_env,虚拟机中就可以方便的安装了
9. 关闭防火墙
开发环境的虚拟机,没必要启用防火墙
sudo service iptables stop
sudo chkconfig iptables off
10. vagrant常用命令
vagrant halt //关闭虚机
vagrant suspend //暂停虚机
vagrant resume //把暂停状态的虚机恢复运行
vagrant destroy //彻底删除虚机,包括整个虚机文件
vagrant reload //重启虚机,并且重新加载 Vagrantfile 中的配置信息
11. 分发
配置好的环境,可以打包再分发,免去团队其他程序的重复劳动
vagrant package --vagrantfile Vagrantfile
制作过程的信息:
[default] Attempting graceful shutdown of VM...
[default] Clearing any previously set forwarded ports...
[default] Creating temporary directory for export...
[default] Exporting VM...
[default] Compressing package to: E:/workspace/devel_env/package.box
[default] Packaging additional file: Vagrantfile
三. 项目中的使用
1. 将项目中的代码和数据放到映射目录中,这样,无论本机还是虚拟机内操作,文件都是一致的;
也方便项目迁移部署,直接将本机相关目录打包,放到生产环境的服务器上
2. 使用端口映射,这样本机就可以方便的访问
端口映射也可以在VirtualBox管理器中动态添加