一. 為什么會(huì)出現(xiàn)docker?
不用說, 肯定是時(shí)代進(jìn)步的產(chǎn)物. 那么, 他為什么能火? 一定是解決了痛點(diǎn)問題. docker也不是一下子就火起來了, 他的火也是有一個(gè)過程的, 我們先來看看為什么會(huì)出現(xiàn)docker, 他解決了什么樣的問題.
第一種情況: 解決環(huán)境不一致的問題
通常, 程序員開發(fā)的時(shí)候是在開發(fā)環(huán)境, 提測階段部署到測試環(huán)境. 那么常常會(huì)遇到一個(gè)現(xiàn)象, 在開發(fā)環(huán)境運(yùn)行的好好的, 怎么一部署到測試環(huán)境就有問題了呢? 開始各種排查, 最后發(fā)現(xiàn), 可能是機(jī)器配置不一樣, 導(dǎo)致tomcat啟動(dòng)超時(shí)等等等. 這種問題必須排查, 但是特別耗時(shí), 仔細(xì)想想, 并不是特別需要. 如果能避免, 也給開發(fā)和運(yùn)維節(jié)省了不少時(shí)間.
第二種情況: 解決集群環(huán)境, 服務(wù)器繁多復(fù)雜的問題
通常我們會(huì)有三套環(huán)境, 開發(fā)環(huán)境, 測試環(huán)境,線上環(huán)境. 每一套環(huán)境都是一個(gè)集群.
一個(gè)集群里, 各種各樣的軟件, jdk, nginx, mysql, mongodb, redis......有很多. 以前運(yùn)維老師是怎么干的? 搭建一個(gè)新的環(huán)境, 一臺(tái)服務(wù)器一臺(tái)服務(wù)器的安裝. 像mysql還有配置環(huán)境, 一個(gè)服務(wù)器一個(gè)服務(wù)器的配置, 累得半死.
這種重復(fù)造輪子的工作, 在java代碼中是盡量避免的. 那么在運(yùn)維環(huán)境是否也可以避免呢? 有想法,那么就會(huì)有實(shí)踐. docker的實(shí)用場景之一就是一次部署, 到處使用
怎么個(gè)到處實(shí)用法呢? 舉個(gè)例子
搬家, 我們以前搬家都是怎么搬的? 我要從A地搬到B地了. 雇一個(gè)搬家公司, 把家里的家具全部都搬走, 搬到另一個(gè)地方, 一團(tuán)亂, 然后慢慢收拾
如果很牛逼的話, 找一個(gè)省事的辦法. 我直接吧A地的房子咔嚓, 直接把房子搬到B地. 房子里的東西原來放哪里,現(xiàn)在還放哪里. 這是不是就省了不少的事.
從搬家--->搬房子, 不得不說是一個(gè)思想的進(jìn)步.
對運(yùn)維來說,也是如此, 如果能夠?qū)h(huán)境一起打包, 然后在各個(gè)機(jī)器上一鍵安裝, 的確可以節(jié)省不少時(shí)間.
二. docker的理念
docker的思想來源于集裝箱. 原來我們在項(xiàng)目中, 如果想要有一個(gè)通用的模塊給到其他各個(gè)服務(wù)使用, 我們可以打成jar包, 但打jar存在的問題是什么? jar包沖突, 第一個(gè)jar引入了一個(gè)依賴, 第二個(gè)jar包也引入了這個(gè)依賴, 他們的版本還不相同, 就會(huì)有沖突. 因?yàn)閖ar包和jar包之前是相互交叉的.
docker剛好相反, docker是隔離的, 隔離是docker的核心. 隔離就可以理解為集裝箱的打包裝箱. 每一個(gè)箱子都是互相隔離的. 使用docker, 我們就不用擔(dān)心沖突問題了, 也不用擔(dān)心環(huán)境問題了. 我們可以直接通過docker來進(jìn)行部署.
有了隔離機(jī)制, 如果一個(gè)出了問題, 不會(huì)影響其他的. 另一個(gè)好處就是, 可以將服務(wù)器壓榨到極致. 我們平時(shí)跑項(xiàng)目的時(shí)候, 要啟動(dòng)mysql, redis, tomcat等全部跑起來很浪費(fèi)內(nèi)存空間. 而docker由于相互之間是隔離的, 那么可以利用起來很小的空間, 將服務(wù)器壓榨到極致.
docker還有一個(gè)好處, 就是將內(nèi)存空間壓榨到極致.
docker是基于go語言實(shí)現(xiàn)的云開源項(xiàng)目
docker的主要目標(biāo)是: "Build, ship and Run Any App, Anywhere", 即: 構(gòu)建,分發(fā),部署,運(yùn)行等, 一次操作, 在各個(gè)app,各個(gè)地方都可以運(yùn)行. 做到:"一次封裝, 到處運(yùn)行"
匯總一句話: 解決了運(yùn)行環(huán)境和配置問題軟件容器, 方便做持續(xù)集成并有助于整體發(fā)布的容器虛擬化技術(shù).
三. docker的歷史
1. 2010年, 幾個(gè)年輕的美國人成立了一家公司叫做dotCloud,這家公司主要做pass云計(jì)算服務(wù),其底層技術(shù)上,dotCloud 平臺(tái)利用了 Linux 容器技術(shù),他們將自己的的技術(shù)命名為docker.
2. docker剛誕生的時(shí)候, 并沒有引起行業(yè)的注意, dotCloud公司越來越難, 經(jīng)濟(jì)效益也不景氣, 后來就要活不下去了, 他們有強(qiáng)烈的愿望, 希望能活下去. 于是, 想了一個(gè)辦法, 將docker開源.
3. 2013年, docker開源了. 并且他們也將公司正式改名為Docker. docker受到越來越多的人關(guān)注. 漸漸的docker就火了. 火了以后, docker每個(gè)月就會(huì)更新一個(gè)版本. 2014年.4.9 docker1.0發(fā)布.
從這里, 我們可以學(xué)到什么?
沒有誰的成功是一帆風(fēng)順的, 如果不是因?yàn)閐otCloud公司效益不景氣, 如果不是大家齊心協(xié)力想要活下去, 可能docker會(huì)更晚和我們見面. 遇到問題, 沒關(guān)系, 一定要想辦法克服困難, 克服了的困難就不是困難了.
四. docker和虛擬機(jī)的區(qū)別
虛擬機(jī): 在windows中安裝一個(gè)vmware, 通過這個(gè)軟件我們可以虛擬查來一臺(tái)或者多臺(tái)電腦,
虛擬機(jī)屬于虛擬化技術(shù), docker容器是一種容器技術(shù), 他也是一種虛擬化技術(shù).
對虛擬機(jī)而言, 我們需要關(guān)注軟件和硬件, 而docker容器,我們更多的是關(guān)注其軟件.
舉例: 在vm上安裝linux centos原生鏡像, 這就是安裝一個(gè)獨(dú)立的電腦, 好處是和其他主機(jī)/虛擬機(jī)相互隔離.
在docker上也可以安裝linux鏡像, 這個(gè)鏡像和vm上安裝的鏡像是不一樣的. 在docker上安裝的鏡像通常只有4M, 就夠了, 這里只需要安裝linux centos的核心, 它的核心就是一些操作命令+開機(jī)啟動(dòng)等. docker上的鏡像是十分小巧的.
docker的一個(gè)最大的優(yōu)勢就是, 輕量, 小巧!
要了解docker和虛擬機(jī)的區(qū)別. 我們首先要知道虛擬機(jī)是什么原理, docker是怎么個(gè)原理,然后對比二者的異同~
4.1 虛擬機(jī)
我們基本都使用過虛擬機(jī), 常用的虛擬機(jī)是Vmware. 為什么會(huì)使用虛擬機(jī)呢? 通常我使用的是windows電腦, 我想要模擬一臺(tái)linux服務(wù)器, 方便部署應(yīng)用. 或者我現(xiàn)在使用的mac, 但是很多應(yīng)用都習(xí)慣了使用windows, 所以 在mac上安裝了一臺(tái)虛擬機(jī), 這樣, 想用mac就用mac, 想用windows就可以用windows了.
基礎(chǔ)設(shè)施(Infrastructure)。它可以是你的個(gè)人電腦,數(shù)據(jù)中心的服務(wù)器,或者是云主機(jī)。
主操作系統(tǒng)(Host Operating System)。你的個(gè)人電腦之上,運(yùn)行的可能是MacOS,Windows或者某個(gè)Linux發(fā)行版。
虛擬機(jī)管理系統(tǒng)(Hypervisor)。利用Hypervisor,可以在主操作系統(tǒng)之上運(yùn)行多個(gè)不同的操作系統(tǒng)。類型1的Hypervisor有支持MacOS的HyperKit,支持Windows的Hyper-V以及支持Linux的KVM。類型2的Hypervisor有VirtualBox和VMWare。
子操作系統(tǒng)(Guest Operating System)。假設(shè)你需要運(yùn)行3個(gè)相互隔離的應(yīng)用,則需要使用Hypervisor啟動(dòng)3個(gè)子操作系統(tǒng),也就是3個(gè)虛擬機(jī)。這些虛擬機(jī)都非常大,也許有700MB,這就意味著它們將占用2.1GB的磁盤空間。更糟糕的是,它們還會(huì)消耗很多CPU和內(nèi)存.
上面是從虛擬機(jī)和主機(jī)之間的角度來分析了解虛擬機(jī)是如何搭建的, 通過上圖, 我們可以看出, 一臺(tái)主機(jī)上可以安裝一個(gè)或者多個(gè)虛擬機(jī), 但是每個(gè)虛擬機(jī)都比較耗費(fèi)資源. 為什么會(huì)耗費(fèi)很多的資源呢, 我們再從虛擬機(jī)自己的結(jié)構(gòu)來說明, 如下圖:
我們知道, 虛擬機(jī)就是虛擬的和主機(jī)一樣功能的機(jī)器, 所以主機(jī)需要什么, 虛擬機(jī)也需要什么.
1. 首先要有內(nèi)核, 一臺(tái)服務(wù)器, 它的內(nèi)核是很小的.
2. 各種lib庫, 每一個(gè)虛擬機(jī)都擁有自己的lib庫,
3. 然后,我們可以在虛擬機(jī)上安裝各種應(yīng)用. 這些應(yīng)用依賴于lib庫. 由于共享同一份lib庫, 那么就可能會(huì)出現(xiàn)沖突問題, 比如端口, 一個(gè)端口只能被一個(gè)應(yīng)用使用.
我們每次創(chuàng)建一臺(tái)虛擬機(jī), 都要為其分配內(nèi)核, 各種lib庫. 并且每次創(chuàng)建都要重復(fù)創(chuàng)建這些東西. 這樣耗費(fèi)資源就會(huì)很多, 冗余步驟很多, 由于本身又比較笨重, 啟動(dòng)速度會(huì)比較慢.
4.2 docker
基礎(chǔ)設(shè)施(Infrastructure)。它可以是你的個(gè)人電腦,數(shù)據(jù)中心的服務(wù)器,或者是云主機(jī)。
主操作系統(tǒng)(Host Operating System)。所有主流的Linux發(fā)行版都可以運(yùn)行Docker。對于MacOS和Windows,也可以運(yùn)行Docker。
Docker守護(hù)進(jìn)程(Docker Daemon) 。Docker守護(hù)進(jìn)程取代了Hypervisor,它是運(yùn)行在操作系統(tǒng)之上的后臺(tái)進(jìn)程,負(fù)責(zé)管理Docker容器。
各種依賴。對于Docker,應(yīng)用的所有依賴都打包在Docker鏡像中,Docker容器是基于Docker鏡像創(chuàng)建的。
應(yīng)用。應(yīng)用的源代碼與它的依賴都打包在Docker鏡像中,不同的應(yīng)用需要不同的Docker鏡像。不同的應(yīng)用運(yùn)行在不同的Docker容器中,它們是相互隔離的。
以上是從一臺(tái)主機(jī)的角度來分析docker, 下面從docker容器的角度來看看:
我們的計(jì)算機(jī)是有一個(gè)Kernel內(nèi)核, 容器共享了主機(jī)的內(nèi)核, 在內(nèi)核上運(yùn)行很多個(gè)容器, 每個(gè)容器有自己的lib庫, 容器和容器之間是相互隔離的, 就算容器A和容器B都可以使用8080端口. 和虛擬機(jī)相比, 我們發(fā)現(xiàn)容器比虛擬機(jī)輕量了很多很多. 少了內(nèi)核, 少了硬件, 只有必須的lib庫.
4.3 兩者的區(qū)別
虛擬機(jī)技術(shù)的缺點(diǎn):
資源占用十分多
用于步驟很多
啟動(dòng)速度慢
docker與虛擬機(jī)的不同
傳統(tǒng)虛擬機(jī), 虛擬出一條硬件,運(yùn)行完整的操作系統(tǒng), 然后在這個(gè)操作系統(tǒng)上安裝和運(yùn)行軟件
容器內(nèi)的應(yīng)用直接安裝在主機(jī)的內(nèi)核上, 容器沒有自己的內(nèi)核, 也沒有虛擬的硬件, 所以就輕便了.由于沒有臃腫的子操作系統(tǒng),Docker可以節(jié)省大量的磁盤空間以及其他系統(tǒng)資源。
每個(gè)容器間是相互隔離的, 每個(gè)容器都有自己的文件系統(tǒng), 互不影響.
容器的啟動(dòng)速度很快, 一般在幾毫秒~幾十毫秒
Docker有很多優(yōu)勢,但是也不能替代虛擬機(jī)技術(shù),因?yàn)閮烧哂胁煌氖褂脠鼍啊?/p>
虛擬機(jī)更擅長于徹底隔離整個(gè)運(yùn)行環(huán)境.例如,云服務(wù)提供商通常采用虛擬機(jī)技術(shù)隔離不同的用戶。Docker通常用于隔離不同的應(yīng)用,例如前端,后端以及數(shù)據(jù)庫。
容器和虛擬機(jī)都可以獲取整個(gè)網(wǎng)絡(luò)鏈接。
容器運(yùn)行的是不完整的操作系統(tǒng)(盡管它們可以),虛擬機(jī)必須運(yùn)行完整的。
容器和虛擬機(jī)相比, 可以更多的利用起來小塊的閑置資源,它們不運(yùn)行完整的操作系統(tǒng)。
容器需要毫秒分配,虛擬機(jī)需要幾分鐘。所以,你可以另配、重新平衡、釋放以及使用容器比虛擬機(jī)的迭代更加迅速。
離目標(biāo)進(jìn)程越遠(yuǎn),隔離會(huì)變得更昂貴。虛擬機(jī)是偉大的,它通過抽象來增加并行,服務(wù)于多操作系統(tǒng)的使用情況以及業(yè)界最好的安全性。但對于隔離,它們相當(dāng)?shù)陌嘿F,容器提供的隔離就便宜。
我們需要根據(jù)不同的應(yīng)用場景和需求采用不同的方式使用Docker技術(shù)或使用服務(wù)器虛擬化技術(shù)。例如一個(gè)典型的Docker應(yīng)用場景是當(dāng)主機(jī)上的Docker實(shí)例屬于單一用戶的情況下,在保證安全的同時(shí)可以充分發(fā)揮Docker的技術(shù)優(yōu)勢。對于隔離要求較高的環(huán)境如混合用戶環(huán)境,就可以使用服務(wù)器虛擬化技術(shù)。
五. 容器在DevOps(開發(fā),運(yùn)維)中的作用
應(yīng)用更快速的交付和部署
傳統(tǒng): 每臺(tái)服務(wù)器要安裝哪些應(yīng)用, 配置哪些環(huán)境變量, 安裝順序, 都會(huì)一一記錄到幫助文檔
docker: 打包鏡像, 一鍵運(yùn)行.
更便捷的升級(jí)和擴(kuò)縮容
傳統(tǒng): 需要安裝軟件, 部署, 重復(fù)工作
docker: 部署應(yīng)用就像搭積木, 項(xiàng)目打包為一個(gè)鏡像, 擴(kuò)展服務(wù)器非常方便.
更簡單的系統(tǒng)運(yùn)維
在容易化部署之后, 我們的開發(fā), 測試環(huán)境都是高度一致的, 不會(huì)出現(xiàn)在開發(fā)耗時(shí), 部署到測試,線上不好使的情況
更高效的利用計(jì)算機(jī)資源
docker是內(nèi)核級(jí)別的虛擬化, 可以在一個(gè)物理機(jī)上運(yùn)行很多個(gè)容器實(shí)例, 服務(wù)器的性能可以被壓榨到極致.
通常, 一臺(tái)主機(jī)只能同時(shí)運(yùn)行2-3個(gè)虛擬機(jī), 但是可以同時(shí)運(yùn)行20-30個(gè)容器
六. 我們來看一下各大佬公司是如何使用docker的1. 新浪微博
這里注意一個(gè)重點(diǎn):docker使大規(guī)模動(dòng)態(tài)調(diào)度成為可能, 因?yàn)樗梢詮椥缘臄U(kuò)縮容
2. 美團(tuán)
3.蘑菇街
聯(lián)系客服