【觀(guān)點(diǎn)】將Docker用作本地開(kāi)發(fā)毫無(wú)意義
依托Docker運(yùn)行的后端服務(wù)(如數(shù)據(jù)庫(kù),緩存,存儲(chǔ)等)感覺(jué)相當(dāng)***,但對(duì)于編譯語(yǔ)言,Docker卻并未本地開(kāi)發(fā)的理想之選。
我一直在嘗試使用Docker作為本地開(kāi)發(fā)環(huán)境,最近我又嘗試了一遍,結(jié)果發(fā)現(xiàn)依然行不通。但是這次嘗試我得出了進(jìn)一步的結(jié)論,那就是對(duì)于大多數(shù)的開(kāi)發(fā)堆棧而言,將Docker作為本地開(kāi)發(fā)環(huán)境毫無(wú)意義,除了引入更多的復(fù)雜性外,幾乎沒(méi)有任何優(yōu)勢(shì)。
若要實(shí)現(xiàn)高效的代碼編寫(xiě)、編譯、運(yùn)行周期,意味著本地開(kāi)發(fā)環(huán)境的容器沒(méi)必要和生產(chǎn)環(huán)境的容器保持一致。這等于是否定了容器最重要的優(yōu)勢(shì)之一。換句話(huà)說(shuō),基于容器的開(kāi)發(fā)環(huán)境根本無(wú)法達(dá)到非容器的本地開(kāi)發(fā)環(huán)境的高效和流暢。
先看看我的要求,一個(gè)高效的coding、編譯和運(yùn)行周期需要單獨(dú)的“非生產(chǎn)環(huán)境”的容器。首先,如果將生產(chǎn)環(huán)境的容器用于開(kāi)發(fā)環(huán)境,容器必須包含某些預(yù)編譯的組件,或者更甚,比如在你的Dockerfile中運(yùn)行編譯。這樣,每次微小改動(dòng)都需要重建容器。你的E/C/R(編輯、編譯、運(yùn)行周期)看起來(lái)像這樣:
- docker-compose up -d #啟動(dòng)所有的容器,并運(yùn)行
- # edit myservice
- make myservice # 構(gòu)建服務(wù)
- docker-compose build myservice
- docker-compose restart myservice
按這種方式,整個(gè)重建的周期要花很長(zhǎng)時(shí)間(超過(guò)30秒,還不包括服務(wù)自身的構(gòu)建時(shí)間)來(lái)觸發(fā)無(wú)聊至極的上下文切換。這絕對(duì)是生產(chǎn)力殺手。
你可以說(shuō)這是個(gè)實(shí)現(xiàn)上的問(wèn)題,并且最終這一重建周期將會(huì)大大加快,但是對(duì)比本地環(huán)境,構(gòu)建和重啟過(guò)程需要幾乎無(wú)感。我也不覺(jué)得這會(huì)有效利用到Docker的鏡像緩存。
如果愿意放棄使用生產(chǎn)容器作為本地開(kāi)發(fā)容器的想法,或者運(yùn)行一個(gè)沒(méi)有構(gòu)建過(guò)程的解釋性堆棧,你或許可以改變游戲規(guī)則。你可將資源庫(kù)目錄裝載到容器中,進(jìn)而監(jiān)聽(tīng)文件的變更,在容器內(nèi)使用實(shí)時(shí)裝載工具或刷新機(jī)制來(lái)重新編譯和發(fā)布應(yīng)用。
在一系列愚蠢的步驟下,這種方式也可工作的很好。比如我們將花時(shí)間尋找和設(shè)置docker-osx-dev開(kāi)發(fā)環(huán)境,裝載并與源文件夾高效的同步,又將花幾個(gè)小時(shí)擺弄boot2docker以便使inotify正常工作起來(lái),但是我們的確找到了解決方案。
但當(dāng)我們回顧并看看這一變態(tài)的過(guò)程,我們竟然找不到令人信服的優(yōu)勢(shì)所在。我們?cè)诒镜厥褂胒oreman啟動(dòng)所有服務(wù),對(duì)比docker-compose up,foreman start速度難以置信的快。除了Docker容器本身,我們也繼承了管理boot2docker所帶來(lái)的復(fù)雜性。配置文檔長(zhǎng)度也增加了三倍。
我們的初衷是使用Docker作為本地開(kāi)發(fā)環(huán)境,打破在本地只能運(yùn)行如Memcached和Elasticsearch的幾種關(guān)鍵服務(wù)。最終,我們得到結(jié)論,通過(guò)docker-compose運(yùn)行后端服務(wù)是很有意義的,但配置和運(yùn)行本地開(kāi)發(fā)環(huán)境需要盡量簡(jiǎn)單。另外,我們又回到了通過(guò)foreman來(lái)運(yùn)行本地微服務(wù)的方式。從此不再回頭。