windows下搭建Vagrant+Virtualbox环境

对于开发人员来说,Vagrant就是一个提供标准化开发环境的工具。通过Vagrant:

  • 使每个开发人员电脑上的代码运行环境一致,再也不会出现“在我电脑上运行起来明明没有问题的”这样的开发环境不一致的问题。
  • 你可以使用Vagrant在windows下提供linux运行环境,让你可以在windows下使用你熟悉的IDE开发,而代码会同步到Vagrant上运行。
  • vagrant还支持使用远程provider,你在本地编写代码,而代码会自动同步到你的远程主机上执行
  • 因为Vagrant通过配置文件来定义标准环境,所以你可以使用git等工具进行版本管理

总而言之,Vagrant确实是个好东西。不过,装Vagrant之前也还要考虑一下性能问题,Vagrant需要一个Provider来提供原型环境,这个Provider可以是本地的Virtualbox、VMWare等虚拟机,也可以是远程的一台主机,如果你使用本地虚拟机作为Provider的话,请确保自己的电脑配置足够跑一台虚拟机,并且在BIOS中打开虚拟化。

接下来说一下在windows下使用Virtual box作为Provider,搭建Vagrant开发环境的一个过程。

安装Virtualbox和Vagrant

到Virtualbox官网下载安装包,注意目前不要下5.2.X版本的,因为5.2.x官方包中的Guest Additions有问题(见下图),而Vagrant刚好要用到。这里我们下载5.1.30版本的。

这里写图片描述

到Vagrant官网下载安装包,双击安提示安装即可。

Vagrant基础使用

1、打开一个文件夹作为工作目录,这个文件夹的内容将会被同步到虚拟机上。本文以D:\myproject作为工作目录来演示

2、初始化vagrant配置。打开命令行,切换到D:\myproject,输入命令:

vagrant init ubuntu/xenial64

这会在你的工作目录下生成一个Vagrantfile文件。参数ubuntu/xenial64表示使用ubuntu xenial64 镜像作为基础环境,你可以在vagrant boxes search里面找到所有的镜像

3、启动Vagrant。输入:

vagrant up

4、登录 vagrant。输入如下命令,不需要密码,直接进入:

vagrant ssh

这里直接在windows命令行中登录,登录之后可以直接在命令行使用linux命令,但是长远来看,使用Putty等工具来登录使用起来更方便,后面将会讲到如何用Putty登录。

5、查看同步文件夹

D:\myproject下新建一个文件,然后输入如下命令,在Vagrant中查看:

cd /vagrant
ls

你会看到你新建的文件出现在/vagrant目录下。默认情况,Vagrant会同步你的工作目录到/vagrant目录

常用Vagrant命令

你可以在windows命令行输入:

vagrant -h

查看所有命令,常用的如下:

  • vagrant init:初始化vagrant,这会创建一个Vagrantfile文件
  • vagrant up:启动vagrant,这启动virtualbox虚拟机
  • vagrant halt:停止vagrant ,这会停止virtualbox虚拟机
  • vagrant destroy:这会彻底删除当前工作目录下的vagrant
  • vagrant reload:重新加载Vagrantfile文件,在每次修改完Vagrantfile文件之后都要执行
  • vagrant provision:重新执行初始化脚本,在每次修改完初始化脚本文件之后都要执行。初始化脚本文件可以在Vagrantfile中指定,后面会讲到
  • vagrant ssh:登录到vagrant
  • vagrant ssh-config:查看登录配置,包括用户名,私钥存放地址等

配置启动脚本

1、在D:\myproject下创建一个bootstrap.sh文件,下面是一个示例脚本,安装curl、git和 go语言环境,注意这个脚本需要从google下载go安装包,需要设置外网代理

#!/bin/sh
# 切换到工作目录
cd /vagrant# 更新系统
sudo apt-get -y update && sudo apt-get -y upgrade# 安装实用程序
sudo apt-get install -y curl
sudo apt-get install -y git# 安装go
## 注意这里保存环境变量要使用绝对路径 /home/ubuntu/.profile ,而不要使用相对路径 ~/.profile
## 这是因为执行该脚本的是guest用户,登录时却是ubuntu用户
## go环境变量也设置到guest用户,这样下次检查就已经有了,不需要每次安装
if [ -z `which go` ]; then
echo "install go ........"
wget -q https://storage.googleapis.com/golang/go1.8.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.8.linux-amd64.tar.gz
echo "export PATH=$PATH:/usr/local/go/bin" >> /home/ubuntu/.profile
echo "export PATH=$PATH:/usr/local/go/bin" >> ~/.profile
export PATH=$PATH:/usr/local/go/bin
fi

2、打开Vagrantfile,添加一行provision配置,整个配置文件看起来如下:

Vagrant.configure("2") do |config|config.vm.box = "ubuntu/xenial64"config.vm.provision "shell", path: "bootstrap.sh"
end

3、重新加载配置文件并重新执行初始化脚本

vagrant reload
vagrant provision

执行完之后,环境中就带有了go语言环境。

使用远程启动脚本

可以将path配成一个URL,这样大家都从网络上统一下载,很方便管理

