什么是docker
Docker 是一個(gè)開源的應(yīng)用容器引擎与帆,讓開發(fā)者可以打包他們的應(yīng)用以及依賴包到一個(gè)可移植的容器中了赌,然后發(fā)布到任何流行的 Linux 機(jī)器上,也可以實(shí)現(xiàn)虛擬化玄糟。容器是完全使用沙箱機(jī)制勿她,相互之間不會(huì)有任何接口。
Docker 最初是 dotCloud 公司創(chuàng)始人 Solomon Hykes 在法國期間發(fā)起的一個(gè)公司內(nèi)部項(xiàng)目阵翎,它是基于 dotCloud 公司多年云服務(wù)技術(shù)的一次革新逢并,并于 2013 年 3 月以 Apache 2.0 授權(quán)協(xié)議開源之剧,主要項(xiàng)目代碼在 GitHub 上進(jìn)行維護(hù)。Docker 項(xiàng)目后來還加入了 Linux 基金會(huì)砍聊,并成立推動(dòng) 開放容器聯(lián)盟背稼。
Docker 自開源后受到廣泛的關(guān)注和討論,至今其 GitHub 項(xiàng)目已經(jīng)超過 3 萬 6 千個(gè)星標(biāo)和一萬多個(gè) fork辩恼。甚至由于 Docker 項(xiàng)目的火爆雇庙,在 2013 年底,dotCloud 公司決定改名為 Docker灶伊。Docker 最初是在 Ubuntu 12.04 上開發(fā)實(shí)現(xiàn)的疆前;Red Hat 則從 RHEL 6.5 開始對 Docker 進(jìn)行支持;Google 也在其 PaaS 產(chǎn)品中廣泛應(yīng)用 Docker聘萨。
Docker 使用 Google 公司推出的 Go 語言 進(jìn)行開發(fā)實(shí)現(xiàn)竹椒,基于 Linux 內(nèi)核的 cgroup,namespace米辐,以及 AUFS 類的 Union FS 等技術(shù)胸完,對進(jìn)程進(jìn)行封裝隔離,屬于 操作系統(tǒng)層面的虛擬化技術(shù)翘贮。由于隔離的進(jìn)程獨(dú)立于宿主和其它的隔離的進(jìn)程赊窥,因此也稱其為容器。最初實(shí)現(xiàn)是基于 LXC狸页,從 0.7 以后開始去除 LXC锨能,轉(zhuǎn)而使用自行開發(fā)的 libcontainer,從 1.11 開始芍耘,則進(jìn)一步演進(jìn)為使用 runC 和 containerd址遇。
Docker 在容器的基礎(chǔ)上绞愚,進(jìn)行了進(jìn)一步的封裝啄巧,從文件系統(tǒng)卢厂、網(wǎng)絡(luò)互聯(lián)到進(jìn)程隔離等等誓军,極大的簡化了容器的創(chuàng)建和維護(hù)辙谜。使得 Docker 技術(shù)比虛擬機(jī)技術(shù)更為輕便郭脂、快捷零渐。
下面的圖片比較了 Docker 和傳統(tǒng)虛擬化方式的不同之處娄涩。傳統(tǒng)虛擬機(jī)技術(shù)是虛擬出一套硬件后鳄袍,在其上運(yùn)行一個(gè)完整操作系統(tǒng)乒省,在該系統(tǒng)上再運(yùn)行所需應(yīng)用進(jìn)程;而容器內(nèi)的應(yīng)用進(jìn)程直接運(yùn)行于宿主的內(nèi)核畦木,容器內(nèi)沒有自己的內(nèi)核袖扛,而且也沒有進(jìn)行硬件虛擬。因此容器要比傳統(tǒng)虛擬機(jī)更為輕便。
為什么要用docker
作為一種新興的虛擬化方式蛆封,Docker 跟傳統(tǒng)的虛擬化方式相比具有眾多的優(yōu)勢唇礁。
更高效的利用系統(tǒng)資源
由于容器不需要進(jìn)行硬件虛擬以及運(yùn)行完整操作系統(tǒng)等額外開銷,Docker 對系統(tǒng)資源的利用率更高惨篱。無論是應(yīng)用執(zhí)行速度盏筐、內(nèi)存損耗或者文件存儲(chǔ)速度,都要比傳統(tǒng)虛擬機(jī)技術(shù)更高效砸讳。因此琢融,相比虛擬機(jī)技術(shù),一個(gè)相同配置的主機(jī)簿寂,往往可以運(yùn)行更多數(shù)量的應(yīng)用漾抬。
更快速的啟動(dòng)時(shí)間
傳統(tǒng)的虛擬機(jī)技術(shù)啟動(dòng)應(yīng)用服務(wù)往往需要數(shù)分鐘,而 Docker 容器應(yīng)用常遂,由于直接運(yùn)行于宿主內(nèi)核纳令,無需啟動(dòng)完整的操作系統(tǒng),因此可以做到秒級克胳、甚至毫秒級的啟動(dòng)時(shí)間平绩。大大的節(jié)約了開發(fā)、測試漠另、部署的時(shí)間捏雌。
一致的運(yùn)行環(huán)境
開發(fā)過程中一個(gè)常見的問題是環(huán)境一致性問題。由于開發(fā)環(huán)境笆搓、測試環(huán)境性湿、生產(chǎn)環(huán)境不一致,導(dǎo)致有些 bug 并未在開發(fā)過程中被發(fā)現(xiàn)砚作。而 Docker 的鏡像提供了除內(nèi)核外完整的運(yùn)行時(shí)環(huán)境,確保了應(yīng)用運(yùn)行環(huán)境一致性嘹锁,從而不會(huì)再出現(xiàn) 「這段代碼在我機(jī)器上沒問題啊」 這類問題葫录。
持續(xù)交付和部署
對開發(fā)和運(yùn)維(DevOps)人員來說,最希望的就是一次創(chuàng)建或配置领猾,可以在任意地方正常運(yùn)行米同。
使用 Docker 可以通過定制應(yīng)用鏡像來實(shí)現(xiàn)持續(xù)集成、持續(xù)交付摔竿、部署面粮。開發(fā)人員可以通過 Dockerfile 來進(jìn)行鏡像構(gòu)建,并結(jié)合 持續(xù)集成(Continuous Integration) 系統(tǒng)進(jìn)行集成測試继低,而運(yùn)維人員則可以直接在生產(chǎn)環(huán)境中快速部署該鏡像熬苍,甚至結(jié)合 持續(xù)部署(Continuous Delivery/Deployment) 系統(tǒng)進(jìn)行自動(dòng)部署。
而且使用 Dockerfile 使鏡像構(gòu)建透明化,不僅僅開發(fā)團(tuán)隊(duì)可以理解應(yīng)用運(yùn)行環(huán)境柴底,也方便運(yùn)維團(tuán)隊(duì)理解應(yīng)用運(yùn)行所需條件婿脸,幫助更好的生產(chǎn)環(huán)境中部署該鏡像。
更輕松的遷移
由于 Docker 確保了執(zhí)行環(huán)境的一致性柄驻,使得應(yīng)用的遷移更加容易狐树。Docker 可以在很多平臺(tái)上運(yùn)行,無論是物理機(jī)鸿脓、虛擬機(jī)抑钟、公有云、私有云野哭,甚至是筆記本在塔,其運(yùn)行結(jié)果是一致的。因此用戶可以很輕易的將在一個(gè)平臺(tái)上運(yùn)行的應(yīng)用虐拓,遷移到另一個(gè)平臺(tái)上心俗,而不用擔(dān)心運(yùn)行環(huán)境的變化導(dǎo)致應(yīng)用無法正常運(yùn)行的情況。
更輕松的維護(hù)和擴(kuò)展
Docker 使用的分層存儲(chǔ)以及鏡像的技術(shù)蓉驹,使得應(yīng)用重復(fù)部分的復(fù)用更為容易城榛,也使得應(yīng)用的維護(hù)更新更加簡單,基于基礎(chǔ)鏡像進(jìn)一步擴(kuò)展鏡像也變得非常簡單态兴。此外狠持,Docker 團(tuán)隊(duì)同各個(gè)開源項(xiàng)目團(tuán)隊(duì)一起維護(hù)了一大批高質(zhì)量的官方鏡像,既可以直接在生產(chǎn)環(huán)境使用瞻润,又可以作為基礎(chǔ)進(jìn)一步定制喘垂,大大的降低了應(yīng)用服務(wù)的鏡像制作成本。
對比傳統(tǒng)虛擬機(jī)總結(jié)
特性 | 容器 | 虛擬機(jī) |
---|---|---|
啟動(dòng) | 秒級 | 分鐘級 |
硬盤使用 | 一般為 MB | 一般為 GB |
性能 | 接近原生 | 弱于 |
系統(tǒng)支持量 | 單機(jī)支持上千個(gè)容器 | 一般幾十個(gè) |