本文主要講,我是如何按部就班地搭建一個遠程開發環境,最後實現的效果是:在公司使用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
其實吧,因爲工做內容的關係,我須要一套很重的開發環境(常常啓停一套集羣進行測試,各類中間件和工具一大堆),因此在使用mac的時候就折騰了好久的開發環境的搭建的問題。雖然mac號稱能跑linux上的不少東西,可是實際上使用的時候,是有不少不兼容的地方的,最後依然須要真正的linux系統來進行開發,否則解決兼容性的問題就把本身煩死了(仍是工做內容的緣由,我沒辦法只用docker就組一套環境)。下面就是我折騰開發環境的過程windows
這個階段就是很樸實的想法,哈哈。在mac裝了vmware fusion,而後就是一頓熟悉的操做,安裝虛擬機balabala的,這個事兒估計你們都幹過,詳細過程就不用多說了。瀏覽器
這種方式問題就很大,首先就是安裝的過程,我須要手動一步一步的點擊下一步,而後改虛擬機的硬件配置啥的,總之是一個常常重複並且效率低下的過程。用了幾天以後我就摒棄這種方案了。服務器
在階段一以後,我找了一些資料,而後找到了vagrant。使用過這個工具以後就感受,這纔是程序員使用虛擬機的時候應該有的方式。vagrant可使用如今主流的VM軟件,好比vmware、virtualBox等,對虛擬機進行管理,也就是說,使用vagrant在命令行中開啓、關閉、配置虛擬機,而且他還有一個雲端的倉庫,就像是dockerhub同樣的東西,專門用來下載系統鏡像。使用vagrant以後,你就能夠經過相似於寫一個DockerFile的方式,寫一個VagrantFile來定義一組虛擬機(一個VagrantFile能夠定義無數個虛擬機),而後根據須要,隨時開啓或者銷燬不一樣的虛擬機實例,一會兒就把你從手工方式啓停虛擬機裏解放了出來。工具
因而我就折騰了兩天,寫了一個本身滿意的VagrantFile,定義了一套虛擬機環境,達到的效果就是:免密SSH、建立時自動安裝了我須要的環境、hosts文件共享,靜態IP,自動加入docker swarm集羣。到了這個階段以後,其實環境的問題已經基本上解決了,可是性能問題依然還在,我mac上自己也已經有一堆東西了,內存和CPU餘量其實並很少,基本上開的虛擬機性能都比較垃圾,並且散熱會比較吃力,因此實際使用起來體驗並很差。性能
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搞很差哪天就檢測說商業用途了,不夠穩,並且遠程控制畢竟仍是體驗不夠好。因而接着折騰,就折騰到了下面的終極方案了。
這個時候面臨的問題就是:我怎麼不用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),工做起來都感受更有趣了~~😄