歡迎關(guān)注我的專欄( つ??ω??)つ【人工智能通識】
為什么需要Docker?
比如說你開發(fā)了一個軟件侣诺,前端基于Nodejs構(gòu)建裆泳,后端使用Python編寫,數(shù)據(jù)庫用了MySQL糜芳,還用了Redis做消息系統(tǒng)。它們每一個都有特定的版本魄衅,都使用了各種第三方的包峭竣,也包含了你自己寫的各種各樣代碼文件。
無論是前端還是后端還是數(shù)據(jù)庫什么的晃虫,一開始可能非常簡單皆撩,但是隨著開發(fā)的推進(jìn),代碼越來越多哲银,功能越來越多扛吞,用到的第三方包也越來越多,項目結(jié)構(gòu)也越來越復(fù)雜荆责。
如果這時候你買了一臺新電腦滥比,那么要讓這個項目能在新電腦上繼續(xù)開發(fā)下去,除了拷貝項目文件之外做院,你還得安裝一大堆的軟件盲泛,做一大堆的配置濒持,這些頭疼的工作可能耗費你幾小時甚至幾天的時間。
同樣寺滚,當(dāng)這種軟件在你的電腦上開發(fā)完畢之后柑营,要在客戶指定的電腦或者云服務(wù)器上運行起來,恐怕也不是件容易的事情村视。
而至于讓其他人來接手你的軟件由境,對它進(jìn)行維護和升級,即使那個人非常懂得編程能夠看懂你的代碼蓖议,但要搞清楚你用了幾個月甚至幾年不斷更迭、配置讥蟆、修補而成的錯綜復(fù)雜項目結(jié)構(gòu)勒虾,也絕對不是件容易事∪惩——實際上修然,讓他能夠把你的軟件移植到其他設(shè)備似乎都是不可能完成的工作。
我們需要一種開發(fā)和部署模式质况,能夠在任何可行的設(shè)備上快速重建我們軟件項目所必要的環(huán)境愕宋。
我們需要什么?
我們編寫的軟件并不僅僅是我們自己輸入的代碼结榄,還要依賴很多別人編寫的代碼(第三方包Dependences)中贝,以及運行在系統(tǒng)上面的其他庫和服務(wù)(系統(tǒng)庫Libraries)。
將軟件移植到其他設(shè)備上臼朗,除了拷貝我們自己編寫的文件邻寿,還要確保用到的第三方包Dependences也一個都不少,還要確保目標(biāo)設(shè)備的系統(tǒng)環(huán)境和我們開發(fā)測試時候一致视哑,這不僅要求系統(tǒng)的類型和版本都一致绣否,還要求系統(tǒng)上軟件環(huán)境和系統(tǒng)配置也都一致〉惨悖——這不是個輕松的事情蒜撮。
首先說第三方依賴,我們可能會用Python的pip install 命令安裝十?dāng)?shù)個甚至更多需要的模塊Modules跪呈,而Nodejs的npm命令直接或間接安裝的模塊可能有數(shù)十甚至上百個段磨。
在編寫代碼之前,你須要有一個強大且穩(wěn)定的第三方依賴管理工具耗绿。它可以從一開始就準(zhǔn)確的記錄你所有的安裝和卸載模塊記錄薇溃,而且還可以快速的將所有用到的模塊打包整理。
你的項目文件應(yīng)該包含【自己寫的代碼】和【需要的第三方依賴包】兩部分構(gòu)成缭乘。要知道沐序,雖然在目標(biāo)電腦上批量重新安裝這些依賴包聽起來很美好琉用,但其中的不確定性一旦發(fā)生,你就會頭疼的要死策幼。
而至于操作系統(tǒng)環(huán)境邑时,唯一可行的就是將你用于開發(fā)的操作系統(tǒng)直接連鍋端到其他設(shè)備上。開發(fā)后把整個系統(tǒng)做成一個系統(tǒng)鏡像特姐,到目標(biāo)機器上安裝整個系統(tǒng)鏡像晶丘,然后你就擁有了一切。
——這聽起來有些夸張唐含,但使用虛擬化技術(shù)來說又是確實可行的浅浮,它的問題不在于鏡像整個操作系統(tǒng)的文件是否太大,而在于這個操作是否夠快捷枯。多人共同開發(fā)軟件的時候滚秩,快速的保持開發(fā)環(huán)境的同步是非常重要的。
同步系統(tǒng)鏡像的思路是行不通的淮捆,唯一可行的是使用云端的同一個操作系統(tǒng)運行代碼和進(jìn)行測試郁油。——每個開發(fā)者的電腦只擔(dān)當(dāng)一個代碼編輯器的作用攀痊,連IDE都不算桐腌。
理想的情況什么樣?
在云端有一臺測試服務(wù)器苟径,它可以生成不同的系統(tǒng)環(huán)境案站,每個項目單獨使用一個系統(tǒng)環(huán)境進(jìn)行開發(fā),各自安裝相關(guān)軟件棘街,各自進(jìn)行設(shè)置嚼吞,互不干擾。
項目團隊開發(fā)成員在各自的電腦上編寫代碼并隨時將代碼文件同步到測試服務(wù)器上蹬碧,測試服務(wù)器可以監(jiān)測到文件的變動舱禽,并且可以針對不同文件的改動而更新運行相應(yīng)的程序。
比如說當(dāng)它發(fā)現(xiàn)后端Python代碼文件被更新的時候恩沽,它就會自動執(zhí)行命令來重啟這些Python程序誊稚;如果它發(fā)現(xiàn)Nodejs代碼文件發(fā)生變化的時候,就自動執(zhí)行命令重新編譯js文件生成新頁面代碼罗心。當(dāng)團隊開發(fā)完成一個新版本并且經(jīng)過測試之后里伯,直接把測試服務(wù)器上運行的整個系統(tǒng)生成一個鏡像,再把這個鏡像部署到正式服務(wù)器之上渤闷,甚至部署到多個服務(wù)器之上(分布式部署)疾瓮。
開發(fā)過程中,我們可以隨時向測試服務(wù)器上的Git推送新版本代碼飒箭,當(dāng)然也可以隨時把代碼版本同步到其他Git服務(wù)上狼电,例如Github蜒灰。
最好我們也可以隨時把整個系統(tǒng)鏡像進(jìn)行備份,生成多個版本肩碟∏拷眩——這就需要鏡像文件不要太大,生成鏡像的時間也不要太久削祈。
在我們的這個夢想中翅溺,Docker將扮演的正是鏡像生成、管理和部署的角色髓抑。
<未完待續(xù)>
歡迎關(guān)注我的專欄( つ??ω??)つ【人工智能通識】
每個人的智能新時代
如果您發(fā)現(xiàn)文章錯誤哺眯,請不吝留言指正鼠冕;
如果您覺得有用湃番,請點喜歡疆柔;
如果您覺得很有用,歡迎轉(zhuǎn)載~
END