Vagrant.configure("2") do |config|config.vm.box = "ubuntu/xenial64"config.vm.provision "shell", path: "https://example.com/bootstrap.sh"
end

设置Provision其它参数

provision除了path参数之外,还有很多参数可以使用,参考这里。比如要多加一个binary参数,这个参数可以自动将windows换行符替换成unix风格的换行符,配置如下:

Vagrant.configure("2") do |config|config.vm.box = "ubuntu/xenial64"config.vm.provision :"shell" do |s|s.path="bootstrap.sh"s.binary=trueend
end

配置端口映射

比如要将虚拟机的9090端口映射到主机的19090端口,可以使用如下配置:

Vagrant.configure("2") do |config|config.vm.box = "ubuntu/xenial64"config.vm.provision "shell", path: "bootstrap.sh"config.vm.network "forwarded_port", guest: 9090, host: 19090, host_ip: "127.0.0.1"
end

这样就可以直接使用127.0.0.1:19090访问虚拟机的9090端口了

使用putty登录

使用vagrant ssh直接登录是不需要输入用户名密码的,但是如果你使用Putty直接连接到127.0.0.1:2222,你会发现它需要你输入用户名密码。那么怎么配置才能让Putty也能直接登录进去呢?

这里我们将用到putty和puttygen两个程序,点击链接可下载。

1、首先查看Vagrant的登录配置,输入:

vagrant ssh-config

你会看到如下信息:

Host defaultHostName 127.0.0.1User ubuntuPort 2222UserKnownHostsFile /dev/nullStrictHostKeyChecking noPasswordAuthentication noIdentityFile D:/myproject/.vagrant/machines/default/virtualbox/private_keyIdentitiesOnly yesLogLevel FATAL

可以看到Port是登录端口,User是登录名,IdentityFile是私钥文件的位置

2、生成putty可识别的私钥文件。

打开Puttygen.exe,直接点击load

这里写图片描述

在弹出框中选择我们私钥文件,点击打开。不知道私钥文件的位置可以用vagrant ssh-config命令查看,这里我们已经查到是放在D:/myproject/.vagrant/machines/default/virtualbox/private_key

这里写图片描述

直接点击save private key按钮,让后将私钥放在你想要的位置。

这里写图片描述

3、使用Putty登录

设置登录地址和端口,可以使用vagrant ssh-config命令查看

这里写图片描述

设置登录用户名,这个也可以使用vagrant ssh-config命令查看

这里写图片描述

设置私钥文件地址

这里写图片描述

记得保存

这里写图片描述

处理文件结束符问题

是windows下和在Unix风格系统下使用不同的文件结束符。虽然Vagrant可以自动同步文件,但却不会自动替换掉文件结束符,所以,我们需要自行处理。下面简单说两种方法:

使用git进行替换

1、执行:

git config --global core.autocrlf input

这个命令的意思是在git提交的时候自动将CRLF替换成LF

2、在工作目录下创建一个.gitattributes文件,添加如下内容:

text=auto
text eol=lf

参考Git End-of-Line Normalization by AutoCRLF with Input

使用编辑器替换

这里介绍使用webstorm自动替换,打开file,setting:

这里写图片描述

这会在每次保存时自动保存为unix风格的文件结束符

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/429899.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jenkins主从节点配置

jenkins支持主从模式,这将会把构建任务分发到多个从节点去执行,这样就可以支撑起多个项目的大量构建任务,同时,你可以提供多种环境(如:开发环境、生产环境)来对同一个项目进行测试和构建。想要进…

HTML5 响应式图片

现在上网设备越来越多,各种设备的屏幕千差万别,如果只用一张图片去涵盖所有的设备,一是可能会造成某些设备上显示效果不佳,比如使用了一张低清晰度的图,而网页运行在一个高清大屏里;二是可能会浪费带宽&…

threejs坐标转换

屏幕坐标转three.js坐标 将屏幕坐标转变成threejs空间坐标: function transToThreeCoord(x,y){let mouse new THREE.Vector3();mouse.x (x/window.innerWidth)*2 -1;mouse.y -(y/window.innerHeight)*2 1;return mouse; }注意:在实际使用中&#x…

android socket 发送byte_如何正确地创建和销毁网络通讯程序中的Socket类的对象实例...

软件项目实训及课程设计指导——如何正确地创建和销毁软件应用系统中网络通讯中的Socket类的对象实例1、基于TCP/IP协议的Socket通信相关的基础知识(1)TCP/IP(Transmission Control Protocol传输控制协议/Internet Protocol网间协议)TCP/IP是目前Internet网络中的主要协议&…

H5 使用微信开放标签跳转小程序

微信开放标签是微信公众平台面向网页开发者提供的扩展标签集合,可以在网页上提供跳转小程序、打开 App 等能力。本文梳理使用微信开放标签跳转小程序的过程,以备日后查阅。 参考链接 1. 开放标签说明文档 准备已认证的服务号 开放标签只能绑定已认证…

【网络流24题】No.7 试题库问题 (最大流,二分图多重匹配)

