开发环境管理利器Vagrant

引言

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

答案就是Vagrant、Docker

1、简介

1.1 什么是Vagrant?

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

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

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

1.2 Vagrant与Docker对比

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

容器通常比虚拟机更轻,因此启动和停止容器非常快。Docker在MAC OS,Linux和Windows上使用本机容器化功能。

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

对于微服务繁重的环境,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,当然它还支持其他平台,自行研究了。

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

2、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

3、主机打包

如果我们将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服务就可以。

4、最后我的实例配置

实例配置如下:

$ 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

终于可以愉快的开发了。

原文地址:https://www.cnblogs.com/evan-blog/p/10552997.html