虚拟开发环境
在项目开发中,我们经常会遇到各种各样的问题,需要使用虚拟开发环境来完成,虚拟和正式环境一样的虚拟开发环境,随着个人开发机硬件的升级,可以在本机跑虚拟机,如VMware、VirtualBox等。因此使用虚拟化开发环境,在本机可以运行自己喜欢的OS(Windows、Ubuntu、Mac等),开发的程序运行在虚拟机中,这样迁移到生产环境可以避免环境不一致导致的莫名错误。
虚拟开发环境有着很多的好处,本文安装虚拟机的原因在于模拟在远程服务器上搭建CI,并完成项目中持续集成的一系列工作。故搭建虚拟机只是第一步,在此基础上,后面还会有一系列的文章,介绍CI相关。
Vagrant
Vagrant is a tool for building and managing virtual machine environments in a single workflow. With an easy-to-use workflow and focus on automation, Vagrant lowers development environment setup time, increases production parity, and makes the "works on my machine" excuse a relic of the past.
Vagrant的设计是为了方便的实现虚拟化环境,使用Ruby开发,基于VirtualBox、VMware等虚拟机管理软件的接口,提供了一个可配置、轻量级的便携式虚拟开发环境。使用Vagrant可以很方便的就建立起来一个虚拟环境,而且可以模拟多台虚拟机,因此可以在开发机模拟分布式系统。
安装 VirtualBox 和 Vagrant
VirtualBox是一款开源免费的虚拟机软件,跨平台,Windows ,OS X 都可以使用。Vagrant 也是跨平台的。二者都需要到官网进行下载安装:
安装好VirtualBox和Vagrant后,就要在VM上使用操作系统了,一个打包好的操作系统在Vagrant中称为Box,即Box是一个打包好的操作系统环境。可以在Vagrant Cloud选择系统并进行下载。
安装Box
这里我选择的是ubuntu.box系统,并根据官网提示,直接运行如下指令进行安装。
如图所示也可以选择直接修改Vagrantfile
进行配置,修改后使用时如果该box还没有安装,Vagrant会自动进行下载安装。但根据以上步骤,当前Vagrant还未产生Vagrantfile文件,因此该法这里不可行。最简单的方法是在命令行执行上述两条命令。
运行该命令后,Terminal结果如下,同时该目录会自动创建Vagrantfile文件。
==> default: Successfully added box 'ubuntu/trusty64' (v20170918.0.0) for 'virtualbox'!
==> default: Importing base box 'ubuntu/trusty64'...
==> default: Matching MAC address for NAT networking...
==> default: Checking if box 'ubuntu/trusty64' is up to date...
==> default: Setting the name of the VM: VOS_default_1505893534153_40845
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
default: Adapter 1: nat
==> default: Forwarding ports...
default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
default: SSH address: 127.0.0.1:2222
default: SSH username: vagrant
default: SSH auth method: private key
default:
default: Vagrant insecure key detected. Vagrant will automatically replace
default: this with a newly generated keypair for better security.
default:
default: Inserting generated public key within guest...
default: Removing insecure key from the guest if it's present...
default: Key inserted! Disconnecting and reconnecting using new SSH key...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
default: The guest additions on this VM do not match the installed version of
default: VirtualBox! In most cases this is fine, but in rare cases it can
default: prevent things such as shared folders from working properly. If you see
default: shared folder errors, please make sure the guest additions within the
default: virtual machine match the version of VirtualBox you have installed on
default: your host and reload your VM.
default:
default: Guest Additions Version: 4.3.36
default: VirtualBox Version: 5.1
==> default: Mounting shared folders...
default: /vagrant => /Users/bqliu/Documents/VOS
Vagrantfile
Vagrantfile是Vagrant的配置文件,告诉 vagrant 怎样去运行该虚拟机,主要包括三个方面的配置,虚拟机的配置、SSH配置、Vagrant的一些基础配置。其存在的目的主要为以下两方面:
- 标志项目的根目录,Vagrant的许多配置都与这个根目录有关。
- 描述项目运行所需的机器和资源类型,包括要安装的软件和权限。
Vagrant的内置的命令 vagrant init
会产生一个根目录,并自动生成Vagrantfile目录。
Tips: 修改完Vagrantfile的配置后,记得要vagrant reload
命令来重启VM之后才能使用VM更新后的配置
安装Box的另一种方法
-
vagrant init
生成Vagrantfile配置文件 -
vagrant box add <box_name>
安装Box - 修改Vagrantfile配置文件,使用Box
更多详细步骤见官网文档
查看可以使用的Box
vagrant box list
配置网络
如果想让你的电脑跟虚拟机之间可以相互通信,比如你在虚拟机上安装了一个 Web 服务器,你打算可以在本地电脑上,或者同一网络内的其它设备可以访问到这台虚拟机上的项目。这需要去做一些配置,有三种方式,端口转发(Forwarded Ports),私有网络(Private Network),公有网络(Public Network)。
下面,可以在 vagrantfile 中配置一个端口转发:
config.vm.network "forwarded_port", guest: 8080, host: 8080, host_ip: "127.0.0.1"
该配置保证在虚拟机上启动服务器后,本地电脑可以使用8080端口对该服务器进行访问。关于私有网络和共有网络的配置方法见官网
Tips:在连接虚拟机时,会出现重复retry,但无法成功连接的问题,可以在 vagrantfile 中配置,给virtualbox一个ip地址
config.vm.network "private_network", ip: "192.168.33.10"
启动虚拟机
vagrant up
选择一个网络
若是本地电脑连接虚拟机,选择wifi模式就可
连接虚拟机
vagrant ssh
设置密码
sudo passwd
之后就可以根据你安装的操作系统,正常的使用虚拟机了
常用 Vagrant 命令
初始化box:vagrant init
启动虚拟机:vagrant up
登录虚拟机:vagrant ssh
显示box列表:vagrant box list
添加box:vagrant box add
删除box:vagrant box remove
关机:vagrant halt
重启:vagrant reload
销毁:vagrant destroy
打包虚拟机环境:vagrant package
Special thanks
My pair:Benqing