开发环境管理利器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
终于可以愉快的开发了。
开发环境管理利器Vagrant的更多相关文章
- Core开发-后台任务利器Hangfire使用
Core开发-后台任务利器Hangfire使用 ASP.NET Core开发系列之后台任务利器Hangfire 使用. Hangfire 是一款强大的.NET开源后台任务利器,无需Windows服务/ ...
- golang开发:(一)开发环境搭建vagrant+VirtualBox
开发环境介绍 不管何种开发语言,目前用的比较多的开发环境基本就是Vagrant+VirtualBox搭建的虚拟开发环境,这种开发环境的好处就是一次搭建处处可用,各个平台和系统都可以使用.开发团队中,可 ...
- LNMP虚拟机开发环境配置--vagrant+virtualbox+ubuntu14.04
工作一直用的是别人打包好的虚拟机开发环境,感觉确实很酷.所以准备自己配个开发环境,为之后自己开发一些有趣的东西做准备. ok,开始~~~ 一.安装软件 vagrant和virtualbox 此处需注意 ...
- ASP.NET Core开发-后台任务利器Hangfire使用
ASP.NET Core开发系列之后台任务利器Hangfire 使用. Hangfire 是一款强大的.NET开源后台任务利器,无需Windows服务/任务计划程序. 可以使用于ASP.NET 应用也 ...
- 在windows下进行linux开发:利用Vagrant+virtualbox(ShowDoc与mp3dish的作者)
1,介绍Vagrant 我们做web开发的时候经常要安装各种本地测试环境,比如apache,php,mysql,redis等等.出于个人使用习惯,可能我们还是比较习惯用windows.虽然说在wind ...
- 008_使用pyenv进行py开发环境管理
一. 安装Python 绝大多数Python入门书籍,都会介绍如何安装Python,然而,本书要介绍一种全新的安装方式.使用pyenv来安装并管理我们的环境. pyenv简介 由于Python的依赖是 ...
- Drupal 开发必备利器
http://drupalchina.cn/node/3436 转自 测试模块.主题.发行版的网站: http://simplytest.me/ Drupal API: https://api.dru ...
- 在windows下进行linux开发:利用Vagrant+virtualbox
1,介绍Vagrant 我们做web开发的时候经常要安装各种本地测试环境,比如apache,php,mysql,redis等等.出于个人使用习惯,可能我们还是比较习惯用windows.虽然说在wind ...
- 团队一致性的PHP开发环境之Vagrant
Vagrant 简介 Vagrant是一个基于Ruby的工具,用于创建和部署虚拟化开发环境. 它的主要意义是让所有开发人员都使用和线上服务器一样的环境,本质上和你新建一个虚拟机 安装 # https: ...
随机推荐
- Redis性能篇(二)CPU核和NUMA架构的影响
Redis被广泛使用的一个很重要的原因是它的高性能.因此我们必要要重视所有可能影响Redis性能的因素.机制以及应对方案.影响Redis性能的五大方面的潜在因素,分别是: Redis内部的阻塞式操作 ...
- git版本回滚
本地版本回滚 git reset --hard <版本号> (git log 可查看版本号,版本号不用写全) 远程仓库版本回滚 先在本地将版本回滚 ,然后git push -f 强制提交
- springboot源码解析-管中窥豹系列之Initializer(四)
一.前言 Springboot源码解析是一件大工程,逐行逐句的去研究代码,会很枯燥,也不容易坚持下去. 我们不追求大而全,而是试着每次去研究一个小知识点,最终聚沙成塔,这就是我们的springboot ...
- [RTMP] 国内各大视频直播CDN厂商推流抢流行为分析
背景 当存在一个推流客户端正在向rtmp://xxx.com/live/yyy推流时,又有另外一个推流客户端同时对这个地址进行推流,会发生什么呢? 查阅了 Adobe RTMP Spec 发现规范本身 ...
- ASP.NET Core中的数据保护
在这篇文章中,我将介绍ASP.NET Core 数据保护系统:它是什么,为什么我们需要它,以及它如何工作. 为什么我们需要数据保护系统? 数据保护系统是ASP.NET Core使用的一组加密api.加 ...
- 如何用Github上传项目中的代码
第一步: 在Github上创建自己的仓库 第二步:克隆GitHub文件 1:$ git clone Github文件地址 如:$ git clone https://github.com/wwwxx ...
- LeetCode747 至少是其他数字两倍的最大数
在一个给定的数组nums中,总是存在一个最大元素 . 查找数组中的最大元素是否至少是数组中每个其他数字的两倍. 如果是,则返回最大元素的索引,否则返回-1. 示例 1: 输入: nums = [3, ...
- 【Flutter】可滚动组件之GridView
前言 GridView可以构建一个二维网格列表.需要关注的是gridDelegate参数,类型是SliverGridDelegate,它的作用是控制GridView子组件如何排列(layout).Sl ...
- Docker 镜像管理及基础命令(二)
Docker 常用命令: ## Docker 登录下载镜像: docker login # 登录官方hub.docker.com docker pull nginx:alpine # 下载nginx的 ...
- ASP.NET Core - JWT认证实现
一.JWT结构 JWT介绍就太多了,这里主要关注下Jwt的结构. Jwt中包含三个部分:Header(头部).Payload(负载).Signature(签名) Header:描述 JWT 的元数据的 ...