vscode + vagrant + frp 遠程開發環境

文章講什麼

本文主要講,我是如何循序漸進地搭建一個遠程開發環境,最後實現的效果是:在公司使用mac進行辦公,然後通過frp轉發家裏臺式機的端口,RDP到家裏的臺式windows,並且SSH直連到windows中使用vagrant管理的一套虛擬機環境,其使用體驗就像是擁有了超高配置的雲服務器一樣。使用mac安裝的 vs code 進行開發的時候,使用remote develop擴展包,直連windows開的高配ubuntu虛擬機,從此再也不用擔心環境和性能的問題了。(remote develop擴展包,可以讓你使用遠程主機或者docker中的環境進行開發,本機的vs code此時就像是個瀏覽器一樣,十分的方便)

備註

本文不會貼具體的代碼,只是講一下我整個的過程和思路,因爲我覺得這纔是最重要的東西。

背景

最近新入職了一家公司,名字就不說了。公司對保密的要求十分嚴格,對內外網進行了分離,並且只配發了臺式機,8g、i5、機械硬盤的配置。用內網就不能訪問外網,也就是一些涉及到在線安裝的東西全都死翹翹了(比如咱們各種IDE在線安裝插件,或者其他開發工具涉及到聯網的部分)。用外網的話,文件就無法保存,相當於是開了一個還原卡系統一樣的東西,所以想安裝軟件的唯一途徑就是U盤拷貝,或者使用外網後將文件手動導出,然後在內網模式進行安裝(說實話作爲一個喜歡折騰的程序員,我吐了)。

於是我一直都是使用的我的mac進行工作,但是性能實在有些頂不住(內存定製的是16G),工作內容經常需要集羣環境,而且編譯工作很重,我只能在mac上開一堆虛擬機進行模擬,經常就風扇狂響,鍵盤燙手。於是我就想用遠程控制我家裏的臺式機(i7 9700k,1T的三星Nvme固態、40G內存),將臺式當作額外的雲服務器來用。誕生了這個想法後,我就開始了折騰之旅。。。

如何快速搭建開發環境(windows + mac)

其實吧,由於工作內容的關係,我需要一套很重的開發環境(經常啓停一套集羣進行測試,各種中間件和工具一大堆),所以在使用mac的時候就折騰了很久的開發環境的搭建的問題。雖然mac號稱能跑linux上的很多東西,但是實際上使用的時候,是有很多不兼容的地方的,最後依然需要真正的linux系統來進行開發,不然解決兼容性的問題就把自己煩死了(還是工作內容的原因,我沒辦法只用docker就組一套環境)。下面就是我折騰開發環境的過程

階段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),工作起來都感覺更有趣了~~😄

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章