因爲去年的燒烤攤營收達預期,燒烤哥給本身買了臺新電腦。但新電腦上啥都沒有,致使晚上收攤後回去沒法加班,非常苦惱。javascript
爲了避免影響燒烤攤今年的業績,燒烤哥仍是在本身的遊戲本(玩遊戲的本子)上搭起了一個前端開發環境。前端
面臨的一個問題就是,該怎麼搭這個環境
?java
咱們先來捋一捋,燒烤哥的業務涉及到web開發、taro小程序
。因此只要電腦上有node、git
,而後再利用npm去安裝一些全局庫(如typescript、taro-cli
等)不就能夠了嘛?node
確實如此,但燒烤哥不是一個容易知足的人,否則也不會去搞燒烤了。react
在燒烤哥的認知範圍內,有以下方式能夠搭建一個開發環境。 linux
直接安裝不考慮,屬於燒烤哥能力圈的溫馨區(能力圈能夠分爲溫馨區、拉伸區和困難區,處在拉伸區時我的成長最快
),作了等於浪費時間。虛擬機呢估計每次啓動環境得先花個半小時(誇張修辭手法)也不考慮。而使用docker
呢,正好處於燒烤哥的拉伸區,很是值得嘗試。git
原本開發,只要能speak javascript就ok了,如今還要能speak docker。web
docker是什麼就很少說了,先來了解下本文會涉及到的一些概念
。docker
image
:鏡像,是一個只讀模版,用來建立容器。container
: 容器,是一個可運行的鏡像實例。Dockerfile
: 鏡像構建的模版,描述鏡像構建的步驟。因此它們之間的關係是,經過Dockerfile構建出鏡像,而後經過鏡像來建立容器,程序就跑在容器中
。而且一個鏡像能夠隨意建立N個容器,各個容器間相互隔離。typescript
來作個demo,寫一個hello world的node程序,而後在容器裏面跑該程序。
照葫蘆畫瓢,編寫代碼文件index.js -> 編寫Dockerfile -> image -> container
.
建立一個docker-test目錄,在裏面新建一個index.js,鍵入如下指令
console.log('hello world');
複製代碼
繼續在裏面新建一個Dockerfile文件(不須要後綴),鍵入如下指令
FROM node:15.10.0-slim
COPY . ./demo
WORKDIR /demo
CMD node index.js
複製代碼
簡單解釋一下這幾個指令。
FROM node:15.10.0-slim
就是說咱們的鏡像會繼承 node:15.10.0-slim 這個鏡像,這個鏡像在哪裏找呢?沒錯,你可能也猜到了,在Docker交流網站Docker Hub中。
COPY . ./demo
是把當前目錄拷貝到鏡像的/demo目錄下,固然你也可使用.dockerignore來排除你不須要打包的文件。
WORKDIR /demo
相似於 cd /demo
。
CMD node index.js
容器啓動後執行node index.js
命令。
在bash中運行 docker image build -t demo .
構建好以後,運行docker image ls
就能夠查看到demo鏡像了。
運行docker container run demo
,不出意外你會在hello world打印出來。
docker說到這裏就差很少了,下面咱們來看看如何搭建開發環境。
咱們的開發環境須要全局安裝有node、git、typescript、taro-cli
。
咱們先讓項目在本地跑起來,假設機器上已經有了一個項目,該項目是用create-react-app建立的項目。
總體步驟跟上面的demo是一致的,只是把index.js
替換成了項目文件
,還有一個區別是因爲是開發運行(不是構建項目後運行),因此咱們須要安裝package.json中的依賴。
其實總體區別只在Dockerfile,下面來看看Dockerfile。
FROM node:15.10.0-slim
COPY . ./demo
WORKDIR /demo
RUN npm install
CMD npm run start
複製代碼
構建iamge:docker image build -t react-demo .
。
運行容器: docker container run -p 3000:3000 react-demo
。
這裏運行容器時須要指定-p參數
將容器的3000端口映射到本機的3000端口。
此時,react項目就跑起來了。
能夠看到,按開發的模式來講,這樣是存在問題的。好比:
從新構建鏡像
缺乏開發時須要的依賴
咱們但願的是,經過容器來提供開發時須要的依賴,而後經過vscode修改的代碼實時跑在容器中
。
要讓咱們的鏡像提供開發時須要的依賴,其實就是讓咱們的鏡像包含node(typescript、taro-cli)、git就好了。
其實咱們以前的node鏡像node:15.10.0-slim
啓動後的容器,能夠當作一個只帶有node環境虛擬化的linux虛擬系統
,咱們能夠進入到容器裏面去看看,運行docker container run -it node:15.10.0-slim /bin/bash
就能夠進入到容器的bash中。
因此只須要依賴現有的node鏡像,並在構建咱們的鏡像時安裝須要的程序便可。來看看Dockerfile。
FROM node:15.10.0-slim
RUN apt-get update && apt-get install -y git
RUN npm install -g typescript @tarojs/cli
複製代碼
此次咱們沒有把代碼打包到鏡像中了,而是執行了apt-get upgrade && apt-get install git
和 npm install -g typescript @taro-cli
兩個命令。
構建鏡像:docker image build -t frontend-dev .
。
運行容器: docker container run -it frontend-dev /bin/bash
。
進入到容器,就能夠看到咱們安裝的程序了。
此時,咱們的鏡像就已經具有開發時須要的環境了。
docker提供了掛載點,可讓容器訪問咱們本機的文件系統。
只須要在咱們的項目中啓動容器時指定-v 參數
就行,即docker container run -v "${pwd}:/demo" -it frontend-dev /bin/bash
。
你會發現咱們的frontend-dev鏡像
啓動的容器中多了/demo目錄
,並且進去裏面能夠看到就是咱們的項目。
而後在/demo目錄
中執行項目啓動命令npm run start
,咱們的項目就運行起來了。
這時你就可使用vscode修改咱們的項目代碼了,全部的修改都會跟/demo目錄
同步。
此時,咱們的鏡像就只作環境依賴做用了,咱們也能夠愉快的加班了。
不過你們確定會說,這種方式好是好,可是也太麻煩了吧。
其實咱們上面作的,vscode有對應的插件已經幫咱們完成了。
用三張圖告訴你怎麼用。
只要你機器裝了docker,按上面三步走下來,你的代碼就在容器中了。
你們確定又要說了,燒烤哥你怎麼不早說啊?
由於燒烤哥想說,其實上面說的都不重要
。對!你沒聽錯,是都不重要
。
其實燒烤哥這篇文章想說的,是有一個想法
。
咱們先再來看一個東西,一個vscode的插件。
看名字就能知道這個插件是幹啥的,它能讓咱們利用vscode經過ssh登陸到一個遠程機器上
,登陸上去以後看到的目錄就是遠程目錄了,而且對文件的修改,都是實實在在的修改遠程機器上的文件。
這也就意味着咱們能夠經過vscode從本地直接編輯遠程服務器的文件
。
結合上述說的,燒烤哥有個想法,就是:
利用linux系統的
多用戶多任務特色
,和docker快速搭建、遷移環境的能力
,團隊在一個遠程機器上進行業務開發
。
這樣作的優勢
是:
方便複製環境
:有新人來時,只須要在遠程機器上爲ta開一個帳戶,而後把鏡像(或Dockerfile)給ta,一個新的我的開發環境就搭建好了。方便統一環境
:團隊中你們可使用同一個image,有須要時,能夠統一對環境依賴進行更換或升級。方便隨時隨地加班
:在遠程開發的話,對本地終端基本就沒有什麼限制了。本地裝個vscode(甚至是有個瀏覽器)就能隨時隨地愉快的加班了。想說的都放在文章裏了,燒烤哥也該去加班了。
若是決定對您有幫助的話,麻煩點個贊吧~!