用Vagrant构建统一的golang开发环境
开发环境是我们日常工作的一个环境,不论你现在的公司是否会强制你使用统一的开发环境,对于希望通过阅读本书,跟着本书一起写项目的同学来说,我希望大家有统一的环境,这不仅有利于代码的一致性,同时也是为了减少大家在开发中遇到很多不必要的问题。为了能够保证我们接下来的开发环境保持一致性,我们这一章介绍一个能够在所有系统都保持一致性开发环境的工具Vagrant,通过该工具使得我们保持一致的Go环境、项目目录等。这一章第一小节介绍Vagrant的一些基础知识、第二小节介绍如何安装Vagrant以及如何配置,接着第三小节介绍如何使用Vagrant,对Vagrant的常用命令进行详细的介绍,第四小节基于Vagrant的环境进行Go环境的安装,最后会根据这些介绍提出一些练习供大家深入的理解。
1. Vagrant的介绍虚拟开发环境平常我们经常会遇到这样的问题:在开发机上面开发完毕程序,放到正式环境之后会出现各种奇怪的问题:描述符少了、nginx配置不正确、MySQL编码不对、php缺少模块、glibc版本太低等。 所以我们就需要虚拟开发环境,我们虚拟和正式环境一样的虚拟开发环境,而随着个人开发机硬件的升级,我们可以很容易的在本机跑虚拟机,例如VMware、VirtualBox等。因此使用虚拟化开发环境,在本机可以运行自己喜欢的OS(Windows、Ubuntu、Mac等),开发的程序运行在虚拟机中,这样迁移到生产环境可以避免环境不一致导致的莫名错误。 虚拟开发环境特别适合团队中开发环境、测试环境、正式环境不同的场合,这样就可以使得整个团队保持一致的环境,我写这一章的初衷就是为了让大家和我的开发环境保持一致,让读者和我们整个大团队保持一致的开发环境。 VagrantVagrant就是为了方便的实现虚拟化环境而设计的,使用Ruby开发,基于VirtualBox等虚拟机管理软件的接口,提供了一个可配置、轻量级的便携式虚拟开发环境。使用Vagrant可以很方便的就建立起来一个虚拟环境,而且可以模拟多台虚拟机,这样我们平时还可以在开发机模拟分布式系统。 Vagrant还会创建一些共享文件夹,用来给你在主机和虚拟机之间共享代码用。这样就使得我们可以在主机上写程序,然后在虚拟机中运行。如此一来团队之间就可以共享相同的开发环境,就不会再出现类似“只有你的环境才会出现的bug”这样的事情。 团队新员工加入,常常会遇到花一天甚至更多时间来从头搭建完整的开发环境,而有了Vagrant,只需要直接将已经打包好的package(里面包括开发工具,代码库,配置好的服务器等)拿过来就可以工作了,这对于提升工作效率非常有帮助。 Vagrant不仅可以用来作为个人的虚拟开发环境工具,而且特别适合团队使用,它使得我们虚拟化环境变得如此的简单,只要一个简单的命令就可以开启虚拟之路。 2. Vgrant安装配置实际上Vagrant只是一个让你可以方便设置你想要的虚拟机的便携式工具,它底层支持VirtualBox、VMware甚至AWS作为虚拟机系统,本书中我们将使用VirtualBox来进行说明,所以第一步需要先安裝Vagrant和VirtualBox。 VirtualBox安装VirtualBox是Oracle开源的虚拟化系统,它支持多个平台,所以你可以到官方网站:https://www.virtualbox.org/wiki/Downloads/下载适合你平台的VirtualBox最新版本并安装,它的安装过程都很傻瓜化,一步一步执行就可以完成安装了。 Vagrant安装最新版本的Vagrant已经无法通过 要想检测安装是否成功,可以打开终端命令行工具,输入 Vagrant配置当我们安装好VirtualBox和Vagrant后,我们要开始考虑在VM上使用什么操作系统了,一个打包好的操作系统在Vagrant中称为Box,即Box是一个打包好的操作系统环境,目前网络上什么都有,所以你不用自己去制作操作系统或者制作Box:vagrantbox.es上面有大家熟知的大多数操作系统,你只需要下载就可以了,下载主要是为了安装的时候快速,当然Vagrant也支持在线安装。 建立开发环境目录我的开发机是Mac,所以我建立了如下的开发环境目录,读者可以根据自己的系统不同建立一个目录就可以: /Users/michael/vagrant 下载BOX前面讲了box是一个操作系统环境,实际上它是一个zip包,包含了Vagrant的配置信息和VirtualBox的虚拟机镜像文件.我们这一次的实战使用官方提供了一个box:Ubuntu lucid 64http://files.vagrantup.com/lucid64.box 当然你也可以选一个自己团队在用的系统,例如CentOS、Debian等,我们可以通过上面说的地址下载开源爱好者们制作好的box。当然你自己做一个也行,下一节我会讲述如何自己制作包。 添加BOX添加box的命令如下: vagrant box add base 远端的box地址或者本地的box文件名
base是box的名称,可以是任意的字符串, 例子: vagrant box add base http://files.vagrantup.com/lucid64.box
vagrant box add base https://dl.dropbox.com/u/7225008/Vagrant/CentOS-6.3-x86_64-minimal.box
vagrant box add base CentOS-6.3-x86_64-minimal.box
vagrant box add "CentOS 6.3 x86_64 minimal" CentOS-6.3-x86_64-minimal.box
我在开发机上面是这样操作的,首先进入我们的开发环境目录 vagrant box add base lucid64.box
安装过程的信息: Downloading or copying the box...
Extracting box...te: 47.5M/s,Estimated time remaining: --:--:--)
Successfully added box 'base' with provider 'virtualbox'!
box中的镜像文件被放到了: 通过 初始化初始化的命令如下: vagrant init 如果你添加的box名称不是base,那么需要在初始化的时候指定名称,例如 vagrant init "CentOS 6.3 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.
这样就会在当前目录生成一个 启动虚拟机启动虚拟机的命令如下: vagrant up 启动过程的信息: Bringing machine 'default' up with 'virtualbox' provider...
[default] Importing base box 'base'...
[default] Matching MAC address for NAT networking...
[default] Setting the name of the VM...
[default] Clearing any previously set forwarded ports...
[default] Creating shared folders metadata...
[set network interfaces...
[default] Preparing network interfaces based on configuration...
[default] Forwarding ports...
[default] -- 22 => 2222 (adapter 1)
[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] -- /vagrant
连接到虚拟机上面已经启动了虚拟机,之后我们就可以通过ssh来连接到虚拟机了。比如在我的开发机中可以像这样来连接: vagrant ssh 连接到虚拟机后的信息如下: Linux lucid64 2.6.32-38-server #83-Ubuntu SMP Wed Jan 4 11:26:59 UTC 2012 x86_64 GNU/Linux
Ubuntu 10.04.4 LTS
Welcome to the Ubuntu Server!
* Documentation: http://www.ubuntu.com/server/doc
New release 'precise' available.
Run 'do-release-upgrade' to upgrade to it.
Welcome to your Vagrant-built virtual machine.
Last login: Fri Sep 14 07:31:39 2012 from 10.0.2.2
这样我们就可以像连接到一台服务器一样进行操作了。
系统信息进入系统之后我们可以看一下系统的基础信息: vagrant@lucid64:/vagrant$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/lucid64-root
78G 945M 73G 2% /
none 179M 176K 179M 1% /dev
184M 0 184M 0% /dev/shm
64K 1% /var/run
0% /var/lock
0% /lib/init/rw
none 2% /var/lib/ureadahead/debugfs
/dev/sda1 228M 17M 199M 8% /boot
/vagrant 298G 76G 222G 26% /vagrant
/vagrant这个目录是自动映射的,被映射到 VAGRANTFILE配置文件详解在我们的开发目录下有一个文件
3. Vgrant使用入门前面我们已经学会了如何安装并配置Vagrant,而且也已经按照默认的方式开启了,那么这一小节就给大家介绍一下Vagrant的高级应用。 Vagrant常用命令前面讲了Vagrant的几个命令:
Vagrant还包括如下一些操作:
模拟打造多机器的分布式系统前面这些单主机单虚拟机主要是用来自己做开发机,从这部分开始的内容主要将向大家介绍如何在单机上通过虚拟机来打造分布式造集群系统。这种多机器模式特别适合以下几种人:
Vagrant支持单机模拟多台机器,而且支持一个配置文件Vagrntfile就可以跑分布式系统。 现在我们来建立多台VM跑起來,並且让他们之间能够相通信,假设一台是应用服务器、一台是DB服务器,那么这个结构在Vagrant中非常简单,其实和单台的配置差不多,你只需要通过 Vagrant.configure("2") do |config|
config.vm.define :web do |web|
web.vm.provider do |v|
v.customize ["web",89);">"512"]
end
web.vm.box = "base"
web.vm.hostname = "web"
web.vm.network :private_network,187);">ip: "11.11.1.1"
end
config.vm.define :db do |db|
db.vm.provider "db",50);">end
db.vm.box = "base"
db.vm.hostname = "db"
db.vm.network "11.11.1.2"
end
end
这里的设置和前面我们单机设置配置类似,只是我们使用了 $ vagrant up
Bringing machine 'web' up with 'virtualbox' provider...
Bringing machine 'db' up with 'virtualbox' provider...
[web] Setting the name of the VM...
[web] Clearing any previously set forwarded ports...
[web] Creating shared folders metadata...
[web] Clearing set network interfaces...
[web] Preparing network interfaces based on configuration...
[web] Forwarding ports...
[web] -- 22 => 2222 (adapter 1)
[web] Running any VM customizations...
[web] Booting VM...
[web] Waiting to boot. This can take a few minutes.
[web] VM booted use!
[web] Setting hostname...
[web] Configuring and enabling network interfaces...
[web] Mounting shared folders...
[web] -- /vagrant
[db] Setting the name of the VM...
[db] Clearing set forwarded ports...
[db] Fixed port collision for 2222. Now on port 2200.
[db] Creating shared folders metadata...
[db] Clearing set network interfaces...
[db] Preparing network interfaces based on configuration...
[db] Forwarding ports...
[db] -- 22 => 2200 (adapter 1)
[db] Running any VM customizations...
[db] Booting VM...
[db] Waiting to boot. This can take a few minutes.
[db] VM booted use!
[db] Setting hostname...
[db] Configuring and enabling network interfaces...
[db] Mounting shared folders...
[db] -- /vagrant
看到上面的信息输出后,我们就可以通过 $ vagrant ssh web
vagrant@web:~$
$ vagrant ssh db
vagrant@db:~$
是不是很酷!现在接下来我们再来验证一下虚拟机之间的通信,让我们先使用ssh登录web虚拟机,然后在web虚拟机上使用ssh登录db虚拟机(默认密码是 $ vagrant ssh web
Linux web 2.6.32-38-server 10.04.4 LTS
Welcome to the Ubuntu Server!
* Documentation: http://www.ubuntu.com/server/doc
New release 'do-release-upgrade' to upgrade to it.
Welcome to your Vagrant-built virtual machine.
Last login: Thu Aug 8 18:55:44 2013 from 10.0.2.2
vagrant@web:~$ ssh 11.11.1.2
The authenticity of host '11.11.1.2 (11.11.1.2)' can't be established. RSA key fingerprint is e7:8f:07:57:69:08:6e:fa:82:bc:1c:f6:53:3f:12:9e. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '.2' (RSA) to the list of known hosts. vagrant@11.11.1.2's password:
Linux db 58:50 .2
vagrant@db:~$
通过上面的信息我们可以看到虚拟机之间通信是畅通的,所以现在开始你伟大的架构设计吧,你想设计怎么样的架构都可以,唯一限制你的就是你主机的硬件配置了。 4. Go环境安装配置前面我们已经安装好了虚拟环境,那么接下来就需要在虚拟环境中安装Go环境了,因此你首先要运行 Ubuntu环境设置我们需要修改配置文件 LANG="en_US.UTF-8"
LANGUAGE="en_US:en"
如果我们通过 编辑 /etc/profile, sudo vi /etc/profile 在文件尾部添加一句: export LC_ALL=C
通过上面的修改之后,退出系统,然后需要通过 安装在Linux下安装Go很简单,只需要两个步骤:下载、解压。 首先下载Go的Linux编译好的包: wget https://storage.googleapis.com/golang/go1.6.linux-amd64.tar.gz 然后解压就可以了: sudo tar -C /usr/local -xzf go1.6.linux-amd64.tar.gz
我们现在就可以测试: /usr/local/go/bin/go
如果出现如下的界面,那么说明已经安装成功了。 环境变量设置上面我们已经成功安装了Go,那么接下来我们配置一些Go开发需要的信息: 上面我们已经知道Vagrant启动之后,会默认把Vagrant这个目录挂载到系统的 $ cd $ mkdir /home/vagrant/gopath/ $ vim .bashrc 切换到用户目录,打开bashrc进行设置,在最末尾增加如下两行: export GOPATH=/home/vagrant/gopath
export PATH=$PATH:/usr/local/go/bin:$GOPATH/bin
设置完毕之后,执行 $ source .bashrc 这个时候 $ go env 就会成功显示如下信息: GOARCH="amd64"
GOBIN=""
GOCHAR="6"
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/home/vagrant/gopath/"
GORACE=""
GOROOT="/usr/local/go"
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
CC="gcc"
GOGCCFLAGS="-g -O2 -fPIC -m64 -pthread"
CGO_ENABLED="1"
至此所有的Go环境配置完成,你和你的小伙伴们一定被如此简单的配置惊呆了吧。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |