vscode + vagrant + frp 远程开发环境

文章讲什么

本文主要讲,我是如何按部就班地搭建一个远程开发环境,最后实现的效果是:在公司使用mac进行办公,而后经过frp转发家里台式机的端口,RDP到家里的台式windows,而且SSH直连到windows中使用vagrant管理的一套虚拟机环境,其使用体验就像是拥有了超高配置的云服务器同样。使用mac安装的 vs code 进行开发的时候,使用remote develop扩展包,直连windows开的高配ubuntu虚拟机,今后不再用担忧环境和性能的问题了。(remote develop扩展包,可让你使用远程主机或者docker中的环境进行开发,本机的vs code此时就像是个浏览器同样,十分的方便)linux

备注

本文不会贴具体的代码,只是讲一下我整个的过程和思路,由于我以为这才是最重要的东西。程序员

背景

最近新入职了一家公司,名字就不说了。公司对保密的要求十分严格,对内外网进行了分离,而且只配发了台式机,8g、i五、机械硬盘的配置。用内网就不能访问外网,也就是一些涉及到在线安装的东西全都死翘翘了(好比我们各类IDE在线安装插件,或者其余开发工具涉及到联网的部分)。用外网的话,文件就没法保存,至关因而开了一个还原卡系统同样的东西,因此想安装软件的惟一途径就是U盘拷贝,或者使用外网后将文件手动导出,而后在内网模式进行安装(说实话做为一个喜欢折腾的程序员,我吐了)。docker

因而我一直都是使用的个人mac进行工做,可是性能实在有些顶不住(内存定制的是16G),工做内容常常须要集群环境,并且编译工做很重,我只能在mac上开一堆虚拟机进行模拟,常常就风扇狂响,键盘烫手。因而我就想用远程控制我家里的台式机(i7 9700k,1T的三星Nvme固态、40G内存),将台式看成额外的云服务器来用。诞生了这个想法后,我就开始了折腾之旅。。。ubuntu

如何快速搭建开发环境(windows + mac)

其实吧,因为工做内容的关系,我须要一套很重的开发环境(常常启停一套集群进行测试,各类中间件和工具一大堆),因此在使用mac的时候就折腾了好久的开发环境的搭建的问题。虽然mac号称能跑linux上的不少东西,可是实际上使用的时候,是有不少不兼容的地方的,最后依然须要真正的linux系统来进行开发,否则解决兼容性的问题就把本身烦死了(仍是工做内容的缘由,我没办法只用docker就组一套环境)。下面就是我折腾开发环境的过程windows

阶段1:mac开虚拟机

这个阶段就是很朴实的想法,哈哈。在mac装了vmware fusion,而后就是一顿熟悉的操做,安装虚拟机balabala的,这个事儿估计你们都干过,详细过程就不用多说了。浏览器

这种方式问题就很大,首先就是安装的过程,我须要手动一步一步的点击下一步,而后改虚拟机的硬件配置啥的,总之是一个常常重复并且效率低下的过程。用了几天以后我就摒弃这种方案了。服务器

阶段2:mac使用vagrant

在阶段一以后,我找了一些资料,而后找到了vagrant。使用过这个工具以后就感受,这才是程序员使用虚拟机的时候应该有的方式。vagrant可使用如今主流的VM软件,好比vmware、virtualBox等,对虚拟机进行管理,也就是说,使用vagrant在命令行中开启、关闭、配置虚拟机,而且他还有一个云端的仓库,就像是dockerhub同样的东西,专门用来下载系统镜像。使用vagrant以后,你就能够经过相似于写一个DockerFile的方式,写一个VagrantFile来定义一组虚拟机(一个VagrantFile能够定义无数个虚拟机),而后根据须要,随时开启或者销毁不一样的虚拟机实例,一会儿就把你从手工方式启停虚拟机里解放了出来。工具

因而我就折腾了两天,写了一个本身满意的VagrantFile,定义了一套虚拟机环境,达到的效果就是:免密SSH、建立时自动安装了我须要的环境、hosts文件共享,静态IP,自动加入docker swarm集群。到了这个阶段以后,其实环境的问题已经基本上解决了,可是性能问题依然还在,我mac上自己也已经有一堆东西了,内存和CPU余量其实并很少,基本上开的虚拟机性能都比较垃圾,并且散热会比较吃力,因此实际使用起来体验并很差。性能

阶段3:windows使用vagrant + teamviewer 远程控制

mac使用vagrant已经很明显已是个比较有效的方案了,惟一的问题就是性能不足。因此我就想到了家里的顶配台式机。因而用台式机也安装了vagrant,可是此时遇到了一个问题。开发工具

