开发环境管理利器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: ...
随机推荐
- JS中的多层次排序算法
引子 排序在编程中随处可见,从开始学习变成,到项目开发,基本上或多或少会遇到一些排序问题,接下来我要写的是我在实际开发终于到的一个排序问题,一开始卡了我很久,后面随着知识积累,实践变多才解决掉了,不知 ...
- 数据库(MySQL)最新版8.0安装教程,小白都能学会安装
首先打开数据库官网 接下来点击不用登录注册 下载好软件,双击运行程序(中间不需要点击其他,等他运行好) 点击安装服务端 ,然后点击下一步 选择自己安装目录(一定要牢记)这里我选择默认目录,点击下一步 ...
- 递归的三部解题曲 关联leetcode 104. 二叉树最大深度练习
递归关心的三点 1. 递归的终止条件 2. 一级递归需要做什么 3. 返回给上一级递归的返回值是什么 递归三部曲 1. 找到递归的终止条件:递归什么时候结束 2. 本级递归做什么:在这级递归中应当完成 ...
- .Net微服务实战之负载均衡(下)
系列文章 .Net微服务实战之技术选型篇 .Net微服务实战之技术架构分层篇 .Net微服务实战之DevOps篇 .Net微服务实战之负载均衡(上) .Net微服务实战之CI/CD .Net微服务实战 ...
- netty启动流程
本文通过对netty服务端.客户端的启动流程分析, 让大家对netty是如何启动运行的. 废话不多说,上源码!!! 建议读者学习netty下的jar类型为 netty-example,里面有很多exa ...
- .NET 云原生架构师训练营(模块二 基础巩固 RabbitMQ Masstransit 详解)--学习笔记
2.6.7 RabbitMQ -- Masstransit 详解 Consumer 消费者 Producer 生产者 Request-Response 请求-响应 Consumer 消费者 在 Mas ...
- LeetCode739 每日温度
根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高的天数.如果之后都不会升高,请输入 0 来代替. 例如,给定一个列表 temperatures = [73, 74 ...
- Flutter 基础组件:单选框和复选框
前言 Material组件库中提供了Material风格的单选开关Switch和复选框Checkbox,虽然它们都是继承自StatefulWidget,但它们本身不会保存当前选中状态,选中状态都是由父 ...
- 数学建模学习笔记 | matlab基本命令及用法
前言 数学建模对matlab水平的要求 了解matlab的基本用法,如常用命令.脚本结构.矩阵的基本操作.绘图等: 熟悉matlab的程序结构,能创建和引用函数: 熟悉常见模型的求解算法和套路: 自主 ...
- mysql中的基本注入函数
1. 常见数据库注入函数: MYSQL: and length((user))>10 ACCESS: and (select count() from MSysAccessObject)> ...