docker在web開發中得使用流程是怎樣的?
docker的容器是以鏡像來創建的,鏡像是不是一個類似操作系統的環境?在由鏡像構建的容器中部署應用?是不是到正式環境上還要安裝docker,然後把應用部署在其中?如果是這樣,那和我創建一個和生產環境一樣的虛擬機來部署應用有什麼區別? docker-machine工具是不是把整個過程搬到虛擬機里來操作了?還是一開始我的理解就錯了,初步接觸docker,感覺很多概念比較混亂,謝謝不吝賜教!
晚上失眠來答一發。
最近做過一個項目使用了Docker,下面我拋磚引玉,談一下自己對Docker的理解。在解答題主的問題之前,我們先搞清楚下面三點:一、為什麼使用Docker二、使用Docker的正確姿勢
三、Docker帶來了哪些好處一、為什麼使用Docker
Docker一詞意為碼頭工人,而Docker的功能也與集裝箱類似。通常一個webapp並不會用到操作系統/虛擬機的全部功能,即操作系統/虛擬機對於一個webapp來說太過笨重。打個比方說,我要從宿舍去食堂,我並不需要一架飛機,只需要一輛自行車就夠了,而Docker鏡像就相當於是一輛自行車。你可以把Docker鏡像理解為輕量化的虛擬機,當然二者有所不同,但是不在本文的討論範圍。二、使用Docker的正確姿勢
設想一個如下場景:我們需要一個webapp,其功能是用戶註冊並將註冊信息插入到資料庫,環境為Ubuntu+Tomcat+Mysql,怎麼做?不使用Docker的話,我們通常會這樣做,以Ubuntu為操作系統,然後安裝Tomcat和MySQL,最後把app部署上就可以了。那麼使用Docker會怎麼做呢,在這個場景下,可以有兩種方式:1.仍然以Ubuntu為操作系統,然後構建一個安裝有MySQL和Tomcat的Docker鏡像,並把app部署到其中,最後啟動Docker鏡像就可以了。看起來好像和不使用Docker基本相同,甚至還要麻煩一些,是這樣嗎?別著急,繼續往下看。2.第二種方式則體現了Docker的"每個容器只做一件事情"的思想,我們構建兩個鏡像,一個僅安裝Tomcat並部署我們的app,另一個僅安裝MySQL,然後啟動這兩個鏡像,得到兩個容器,再利用Docker的容器互聯技術將二者連接(Docker的容器是通過http連接的)。三、Docker帶來了哪些好處
看完上面的例子,你可能仍然不會覺得Docker有什麼好處,其實真正使用了Docker之後,你會覺得簡直愛不釋手。粗略來說,Docker好處有:1.保證了線上線下環境的一致性我們在線下的開發環境使用Docker構建好weaapp的鏡像後,可以直接在線上使用一個鏡像,保證了線上線下環境的一致性,再也不會有在線下開發環境中運行正常,而部署到線上各種錯誤了。2.極大的簡化了webapp的部署流程在不使用Docker時,我們部署app時,要先搭建好app運行所需環境,這個過程做過的人都知道多麼枯燥繁瑣,一不小心還出錯。而有了Docker,我們只需要直接構建一個我們webapp的鏡像然後將其運行即可,無論在多少台伺服器中部署,都是如此。再比如,使用Docker之前要搭建一個WordPress對於新手來說是有些困難的,而有了Docker,只需要從DockerHub上pull一個WordPress鏡像並啟動就可以了,非常非常方便。3.實現了沙盒機制,提高了安全性由於webapp運行在容器中,與操作系統隔離開了,從而使操作系統基本不可能受到破壞,另外如果webapp因為攻擊而癱瘓,並不需要重啟伺服器,直接重啟容器或者再啟動一個鏡像就可以了。4.實現了模塊化,提高了復用性在二中使用Docker的第二種方式就可以看出,我們將資料庫和Tomcat運行在不同的容器中,從某種角度來說,這也降低了模塊之間的耦合性,便於拓展。比如我們要把MySQL替換為oracle,只需要再構建一個oracle鏡像並啟動與Tomcat連接即可,非常方便。對於我們構建的鏡像,在其他app中直接拿來用就可以了,不必重複勞動。5.實現了虛擬化,提高硬體利用率
有了Docker,我們可以在一台伺服器上運行很多webapp,充分利用閑置資源。這時候,伺服器的操作系統就類似於貨輪,而一個個Docker容器就相當於貨輪上的一個個集裝箱。現在大熱的雲服務市場,不少就用了Docker。舉個例子來說,現在我們有一台操作系統為Ubuntu14.04的伺服器,我們構建不同版本的ubuntu鏡像並啟動,並且為不同的用戶分配不同的容器。這樣,用一台伺服器可以虛擬出n個運行著不同操作系統的虛擬伺服器,而對於用戶來說,這些是透明的––用戶則認為自己擁有一台完整的伺服器。據我推測,阿里雲的伺服器就是這麼乾的。這充分利用了閑置的硬體資源。我這裡掛一漏萬,Docker的好處遠遠不止這些。譬如使用Docker鏡像實現磁碟快照功能,在不同場景下有Docker不同的使用姿勢,至於更多奇技淫巧,則需要在使用過程在去發掘。
啰嗦了這麼一大堆,接下來回答題主的問題。實際上很多問題前文都已經解答了。
Docker的容器是以鏡像來創建的,鏡像是不是一個類似操作系統的環境?
是的,你可以將Docker理解為一個輕量化的虛擬機,至於我們經常說的什麼Tomcat鏡像、MySQL鏡像之類的,只是這個輕量化的虛擬機中安裝了相應的軟體。鏡像的名字也就說明了鏡像的功能。是不是到正式環境上還要安裝Docker,然後把應用部署在其中?
是的,構建Docker鏡像、運行Docker容器,都需要安裝Docker,但這是一勞永逸的,因為我們使用的是安裝了各種各樣功能軟體的Docker鏡像和Docker容器。如果是這樣,那和我創建一個和生產環境一樣的虛擬機來部署應用有什麼區別?
首先這個問題可以用自行車和飛機的例子解答。其次安裝Docker後,我們可以從DockerHub上獲取各種各樣的操作系統鏡像,這個操作很簡單,只需要pull相應的鏡像到本地然後運行即可,而安裝不同版本的虛擬機有多麻煩?另外DockerHub上有各種各樣的優秀鏡像,我們直接拿來使用就可以了,不需要自己搭建,應用的部署就像搭積木一樣簡單。
純手機碼字,好累。就先這樣吧。歡迎交流指正。docker可以使用docker build工具鏈將應用和所有依賴整個安裝到鏡像中,部署的時候直接啟動容器就是一個正確運行的服務了。docker build使用Dockerfile,Dockerfile是一個文本文件,相當於一個腳本,可以在CI系統中自動執行,做持續集成、持續部署很容易,build、test成功後直接替換線上的鏡像就行。
從原理上來說,docker並不是一個完全獨立的虛擬化環境,而是一個有獨立namespace的進程,所以啟動開銷就跟直接在物理機上啟動服務差不多,但是保證了環境隔離。
這些問題, Google 都有解答,docker 官網文檔也有,在這問一遍並不會讓你得到更好的答案。
就我而言, docker 部署更方便,應用之間相互隔離,開銷比 virtualbox 小,都是不錯的特性。最近做得好像都是,可以看看我博客~
docker的容器是以鏡像來創建的,鏡像是不是一個類似操作系統的環境?
- 很多人都會以docker container類比virtualbox,但實際上只是個隔離環境,比一套完整操作系統小多了。比如有的精簡linux image只有幾M(或者是幾十M)。
是不是到正式環境上還要安裝docker,然後把應用部署在其中? - 如果用docker,就直接部署在container service上,把你本地的container(或者是git上的)直接push到host上。docker-machine工具是不是把整個過程搬到虛擬機里來操作了? - docker-machine是個虛擬機來host docker,因為docker只能在linux跑 (好像現在docker可以直接在mac和windows跑了,我還註冊了個測試號,但沒怎麼用)跟著公司senior在用,懂的不多,如有說錯,還望指教。使用Docker搭建開發環境(windows篇)articles/用Docker構建開發環境.md at master · iAmHades/articles · GitHub使用docker搭建開發環境
我從不推薦開發者在web開發過程中使用容器,如果你真的用過docker,你會知道啟動web容器也是要花時間的,即使是1秒鐘也是時間啊。加上web開發的項目何止是一個組件構成的,通常這個時候嘗試docker compose搭建一套開發環境倒是可以試驗一把。但是,試想你寫了一行代碼,這個時候需要實時編譯並呈現出來如何做到呢?難道需要手工restart一遍docker compose?它並不能熱載入奧?所以,別吹牛了。在開發環境,docker一點用都沒有。請盡量用docker來構建測試環境比較合適。自動化測試方面尤其方便。
用docker最大的好處是你可以把你的應用以及應用運行依賴的環境和配置一起打包交付,做到開箱即用。利用容器部署應用,只需要下載一個你需要的鏡像,然後把鏡像run起來就可以了,跟你啟動一個二進位程序是一樣的。容器啟動起來以後,應用就可以直接訪問了,不需要再去部署應用。如果是用虛擬機的話,你還要先裝虛擬機,然後裝運行環境,然後再安裝應用,配置,再啟動應用,比較麻煩,整個過程費時費力。當然在虛擬機環境下,你也可以利用模板將所有這些過程自動化,也可以做到開箱即用。但問題是,虛擬機創建和運行都很耗時耗資源,docker容器可以做到秒級別的啟動。雖然現在有些虛擬機技術也可以到很快啟動,占很少的資源,但總體來說還是沒有容器輕量級和方便。利用docker鏡像,可以很容易保證開發測試和生產環境的一致性。虛擬機更適合做為IT基礎設施來使用,而容器更適合跑應用。
docker提供了一個隔離性不錯的運行環境(實際上是linux提供的),並且image中只包含了應用運行所必需的一些環境,而且運行過程中containers都使用的是host的kernel,因此啟動速度比虛擬機要快以go web應用為例,go可以用靜態鏈接,生成一個只依賴內核的應用,然後用docker的scratch構建鏡像,鏡像跟應用幾乎一樣大,用虛擬機就不可能達到這種程度
歡迎來看我寫的一篇文章優雅地使用docker
趙瀚卿:如何看待 Windows 原生支持 Docker?前幾天我司同事@零雲桂致銓 整理了這樣一個「docker在windows系統使用」的內部分享,這裡貼一下,如有不足,可以留言我們改進。
- docker的容器是以鏡像來創建的,鏡像是不是一個類似操作系統的環境?
是的。如果把容器(docker)跟虛擬機對比,docker的運行時等價於虛擬機運行時,docker鏡像等價於虛擬機鏡像。兩者底層實現技術不同,docker基於linux系統本身的機制(cgroup,namespace)構建,一個docker容器本質是一個進程。
- 在由鏡像構建的容器中部署應用?
是的。docker使用特定格式將包含某種應用的容器打包成鏡像,反過來可以將該鏡像部署成為容器。
- 是不是到正式環境上還要安裝docker,然後把應用部署在其中?
是的。需要docker的運行環境。
- 如果是這樣,那和我創建一個和生產環境一樣的虛擬機來部署應用有什麼區別?
如上所述,部署過程理念是類似的,但容器啟動快、擴展性好、更適合構建微服務架構的應用。
- docker-machine工具是不是把整個過程搬到虛擬機里來操作了?
docker-machine是容器部署工具,部署在虛擬機和裸機上都可以。
- 開發用docker
- 測試用docker
- 部署也用docker
環境一致,在個人電腦上即可擁有線上環境,不需要等上線再發現有環境造成的問題。
你可以把這個類比成你的開發環境,把需要的工具鏈打包好,放進docker,直接使用;相比以前,每次開發和發布都要安裝一堆環境,現在你只需要一個docker,當然這個開發環境要穩定,如果面臨過多升級,這不是最佳方案。。一直在研究。。至於教程,官方文檔推薦
推薦閱讀: