容器技術(shù)可以保證環(huán)境一致性秕岛,簡化項(xiàng)目配置膘婶、部署流程丸氛,因此很受廣大開發(fā)者青睞罚舱。如果你打算嘗試或者已經(jīng)嘗試基于容器簡化本地項(xiàng)目環(huán)境配置井辜,但又嫌棄 docker 用起來還是不夠直截了當(dāng),那么可以試下 multipass管闷。
安裝
macOS(支持 Sierra 以上版本)可以直接通過 Homebrew 安裝:
brew cask install multipass
Windows 用戶可以到這里下載安裝(只支持 Windows 10粥脚,如果是 Windows 家庭版或者 v1803 之前的 Windows 10 專業(yè)版/企業(yè)版,還需要另外安裝 VirtualBox)包个。
運(yùn)行一下 multipass version
命令確認(rèn)安裝成功阿逃,順便查看一下版本:
multipass 1.1.0+mac
multipassd 1.1.0+mac
可以看到當(dāng)前版本是這個月剛發(fā)布的 1.1.0。對很多用戶來說赃蛛,這個版本最大的更新是支持代理恃锉。從 1.1.0 起,multipass 像很多命令行工具一樣呕臂,會遵循 http_proxy
環(huán)境變量中指定的代理破托。因?yàn)?multipass 創(chuàng)建容器時(shí)可能需要從網(wǎng)絡(luò)下載鏡像,而很多地方的網(wǎng)絡(luò)連通性不盡如人意歧蒋,因此支持代理能夠大大改善使用體驗(yàn)土砂。
上手
先來創(chuàng)建一個容器:
$ multipass launch --name react
Launched: react
初次創(chuàng)建時(shí)需要下載鏡像,網(wǎng)絡(luò)暢通的情況下谜洽,稍等片刻即可萝映。
容器創(chuàng)建后 multipass 會馬上啟動它,這樣創(chuàng)建好容器后我們就可以直接使用了:
$ multipass exec react -- lsb_release -d
Description: Ubuntu 18.04.4 LTS
lsb_release
會打印 Linux 發(fā)行版的信息阐虚。之前我們創(chuàng)建容器的時(shí)候并沒有指定使用什么樣的鏡像序臂,上面命令的輸出表明,multipass 默認(rèn)會使用當(dāng)前 LTS 版本的 Ubuntu实束。
除了直接在容器上運(yùn)行(exec
)命令外奥秆,還可以通過 shell
命令「進(jìn)入」容器:
multipass shell react
我們進(jìn)入了一個完整的 Linux 環(huán)境,可以進(jìn)行各種操作咸灿。例如构订,假設(shè)我們看到了一篇介紹 React Hooks 的教程,打算體驗(yàn)一下教程的示例項(xiàng)目:
git clone https://github.com/hjiang/react-hook-demo.git
cd react-hook-demo
npm install
哎呀避矢,系統(tǒng)告訴我們 npm
沒有安裝悼瘾,并建議通過 apt
安裝囊榜。
The program 'npm' is currently not installed. You can install it by typing:
sudo apt install npm
不過,當(dāng)前 LTS 版本的 Ubuntu 倉庫里的 Node.js 比較老舊亥宿,我們轉(zhuǎn)而安裝 LTS 版本的 Node.js(12):
curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
sudo apt-get install -y nodejs
npm install
npm start
項(xiàng)目跑起來了卸勺,太棒了:
Compiled successfully!
You can now view leancloud-react-hook-tutorial in the browser.
Local: http://localhost:3000/
On Your Network: http://192.168.64.5:3000/
Note that the development build is not optimized.
To create a production build, use npm run build.
這里 192.168.64.5
是 Multipass 分配給 react 這個容器的 IP,所以我們可以直接在宿主機(jī)上打開瀏覽器訪問 http://192.168.64.5:3000/
查看效果箩绍。
定制
接下來我們嘗試容器化手頭正在開發(fā)的一個 Node.js 項(xiàng)目。和之前不同尺上,我們將對容器進(jìn)行一些定制材蛛,這樣用起來更方便。
首先怎抛,我們的 Node.js 項(xiàng)目將部署到云平臺卑吭,所以我們希望容器的規(guī)格盡可能和云平臺上的生產(chǎn)環(huán)境一致。其次马绝,我們之前手動安裝了 Node.js豆赏,這次我們希望自動化這一安裝過程。
因此富稻,我們使用以下命令創(chuàng)建容器:
multipass launch --name lean --disk 2G --mem 256M --cloud-init lean.yaml 18.04
我們通過命令行參數(shù)指定了容器的磁盤和內(nèi)存大小掷邦,并且顯式指定使用 Ubuntu 18.04。容器創(chuàng)建成功后椭赋,通過 multipass info
可以查看容器的基本信息:
$ multipass info --all
Name: lean
State: Running
IPv4: 192.168.64.2
Release: Ubuntu 18.04.4 LTS
Image hash: fe3030939822 (Ubuntu 18.04 LTS)
Load: 0.11 0.30 0.16
Disk usage: 1.3G out of 2.0G
Memory usage: 71.4M out of 229.7M
Name: react
State: Running
IPv4: 192.168.64.5
Release: Ubuntu 18.04.4 LTS
Image hash: fe3030939822 (Ubuntu 18.04 LTS)
Load: 0.00 0.00 0.00
Disk usage: 1.7G out of 4.7G
Memory usage: 112.1M out of 985.7M
可以看到抚岗,之前創(chuàng)建的 react 容器,multipass 默認(rèn)分配了 5G 硬盤和 1G 內(nèi)存哪怔。而 lean 容器則按照我們的要求分配了 2G 硬盤和 256M 內(nèi)存(這是我們計(jì)劃使用的云平臺 LeanCloud 云引擎 免費(fèi)版體驗(yàn)實(shí)例的規(guī)格)宣蔚。另外,基本信息中沒有 CPU 核心的信息认境,multipass 默認(rèn)會給容器分配 1 個 CPU 核心胚委。
至于 lean.yaml
則是容器的初始化配置文件,內(nèi)容如下:
#cloud-config
runcmd:
- curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
- sudo apt-get install -y nodejs
- wget https://releases.leanapp.cn/leancloud/lean-cli/releases/download/v0.21.0/lean-cli-x64.deb
- sudo dpkg -i lean-cli-x64.deb
runcmd
可以指定容器 首次啟動 時(shí)運(yùn)行的命令叉信,這里我們復(fù)制了之前安裝 Node.js 的命令亩冬,還加上了安裝 lean-cli
的命令(我們通過 lean-cli
將代碼部署到云平臺)。
容器初始化配置文件遵循 cloud-init 標(biāo)準(zhǔn)硼身,可以通過 yaml 文件進(jìn)行用戶鉴未、文件、軟件倉庫鸠姨、 DNS 解析铜秆、SSH 密鑰、puppet讶迁、chef 等各種初始化配置连茧。
我們只打算在容器中測試核蘸、部署項(xiàng)目,并不打算 multipass shell
到容器內(nèi)使用 vim 或 emacs 開發(fā)項(xiàng)目啸驯。所以客扎,我們直接掛載宿主機(jī)上的一個目錄:
multipass mount demo lean:/home/ubuntu/demo
demo
是我們的 Node.js 項(xiàng)目目錄,如果讀者想要測試罚斗,可以用下面這個模板項(xiàng)目:git clone https://github.com/leancloud/node-js-getting-started demo
同時(shí)去 LeanCloud 注冊賬號徙鱼、創(chuàng)建應(yīng)用,方便體驗(yàn)下面的部署操作针姿。
掛載完成后袱吆,我們就可以在宿主機(jī)上使用趁手的 IDE、編輯器開發(fā)項(xiàng)目距淫,之后 multipass shell lean
到容器內(nèi)測試:
cd demo
lean login # 使用之前注冊的 LeanCloud 賬號登錄
lean switch # 選擇之前創(chuàng)建的應(yīng)用
npm install # 安裝項(xiàng)目依賴
lean up # 本地(容器內(nèi))調(diào)試
屏幕會輸出:
Node app is running on port: 3000
之前通過 multipass info
绞绒,我們知道 lean 容器的 IP 是http://192.168.64.2
,所以在宿主機(jī)上訪問 http://192.168.64.2:3000/
即可查看效果榕暇。
如果效果符合預(yù)期蓬衡,我們可以在容器內(nèi)運(yùn)行 lean deploy --prod 1
部署項(xiàng)目。
更多
運(yùn)行 multipass list
可以列出所有的容器:
Name State IPv4 Image
lean Running 192.168.64.2 Ubuntu 18.04 LTS
react Running 192.168.64.5 Ubuntu 18.04 LTS
如果希望節(jié)約資源彤枢,我們可以停止暫時(shí)用不到的容器狰晚,比如之前創(chuàng)建的 react:
multipass stop react
之后我們可以運(yùn)行 multipass start react
重新運(yùn)行容器。如果以后不再使用缴啡,那么也可以干脆刪除:
multipass delete --purge react
最后家肯,很多時(shí)候,我們只是想要在 macOS 或 Windows 上起一個 Linux 環(huán)境盟猖,然后進(jìn)行一些操作讨衣,multipass 應(yīng)付這一使用場景最是得心應(yīng)手:
multipass shell
是的,你沒看錯式镐,只需一條命令反镇,你就可以進(jìn)入一個與宿主機(jī)隔離的 Linux 容器!
multipass 會自動創(chuàng)建并運(yùn)行一個名為 Primary 的容器(如果還沒有創(chuàng)建或運(yùn)行的話)娘汞,這個容器也會自動掛載宿主機(jī)的 Home 目錄歹茶,就是這么省心省力。
結(jié)語
Multipass 使用起來十分簡潔直觀你弦。它是由 Canonical (Ubuntu 背后的公司)推出的惊豺,因此使用的鏡像由 Canonical 負(fù)責(zé)更新,包含最近的安全更新禽作,以及專門為各個平臺的虛擬化方案(Windows 的 Hyper-V尸昧、macOS 的 HyperKit、Linux 的 KVM)優(yōu)化的內(nèi)核旷偿。不過也因?yàn)橥瑯拥脑蚺胨祝壳爸С值溺R像也只限于 Ubuntu。