开发环境管理利器Vagrant

引言

不知道你是否经历过,开发环境与生产环境不一致、Windows开发和Linux上的包效果不同、在我这运行时好的啊 等等等问题,那有没有解决方法呢?html

答案就是Vagrant、Dockerdocker

一、简介

1.1 什么是Vagrant?

Vagrant是一种在单个工做流程中构建和管理虚拟机环境的工具。经过易于使用的工做流程并专一于自动化,Vagrant下降了开发环境的设置时间,提升了生产一致性,并使“在个人机器上工做”成为过去的遗留物。shell

Vagrant经过虚拟机相关平台更加高级的一种管理形式,直接经过平台api进行管理,而你只须要准备好你的文件就能够了。centos

Vagrant将在一个一致的环境中隔离依赖关系及其配置,而不会牺牲您习惯使用的任何工具(编辑器,浏览器,调试器等)。一旦您或其余人建立了单个 Vagrant文件,您只须要vagrant up安装并配置全部内容便可使用。团队的其余成员使用相同的配置建立他们的开发环境,所以不管您是在Linux,Mac OS X仍是Windows上工做,您的全部团队成员都在同一环境中运行代码,针对相同的依赖项,全部组件都配置相同办法。告别“在个人机器上工做”的错误。api

1.2 Vagrant与Docker对比

Vagrant是一个专一于跨多个操做系统提供一致的开发环境工做流的工具。Docker是一种容器管理,只要存在容器化系统,就能够始终如一地运行软件。浏览器

容器一般比虚拟机更轻,所以启动和中止容器很是快。Docker在MAC OS,Linux和Windows上使用本机容器化功能。安全

目前,Docker缺少对某些操做系统(如BSD)的支持。若是您的目标部署是这些操做系统之一,Docker将不会提供与Vagrant之类的工具相同的生产相同的体验。Vagrant还容许您在Mac或Linux上运行Windows开发环境。ruby

对于微服务繁重的环境,Docker可能颇有吸引力,由于您能够轻松启动单个Docker VM并快速启动多个容器。这是Docker的一个很好的用例。Vagrant也可使用Docker提供程序执行此操做。Vagrant的主要好处是一致的工做流程,但在不少状况下,纯Docker工做流程确实有意义。服务器

Vagrant和Docker都拥有庞大的社区贡献“Image”或“Box”库供您选择。网络

对于开发环境若是没有上Docker平台的话,咱们是很是建议使用Vagrant的,相对于Docker具备更加原生的体验。

1.3 安装Vagrant

Vagrant是一个管理工具,经过Ruby开发,直接经过官方下载对应的安装包便可。传送门:https://www.vagrantup.com/downloads.html

这里的平台工具咱们推荐使用VirtualBox,固然它还支持其余平台,自行研究了。

这里安装方式都比较简单,咱们推荐使用最新版本便可。以确保兼容性。

二、Vagrant快速入门

本章节咱们经过Vagrant快速构建咱们的开发环境平台,咱们会设计到经常使用的知识;这里个人环境以下:

  • Windows 10 操做系统
  • Vagrant + VirtualBox 都是最新版本
  • GitBash 用来代替Windows10操做系统上的传统Bash

固然没有GitBash只要熟悉传统Bash就能够了,我推荐安装GitBash来代替CMD,在绝大多数的场景下都是不错的选择。

2.1 准备Box

咱们彻底不须要从头来安装一个操做系统,庞大的社区已经帮助咱们只完成了相关能够直接使用的Box,咱们只须要经过以下命令添加便可:

$ vagrant box add centos/7
==> box: Loading metadata for box 'centos/7'
    box: URL: https://vagrantcloud.com/centos/7
This box can work with multiple providers! The providers that it
can work with are listed below. Please review the list and choose
the provider you will be working with.

1) hyperv
2) libvirt
3) virtualbox
4) vmware_desktop

