近,跟一個大學(xué)金融系的同學(xué)交流,發(fā)現(xiàn)他對科技發(fā)展的動態(tài)非常了解,然而對于一些技術(shù)關(guān)鍵字的應(yīng)用并不是很理解。對于普通不懂技術(shù)的小白來說,如果去咨詢一些IT行業(yè)技術(shù)大牛,他們往往會獲得一個一臉茫然的回答。比如說,他問我“云計算”是什么?百度百科:
云計算(cloud computing)是基于互聯(lián)網(wǎng)的相關(guān)服務(wù)的增加、使用和交付模式,通常涉及通過互聯(lián)網(wǎng)來提供動態(tài)易擴展且經(jīng)常是虛擬化的資源。
別說一個技術(shù)小白了,就算現(xiàn)在我看完這句話,我也是一臉茫然,難為大家了。站在技術(shù)小白的角度,去看看網(wǎng)上的一些“云計算”的解釋,你會發(fā)現(xiàn),還是那么的難以理解。用產(chǎn)品的口吻來說:用戶體驗不好。我嘗試給他作出類比:
“古時候,人們家里做一口井,水從井里打出來,而現(xiàn)在,我們扭開水龍頭,水就來了; 10年前,你要裝軟件,得跑去電腦城買光碟,而現(xiàn)在,連上網(wǎng)打開應(yīng)用商店,軟件盡在眼前——這就是云計算”。
當(dāng)然了,本來“云計算”就是一個很廣的問題,這樣的解釋無非是拿出其中之一的應(yīng)用場景作類比。但是它能幫助普通人更好的理解。我覺得這是一個非常有趣的過程:用跨界思維,用擬物或擬人的方式,去提煉簡化一些看起來很復(fù)雜、枯燥的技術(shù)關(guān)鍵詞。
回歸正題,我們討論Docker。估計喜歡瀏覽技術(shù)新聞資訊站的同學(xué),都會知道Docker——傳說中改變世界的東西,它改變了應(yīng)用的部署運維。那么Docker是什么?來看看百度百科:
Docker 是一個開源的應(yīng)用容器引擎,讓開發(fā)者可以打包他們的應(yīng)用以及依賴包到一個可移植的容器中,然后發(fā)布到任何流行的Linux機器上,也可以實現(xiàn)虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口。
當(dāng)初,看完它的解釋后,我的反應(yīng)依舊是蒙圈,因為它跟我們腦海中常見的物理機、虛擬機的概念相比,是一種未曾想象過的新事物。鑒于所在工作環(huán)境周圍,還沒見過應(yīng)用Docker在開發(fā)環(huán)境的同學(xué)(希望大牛云集的項目不要鄙視),而我又覺得用通俗化的思路去解釋Docker思維是有價值的一件事,這也是本文的成文目的。
這是Docker的官方圖標(biāo)——一只大鯨魚,上面有各種各樣的集裝箱;鯨魚就像一個操作系統(tǒng),上面裝著各種各樣的集裝箱——軟件。也許你會問,這不跟我們iPhone應(yīng)用一樣嗎?手機操作系統(tǒng)(鯨魚),里面有各種各樣的App(集裝箱)。但是,仔細(xì)想想,iPhone上的App,Android上能運行嗎?——不行。因為iPhone使用IPA格式的App包裝方法,而Android使用APK格式的App包裝方法,兩者部署上是非常的不一樣的。
能不能在Android上,運行iPhone應(yīng)用,而又不使用損耗資源的虛擬機技術(shù)? 這就是Docker——它應(yīng)用在PC平臺上的,可以讓不同的操作系統(tǒng)平臺,占用很少的資源,運行同樣的軟件程序。
它就像一個提供開發(fā)型軟件的應(yīng)用商店。以往,我們需要安裝MySQL數(shù)據(jù)庫,我們首先要想,我的操作系統(tǒng)是Windows?我的CPU是64位? 然后我們找到了MySQL Windows 64位版本進行下載,然后開始安裝,安裝在C盤?安裝完成后,把數(shù)據(jù)庫賬號密碼設(shè)置好?而在Docker時代,我們只需要下載MySQL的Docker鏡像安裝就可以了。這個思路推而廣之,Android上利用Docker運行iPhone應(yīng)用什么時候可以做到?這是技術(shù)上可行的,但這里不作過多幻想了。
Docker不是什么新生事物,早在2013年就誕生了,而它的核心技術(shù)cgroup早在2006年就寫進Linux內(nèi)核了,直到這2年,才漸漸開始廣泛的應(yīng)用。Docker常見的場景,是部署和運維。今天,我們拋開技術(shù)細(xì)節(jié)、理論、運維需求,簡單談?wù)凞ocker怎么應(yīng)用到我們?nèi)粘S螒蜷_發(fā)環(huán)境當(dāng)中,并讓團隊的工作流程起到什么樣的優(yōu)化。
Laradock是一個PHP的Docker開發(fā)環(huán)境,使用它可以極其方便的快速搭建PHP開發(fā)環(huán)境。 它不但包含了PHP語言執(zhí)行環(huán)境,還包括了一系列相關(guān)工具,其中包括我們非常常用的MySQL、Redis。在Laradock的官方文檔中,就有這樣的一句話:
Use Docker first and learn about it later.
先使用Docker,然后再學(xué)習(xí)它。
是的,先使用它,然后再深入學(xué)習(xí)Docker的一些很原理,一個自上而下的學(xué)習(xí)過程,可以讓你更加快速的理解和應(yīng)用Docker。應(yīng)用Laradock是一個很好的Docker學(xué)習(xí)起點。要使用Laradock,首先你得安裝Docker。 一般有可以選擇下載Windows版Docker或下載Mac版Docker,跟著安裝步驟安裝即可。而在國內(nèi),訪問Docker的鏡像倉庫非常的慢,因此,需要設(shè)置國內(nèi)的加速鏡像倉庫。
安裝好Docker以后,會有小鯨魚的圖標(biāo)出現(xiàn)在系統(tǒng)托盤上。右擊出現(xiàn)菜單(macOS系統(tǒng)則是左擊),并選擇“Settings”。
Docker加速器
Windows環(huán)境時,選中“Docker Daemon”界面,往”registry-mirrors”字段里添加鏡像倉庫的地址。
為什么要配置鏡像倉庫地址?像前面所說的,Docker有點像應(yīng)用商店——把需要的開發(fā)軟件,下載并安裝。因此鏡像倉庫(Docker Hub)上儲存著各種各樣的“鏡像”,可理解成別人預(yù)先制作好的開發(fā)軟件。包括我們常見的MySQL、CentOS,其官方都會維護一份Docker鏡像。
使用Laradock,你可以使用它在GitHub上托管的源碼:
git clone https://github.com/laradock/laradock cd laradock
docker-compose up -d nginx mysql redis memcached
或者,如果連命令都不想輸入(或者git都還沒安裝),下載https://github.com/mr-kelly/laradock/archive/master.zip ,解壓后,在安裝好Windows環(huán)境雙擊執(zhí)行start.bat批處理。
這樣的一條命令,呼叫Laradock下載、啟動了nginx、MySQL、redis、memcached四個主要容器。這幾個不同的Docker容器互相組合,并映射端口到本地。比如把localhost:80端口映射到nginx容器的80端口,把localhost:3306端口映射到MySQL容器的3306端口。這時候,使用你的MySQL數(shù)據(jù)庫工具(比如Navicat),輸入連接地址localhost,賬號root,密碼root,你就能連上了MySQL容器中的MySQL數(shù)據(jù)庫程序了。
在以往,我一般會使用XAMPP來當(dāng)作我的PHP HTTP開發(fā)環(huán)境——它內(nèi)置了Apache、MySQL等開發(fā)組件,并且能以“綠色”軟件的方式安裝運行在我的電腦上。 直到有一次,XAMPP在我的macOS上,出現(xiàn)phpredis擴展無法訪問Redis的問題,折騰很久也沒找到具體的原因,終轉(zhuǎn)而使用Docker搭建開發(fā)環(huán)境。
在日常的工作中,我們其實經(jīng)常遇到這種情況:因為一些跟業(yè)務(wù)工作的一些小問題,比如裝系統(tǒng)啊、環(huán)境配置的坑啊等等,會耗費我們非常多的精力。要真正的應(yīng)用Docker到您的開發(fā)環(huán)境,需要根據(jù)項目業(yè)務(wù)、技術(shù)選型,來自定義Docker鏡像,比如說,一個使用Java+MySQL的項目,除了MySQL鏡像外,還需要Java運行時鏡像,多個鏡像互相組合。
可能你會疑惑,為什么要弄成多個鏡像?使用一個Linux發(fā)行版鏡像,然后在上面安裝好Java、MySQL,再制作一個完整的鏡像不就行了嗎? 是的,這也是可行的,只是說這樣做法,類似于編程開發(fā)中的“耦合度高”,就是當(dāng)這樣一個完整的開發(fā)環(huán)境鏡像在某一天需要修改時,比如說其中的MySQL版本更新了,就需要對這個鏡像進行重新制作。而拆分成多個鏡像互相組合,則只需要使用官方對應(yīng)版本的新鏡像即可。
怎么使用Docker進行鏡像的制作,官方的文檔很多,這里就不重復(fù)“造輪子”了。Laradock的Github地址laradock/laradock: A Docker PHP development environment. ,上面有其更加詳細(xì)的使用方法。
一個新人入職
新人工程師走進公司,會有一個熟悉工作環(huán)境的過程,其中一個耗時的環(huán)節(jié),就是安裝開發(fā)環(huán)境。這是一個非常折騰人的過程,如果你是使用大型IDE的開發(fā)者,比如說安裝MySQL、SQLServer、Android SDK等大型開發(fā)軟件,這將是一個耗時的過程——首先你得找到軟件包,然后再進入漫長的安裝過程。常見的實踐是公司內(nèi)部共享,把這些常用軟件都共享出來,讓大家安裝。然而大家的習(xí)慣不同的,操作系統(tǒng)也不同,過程中依然會遇到種種兼容問題。
曾經(jīng)一個做Android開發(fā)的朋友,在入職公司的周內(nèi)——花了一周的時間,終于把開發(fā)環(huán)境搭建完成,讓Java工程編譯通過。
游戲策劃跑單服
游戲團隊開發(fā)的過程中,免不了出現(xiàn)非技術(shù)人員需要在自己機器上啟動游戲服務(wù)器進行測試的情況。因此,“搭建開發(fā)環(huán)境”這個技能,會出現(xiàn)非技術(shù)人員身上。跟程序員相比,非技術(shù)人員“搭建開發(fā)環(huán)境”或“配置服務(wù)器環(huán)境”是相對更加難的事情,他們需要的是有一種“雙擊就能運行”的單服運行體驗。 有一些非技術(shù)人員和程序員之間對話,是我們經(jīng)常聽見的:
“嗯,這個功能我提交前測試是正常的——你的環(huán)境干凈嗎?需要的數(shù)據(jù)都干凈地重新生成了嗎?第三方庫的二進制文件更新了嗎?你們幾個人測試的版本一致嗎?要不你 Cleanup / 重啟 / 重新保存 / 重新建個賬號試試?”
(引自厚積薄發(fā) | 游戲引擎技術(shù)點滴)
然而實際的開發(fā)過程中,程序、策劃之間是缺乏換位思考的,程序員更喜歡直接在自己的工作上開碼,而不是為非自己工作范圍內(nèi)的體驗進行優(yōu)化。因此,“技術(shù)流”策劃甚是常見,不但了解軟連接硬鏈接的創(chuàng)建刪除、還熟悉各種各樣的SQL數(shù)據(jù)庫、還會通過Visual Studio編譯程序,甚至有很多都能直接編程的。
開發(fā)軟件
那么能不能把裝好軟件的開發(fā)機整個做一個Ghost系統(tǒng)鏡像?
這確實是我前兩年項目所使用的方法:在一臺電腦上,裝好所有開發(fā)環(huán)境軟件,然后使用Ghost打包一個系統(tǒng)鏡像。想法很美好,但是實際過程卻很難執(zhí)行。一個鏡像大小動輒10多GB的占用,克隆慢,恢復(fù)鏡像也慢;更要命的是,開發(fā)環(huán)境在研發(fā)過程中經(jīng)常的變化,比方說想把舊有鏡像中的MySQL 4升級成MySQL 5,怎么做? 不停的重新構(gòu)建虛擬機鏡像? 太艱難。
后來我為了達到這樣的目的,完整的MySQL執(zhí)行程序、MongoDB執(zhí)行程序直接放到SVN上傳。從程序員角度來看,這是骯臟的,把一些無關(guān)重要的二進制文件進入到了代碼庫;但是從用戶體驗的角度來看,這是提高了非技術(shù)人員的使用體驗。
類似這個情況如果應(yīng)用Docker后,我們大可以只需要把MySQL或MongoDB的Dockerfile定義文件上傳到SVN,非技術(shù)人員在首次啟動時就會自動從容器倉庫(內(nèi)網(wǎng)或外網(wǎng)均可)拉取到對應(yīng)的容器并啟動,快速并且規(guī)避兼容性問題。
一些Linux-only的程序
redis對Windows的支持非常有限,skynet游戲框架不支持Windows平臺,但是對于使用Windows的人來說,會使用一臺虛擬機來進行開發(fā)。
而使用Docker,則可以改善這樣的開發(fā)環(huán)境:部署一個Linux容器,并把本地代碼文件映射到容器中,做到使用本地環(huán)境編輯代碼、使用Docker運行程序;Redis官方提供Docker版本,體積非常小,讓W(xué)indows下運行不再困難。
導(dǎo)入真實玩家數(shù)據(jù)
在項目運營中,出現(xiàn)的一些BUG,我們希望能模擬玩家的數(shù)據(jù)進行測試,這時候需要把一些玩家的數(shù)據(jù)導(dǎo)入,進行測試。一般來說,我們需要把數(shù)據(jù)庫的數(shù)據(jù)導(dǎo)出,然后再在開發(fā)環(huán)境中導(dǎo)入。
而如果運營的項目是使用Docker容器進行部署的,那我們只需要把這個容器整個拖回到本地執(zhí)行,我們就能完整的模擬到真實數(shù)據(jù)環(huán)境了。 同樣,應(yīng)用這樣的思路也可以進行數(shù)據(jù)庫的備份。
DevOps
說起Docker,總是免不了DevOps——開發(fā)運維一體化。這是一個很大很抽象的思想話題,但我們這里只簡單的介紹其中一種應(yīng)用:開發(fā)所使用的Docker容器,直接丟到生產(chǎn)服務(wù)器,極簡部署。
比方說,我所在項目使用C#進行游戲服務(wù)器的開發(fā),在Windows上使用.net Framework跑,實際運維環(huán)境則使用Mono。也就是說,實際運維環(huán)境中,如果出現(xiàn)了有.net Framework和Mono不同兼容性的BUG,這些BUG對開發(fā)人員來說都是前所未見、難以理解的——因為開發(fā)環(huán)境,跟運營環(huán)境,是完全不一樣的,這會引領(lǐng)開發(fā)人員進入另一場爬坑游戲。
Docker的兩大核心基礎(chǔ)技術(shù)是namespace和cgroup,它們早在2006年的就被寫進如Linux內(nèi)核。
抽象來說,跟虛擬機不一樣的是,虛擬機技術(shù),把CPU、內(nèi)存等所有硬件用軟件化進行虛擬,形成一個虛擬的計算機環(huán)境;而Docker,則有點像“CPU中的虛擬CPU”、“內(nèi)存中的虛擬內(nèi)存”來對計算機進行資源隔離。
Vagrant
在使用Docker之前,我一直使用Vagrant來進行開發(fā)環(huán)境快速部署。它們的目的很相像,但是又不是那么一回事。Vagrant說白了,就是一個VirtualBox虛擬機的快速管理工具。以往使用虛擬機,我們需要安裝VirtualBox,需要下載Linux發(fā)行版鏡像,需要安裝,安裝后再安裝各種開發(fā)軟件。
而使用Vagrant,就像Docker一樣,只需要一條命令,就可以完成以上所有的工作了。 只是,說白了,Vagrant就是一個虛擬機管理工具,它就類似于你使用了一個CentOS Docker容器,然后在里面安裝好所有的開發(fā)軟件。在Web開發(fā)領(lǐng)域,看到很多程序員已經(jīng)應(yīng)用上Docker用于開發(fā)環(huán)境了;目前身邊的游戲開發(fā)中還沒看到,也希望Docker慢慢普及開來。本文只是非常片面的展現(xiàn)了Docker應(yīng)用的冰山一角——搭建簡單開發(fā)環(huán)境。謹(jǐn)供你參考。
本站文章版權(quán)歸原作者及原出處所有 。內(nèi)容為作者個人觀點, 并不代表本站贊同其觀點和對其真實性負(fù)責(zé),本站只提供參考并不構(gòu)成任何投資及應(yīng)用建議。本站是一個個人學(xué)習(xí)交流的平臺,網(wǎng)站上部分文章為轉(zhuǎn)載,并不用于任何商業(yè)目的,我們已經(jīng)盡可能的對作者和來源進行了通告,但是能力有限或疏忽,造成漏登,請及時聯(lián)系我們,我們將根據(jù)著作權(quán)人的要求,立即更正或者刪除有關(guān)內(nèi)容。本站擁有對此聲明的最終解釋權(quán)。