开发环境管理利器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: ...
随机推荐
- ARM CPU的SVC模式
关于ARM CPU模式中的SVC Arm中CPU的模式 [第一方面] 系统sys模式 VS 管理svc模式 首先,sys模式和usr模式相比,所用的寄存器组,都是一样的,但是增加了一些访问一些在usr ...
- JWT初识记录
因为前一段时间做了一个系统持续操作期间自动刷新token有效性的需求,然后就想着找一个空闲时间总结一下JWT,所以今天就简单的记录一下自己了解的内容. JWT是什么 JWT全称是JSON Web To ...
- Linux 用户操作之用户管理 (用户增删改操作)
目录 添加用户 删除用户 修改用户 切换用户 配置用户密码 查看配置文件 cat /etc/pwsswd 添加用户 可选项 -c comment 指定一段注释性描述. -d 目录 指定用户主目录,如果 ...
- MySQL sql命令行操作数据库
数据库命令行操作 命令行操作数据库, [if exists] 可加可不加, 命令行操作一定要加英文分号 ; 结尾 创建数据库 : create database [if not exists] 数据库 ...
- yum -y install gnuplot
[root@test~]# yum -y install gnuplotLoaded plugins: fastestmirrorLoading mirror speeds from cached h ...
- 【Linux】salt的cmd.script命令介绍
salt是一个很棒的自动化运维工具之一,常用的有cmd.run,今天介绍的是cmd.script 其实一眼就能看出这个命令是执行脚本的命令 具体操作如下: 1.将/etc/salt/master中的 ...
- 【Jboss】A RESOURCE POOL IS PERMANENTLY BROKEN!
jboss后台报错,其中有这个错误 [error] A RESOURCE POOL IS PERMANENTLY BROKEN! 查阅多方资料后发现.数据库连接配置文件中,有地方存在空格,导致服务连接 ...
- buuctf刷题之旅—web—EasySQL
打开环境,发现依旧是sql注入 GitHub上有源码(https://github.com/team-su/SUCTF-2019/tree/master/Web/easy_sql) index.php ...
- 并发条件队列之Condition 精讲
1. 条件队列的意义 Condition将Object监控器方法( wait , notify和notifyAll )分解为不同的对象,从而通过与任意Lock实现结合使用,从而使每个对象具有多个等待集 ...
- 【链表】leetcode-1290-二进制链表转整数
leetcode-1290-二进制链表转整数 题目描述 给你一个单链表的引用结点 head.链表中每个结点的值不是 0 就是 1.已知此链表是一个整数数字的二进制表示形式. 请你返回该链表所表示数字的 ...