【题意】 假设一个试题库中有 n 道试题。 每道试题都标明了所属类别。 同一道题可能有多个类别属性。现要从题库中抽取 m 道题组成试卷。并要求试卷包含指定类型的试题。 试设计一个满足要求的组卷算法。 输入文件示例input.txt3 153 3 42 1 21 31 31 31 33 1 2 32 2 32 1 31 2…

参数等效模型可以用于_干货分享电池单体产热特性及热模型标定分析(2)

上篇已讲解了电池单体产热特性及电池模型相关理论,相较之下等效电路模型无需对电池内部的电化学反应有着深入的分析,是通过电路来描述电池的开路电压、内阻等,以实现对电池外特性的表征。本篇将继续讨论此问题,用Matlab和Amesim模…

检测同心圆_(二)光线如何被眼睛检测到?

在第一篇文章中(链接:(一)视觉系统的全貌),我们已经了解了视觉信息被大脑处理的全过程。现在,我们把目光投向一切的起点——眼睛。实际上,人们提起“视觉”,首先想到的几…

matlab计算斜方差_计算一幅图像的信噪比

本文摘自本人的毕业设计《数字图像滤波算法研究》2019, Chang’an University, Xi’an, China.本文适用于原始图像(即不含噪声的图像)存在的情况下。使用待计算SNR图像(记为A)与原始图像(记为B)做相减运算&…

【转载】linux进程及进程控制

Linux进程控制 程序是一组可执行的静态指令集,而进程(process)是一个执行中的程序实例。利用分时技术,在Linux操作系统上同时可以运行多个进程。分时技术的基本原理是把CPU的运行时间划分成一个个规定长度的时间片,让每个进程在一个时间片内运…

区分大小屏幕_VESA持续推动DisplayHDR认证计划,你的屏幕属于何种等级吗?

美国视频电子标准协会(VESA)今年可说是动作频频,年初先发布了专为OLED与其他自发光显示器所制订的DisplayHDR True Black高动态范围标准,下半年则更新DisplayHDR兼容测试规范至1.1版,并发布新的DisplayHDR 1400性能分级,至于年中所…

cordova 某个页面强制横屏_小白科普:从输入网址到最后浏览器呈现页面内容,中间发生了什么?...

老刘 1前言这篇文章是应网友之邀所写,主要描述一下我们访问网站时, 从输入网址到最后浏览器呈现内容,中间发生了什么。今天的文章主要专注于应用层,我拿了一个很简单的网络结构来讲。假定本机已经获取了IP地址,各种网络…

vue调用手机相机相册_今天才发现,点一下小米手机相册,能将照片一键制作成电影...

随着国产手机的发展,手机像素越来越高,里面的功能也越来越丰富,手机拍照成了不少人的日常,如果你很爱拍照,手机里有一大堆照片,那么教你用手机自带的相册功能,一键将照片制作成电影,…

unity 烘焙参数 设置_Unity通用渲染管线(URP)系列(九)——点光源和聚光灯

200篇教程总入口,欢迎收藏:放牛的星星:[教程汇总持续更新]Unity从入门到入坟——收藏这一篇就够了​zhuanlan.zhihu.com本文重点内容:1、支持更多类型的灯光2、包含实时的点光源和聚光灯3、为点光源和聚光灯烘焙阴影4、每个物体限…

c#日期转换周几_Java时间与日期

只有把眼前的事情做好,才能考虑其他的问题。众所周知,全世界在同一时刻看手表肯定不会看到同一个时间,因为地球是圆的,面对太阳的角度是不一样的,我们一般说时间几点几点,是指的本地时间,比如国…

Python开发之--前端 HTML基础

一:HTML介绍 HTML:超文本标记语言,标准通用标记语言下的一个应用。包括“头”部分(英语:Head)、和“主体”部分(英语:Body),其中“头”部提供关于网页的信息&…

给与用户建立dblink的权限_网络安全 之 NTFS安全权限

NTFS安全权限一、NTFS权限概述1、通过设置NTFS权限,实现不同的用户访问不同的权限2、分配了正确的访问权限后,用户才能访问其资源3、设置权限防止资源被篡改、删除二、文件系统概述 文件系统即在外部存储设备上组织文件的方法常用的文件系统:…

TCP 连接中的TIME_WAIT

原文:http://blog.csdn.net/wangpengqi/article/details/17245349 这就有个细节,一次http请求,谁会先断开TCP连接?什么情况下客户端先断,什么情况下服务端先断? 百度后,找到原因,主要…

丁丁打折网卷能用吗_微信群控还能用吗?现在什么群控还能使用吗?

微信群控系统还能用吗?为什么现在微信群控系统越来越被限制了呢?其实,微信群控我想在生活中占据着很大的位置!因为微信这么多的使用,现在微信使用人数都是几十亿了,所以很多人看重微信群控系统的市场&#…

错题整理

1.JAVA语言的下面几种数组复制方法中,哪个效率最高? A for循环逐一复制 B System.arraycopy C System.copyof D 使用clone方法 答案:B A、for循环的话,很灵活,但是代码不够简洁. for循环为什么慢,java中所…