vagrant其实是要依赖具体的虚拟机软件的,它自己其实只是一个命令行工具,负责管理而不是负责建立虚拟机。能够这么想:各个虚拟机软件其实都有命令行接口能够进行虚拟机的管理,可是各类虚拟机软件的接口使用方式都不一样,并且十分复杂,因此vagrant就在各个虚拟机软件的接口上作了一层封装,咱们使用vagrant进行虚拟机的管理,而vagrant则在底层去调用具体的虚拟机软件进行虚拟机的建立和管理等工做。

遇到的问题

我遇到的问题就是:win10里安装docker的时候,必需要打开hyper-v,实际上win10里的docker是运行在hyper-v模拟出来的一个linux虚拟机中的。因此要使用docker就必须打开hyper-v,可是hyper-v有一个致命的缺点,就是不与其余虚拟机软件兼容,也就是说开了hyper-v就无法使用virtualBox和VMware。并且开了hyper-v以后,win10自己其实也是运行在hyper-v里的(能够理解为:其实只有一个hyper-v,而win10是hyper-v自动开启的一个虚拟机),因此win10对网卡的控制权可能有点问题,致使使用hyper-v做为底层的vagrant,没法对虚拟机进行静态IP的设置,每次开启关闭都会变更IP,这对咱们的开发环境来讲实在是太麻烦了。可是我又不想放弃docker的使用,因而我又查了一些资料,加深了对docker的理解。

解决方案

解决方案:其实docker是一个C/S结构的软件,咱们平常使用的是docker的cli,而真正进行容器调度的,都是docker的守护进程。显然,2个进程是须要进行通讯的,或者说,只要解决了通讯的问题,咱们就可使用本地的docker-cli,去连接远程的docker守护进程。在折腾以前其实我也看到过这个知识,可是并无放内心,因此折腾了一两天竟没有想到这里。

查阅了一些资料后,我测试了2种方案

  • 1种是使用docker-machine,这是docker自带的一种虚拟机方案,用docker-machine也能够建立虚拟机,而后将本地docker-cli链接到docker-machine启动的虚拟机中。可是它的功能主要是围绕docker的,因此虚拟机的管理功能比vagrant弱不少。

  • 第2种则是利用docker的remote API接口,使用vagrant,修改了VagrantFile,将开启的虚拟机里安装的docker的remote API接口打开,让它可以接收外部的请求,而后将本地docker的环境变量DOCKER_HOST指向虚拟机里的docker守护进程的端口,实现了从本地对虚拟机docker进行调用的功能。

毫无疑问,我最后选了第二种方案,由于论配置虚拟机自己的话,仍是vagrant比较专业。最后的效果就是windows使用vagrant开启了一系列虚拟机,而后windows本地只安装了docker-cli,windows在命令行使用docker命令的时候,自动链接虚拟机docker环境进行调用。

远程控制

完成了windows对虚拟机的管理后,剩下的就是mac怎么连的问题了,这里又一次发挥了本身朴实的思惟(汗- -),开了个teamviewer远程控制,而后远程链接windows,对家里的台式机进行操做。

emm。。。其实这样也不是不能够啦,可是着实有点笨拙了。由于其实我更须要的是windows开启的虚拟机,而不是windows自己。并且teamviewer搞很差哪天就检测说商业用途了,不够稳,并且远程控制毕竟仍是体验不够好。因而接着折腾,就折腾到了下面的终极方案了。

终极方案:frp转发 + vscode remote develop

这个时候面临的问题就是:我怎么不用teamviewer之类的远程桌面工具,就链接到家里的机器了。又折腾了一两天,找到了神器frp。它的做用是,使用一个具备公网IP的机器,反向代理你内网的机器,进行端口映射,最后的效果就是,访问公网的IP和端口,自动转发到内网的IP和端口,从而实现了链接内网机器的目的。

因而我就开了一个google cloud的机器,开启了frps(frp的服务端),而在家里windows上开启了frpc(frp的客户端),使用google cloud对家里的机器进行端口转发,最后再在mac上链接到google cloud的一些转发的端口上,进而链接到了家里的windows和windows里虚拟机中。windows上使用winsw工具将frpc注册为了一个服务,开机自启动,而且买了一个开机棒。能够随时在远程将机器开机和关机。

因而我如今的开发模式就是:天天上班以后将家里电脑开机,而后使用mac上的vscode直接链接家里windows开的虚拟机进行开发工做,几乎感受不到什么延迟,由于只是命令行的传输,数据量很小,并且google cloud的延迟只有20多ms。

遇到一些偶尔可能须要GUI操做的东西,就使用frp转发的微软远程桌面端口3389,远程桌面到windows进行一些简单的操做(此类操做其实不多,因此稍微有点延迟不怎么影响体验)。

使用了这套方案以后,就不再担忧开发环境的问题,和机器性能的问题了(反正顶配台式顶得住,hh),工做起来都感受更有趣了~~😄

相关文章
相关标签/搜索