Enter your choice: 3      # <== 选择平台
==> box: Adding box 'centos/7' (v1902.01) for provider: virtualbox
    box: Downloading: https://vagrantcloud.com/centos/boxes/7/versions/1902.01/providers/virtualbox.box
    box: Download redirected to host: cloud.centos.org
    box: Progress: 0% (Rate: 57869/s, Estimated time remaining: 3:06:12)

这里我选择CentOS7的Box由于CentOS接近咱们的生产,我使用这个,若是网络很差的小伙伴能够复制上面的连接,使用迅雷等工具下载便可。

连接: https://vagrantcloud.com/centos/boxes/7/versions/1902.01/providers/virtualbox.box

以后咱们手工添加一下就能够了

vagrant box add /e/迅雷下载/CentOS-7-x86_64-Vagrant-1902_01.VirtualBox.box --name centos/7

若是同局域网的小伙伴那怎么搞呢?能够作一个HTTP放进去就能够了。这里就不在作过多的介绍了。

2.2 建立一个项目

建立一个项目咱们初始化Vagrant配置就能够了。

$ mkdir vagrant_getting_started
$ cd vagrant_getting_started

初始化Vagrant

$ vagrant init centos/7
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.

这里我使用的是GitBash, 若是使用cmd建立目录的话请自行查找; init 后面是指定的Box的Name

这里会在当前目录下建立一个Vagrantfile配置文件,不要慌张,后面咱们会介绍。

2.3 启动Box和SSH

启动Box,咱们能够直接在当前目录下执行以下命令可使其服务启动

$ vagrant up

执行完成后咱们能够打开virtualbox,是否是启动了一台虚拟机呢?

那咱们如何链接虚拟机呢,若是你仔细观察就会发现日志中有以下展现:default: 22 (guest) => 2222 (host) (adapter 1) 这个是建立了一个端口映射,咱们能够经过SSH链接工具进行链接,固然Vagrant提供了一个ssh接口能够直接经过以下命令就能够登陆机器了

$ vagrant ssh

目前整体来讲,Windows系列 Win10以前的操做系统不支持这个操做。 默认虚拟机的SSH经过私钥认证,私钥存放的文件就在当前目录下的.vagrant目录之中。

登陆完成后就和虚拟是同样的了,能够经过exit进行退出。

2.4 同步目录

默认状况下咱们在本地进行开发,提交到虚拟使用的是同步目录这个功能,默认会有一个default的同步目录在/vagrant和/home/vagrant家目录;Vagrant支持的同步模式有:Rsync、SMB、NFS、virtualbox本身支持的服务

很遗憾Rsync和NFS在Windows上不支持,可使用SMB,相对于virtualbox性能更高;可是对于我只是Coding来讲virtualbox本身就够用了。

若是使用virtualbox还须要注意关闭Nginx和Apache的sendfile,以下:

In Nginx:
sendfile off;

In Apache:
EnableSendfile Off

由于virtualbox有可能会损坏这些文件。

咱们能够在配置文件中增长两行以下配置在config模块之中

config.vm.synced_folder ".", "/vagrant", disabled: true
  config.vm.synced_folder ".", "/opt/devops", create: true

上面的一行表示关闭默认的Vagrant同步目录,我通过很久调试也不能成功,最后咱们直接弃用,多是使用GitBash的问题吧,有解决的小伙伴也能够@我,第二行我增长一个同步目录,表示将当前目录同步到服务器/opt/devops目录下。

更多相关参数能够查询官方文档:https://www.vagrantup.com/docs/synced-folders/basic_usage.html

Windows配置完成这两行还不行,你可能须要安装一个插件:vagrant plugin install vagrant-vbguest

配置完成后,咱们只须要reload一下虚拟机就能够生效。

$ vagrant reload

为了验证效果你能够建立文件,来测试:

Administrator@SKY-20180619MUG MINGW64 ~/vagrant_getting_started
$ vagrant.exe ssh
Last login: Mon Mar 18 07:18:08 2019 from 10.0.2.2
[vagrant@localhost ~]$ touch /opt/devops/v.f
[vagrant@localhost ~]$ logout
Connection to 127.0.0.1 closed.

Administrator@SKY-20180619MUG MINGW64 ~/vagrant_getting_started
$ ls
v.f  Vagrantfile

2.5 访问服务

默认Vagrant提供了三种网络机制:端口映射、专有网络、公有网络

  • 端口映射:单机开发最经常使用的一种网络模式,也是咱们本文会说起到的重点;
  • 专有网路:通常多用于本地虚拟机集群使用,也是很是有用的;
  • 公有网路:相似桥接网络,应用场景较少,安全性也没有特别好的保证。

咱们如何配置端口映射呢, 只须要增长以下配置就能够了:

config.vm.network :forwarded_port, guest: 80, host: 4567

Guest表示虚拟机的端口,host表示映射在宿主机上的端口。

2.6 配置机器资源

默认机器只有一个核心512M的内存,是在不够用,那咱们如何配置呢,且看以下配置:

config.vm.provider "virtualbox" do |vb|
     vb.memory = "1024"
     vb.cpus = 2
   end

config模块之中增长如上配置, 重启服务便可生效, 另外咱们给服务器添加一个名字

config.vm.hostname = "demo"

2.7 主机初始化

你可能会发现,为何时区是UTC不是CST,字符集是英文等等,咱们接下来就开始配置它。

配置字符集:(字符集配置经过ENV指定就能够了,添加在config模块之上)

ENV["LC_ALL"] = "en_US.UTF-8"

如何配置时区呢,咱们能够经过Vagrant提供的初始化命令来搞定就能够了,看配置。

config.vm.provision "shell", inline: <<-SHELL
     ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
   SHELL

这个功能很是的强大,咱们这里只是皮毛,更加详细的能够查看官方文档。

检验

$ vagrant.exe ssh
Last login: Mon Mar 18 08:17:14 2019 from 10.0.2.2
[vagrant@demo ~]$ date
Mon Mar 18 08:23:15 UTC 2019

为何这里没有生效呢,缘由就是这个模块只在主机启动的地址次生效,若是想让这个模块再次执行须要经过以下命令重启虚拟机:

$ vagrant reload --provision

三、主机打包

若是咱们将Box更高了不少,那么经过provision来初始化比较困难,咱们能够直接在封装咱们的Box便可。

第一步:进入VirtualBox的安装目录

第二步:执行以下命令

$ ./VBoxManage.exe list vms
"devops" {7d1da681-b04e-469c-bfd2-488cdc1ce789}
"vagrant_getting_started_default_1552893022395_22364" {c60854df-69fc-48f2-8533-5f7479f121fc}

这里咱们须要的就是VM的名字,固然了你经过UI直接Copy也是能够的

第三步:打包当前VM

$ vagrant package --base vagrant_getting_started_default_1552893022395_22364 --output ./MyCentOS7.box

这里须要一些时间,请耐心等待。

第四步:若是须要能够add到本地Box便可。

第五步:应用方式在init时指定便可。

第六步:如何分发呢?创建一块HTTP服务就能够。

四、最后个人实例配置

实例配置以下:

$ cat Vagrantfile
ENV["LC_ALL"] = "en_US.UTF-8"
Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"
  config.vm.hostname = "demo"
  config.vm.network :forwarded_port, guest: 80, host: 4567
  config.vm.synced_folder ".", "/vagrant", disabled: true
  config.vm.synced_folder ".", "/opt/devops", create: true

  config.vm.provider "virtualbox" do |vb|
    vb.memory = "1024"
    vb.cpus = 2
  end

  config.vm.provision "shell", inline: <<-SHELL
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  SHELL
end

私钥位置以下:

.vagrant/machines/default/virtualbox/private_key

终于能够愉快的开发了。

相关文章
相关标签/搜索