前言
Docker 是一個(gè)
開(kāi)源的應(yīng)用容器引擎
,讓開(kāi)發(fā)者可以打包他們的應(yīng)用以及依賴(lài)包到一個(gè)可移植的容器中,然后發(fā)布到任何流行的Linux或Windows
操作系統(tǒng)的機(jī)器上,也可以實(shí)現(xiàn)虛擬化,容器是完全使用沙箱機(jī)制,相互之間不會(huì)有任何接口。
??作者簡(jiǎn)介:熱愛(ài)跑步的恒川,致力于C/C++、Java、Python等多編程語(yǔ)言,熱愛(ài)跑步,喜愛(ài)音樂(lè)的一位博主。
??本文收錄于恒川的日常匯報(bào)系列,大家有興趣的可以看一看
??相關(guān)專(zhuān)欄C語(yǔ)言初階、C語(yǔ)言進(jìn)階系列等,大家有興趣的可以看一看
??Python零基礎(chǔ)入門(mén)系列,Java入門(mén)篇系列正在發(fā)展中,喜歡Python、Java的朋友們可以關(guān)注一下哦!
簡(jiǎn)介
Docker
是一個(gè)開(kāi)源的應(yīng)用容器引擎,讓開(kāi)發(fā)者可以打包他們的應(yīng)用以及依賴(lài)包到一個(gè)可移植的容器中,然后發(fā)布到任何流行的Linux
或Windows
操作系統(tǒng)的機(jī)器上,也可以實(shí)現(xiàn)虛擬化,容器是完全使用沙箱機(jī)制,相互之間不會(huì)有任何接口。
一個(gè)完整的Docker有以下幾個(gè)部分組成:
- DockerClient客戶端
- Docker Daemon守護(hù)進(jìn)程
- Docker Image鏡像
- DockerContainer容器
Docker起源
Docker 是 PaaS
提供商 dotCloud
開(kāi)源的一個(gè)基于 LXC 的高級(jí)容器引擎,源代碼托管在 Github 上, 基于go語(yǔ)言并遵從Apache2.0協(xié)議開(kāi)源。
Docker自2013年以來(lái)非常火熱,無(wú)論是從 github
上的代碼活躍度,還是Redhat在RHEL6.5
中集成對(duì)Docker的支持, 就連 Google 的 Compute Engine
也支持 docker 在其之上運(yùn)行。
一款開(kāi)源軟件能否在商業(yè)上成功,很大程度上依賴(lài)三件事 ——成功的 user case
(用例), 活躍的社區(qū)和一個(gè)好故事。 dotCloud 之家的 PaaS 產(chǎn)品建立在docker之上,長(zhǎng)期維護(hù)且有大量的用戶,社區(qū)也十分活躍,接下看看docker的故事。
- 環(huán)境管理復(fù)雜 - 從各種OS到各種中間件到各種app, 一款產(chǎn)品能夠成功作為開(kāi)發(fā)者需要關(guān)心的東西太多,且難于管理,這個(gè)問(wèn)題幾乎在所有現(xiàn)代IT相關(guān)行業(yè)都需要面對(duì)。
- 云計(jì)算時(shí)代的到來(lái) -
AWS
的成功, 引導(dǎo)開(kāi)發(fā)者將應(yīng)用轉(zhuǎn)移到 cloud 上, 解決了硬件管理的問(wèn)題,然而中間件相關(guān)的問(wèn)題依然存在 (所以openstack HEAT
和AWS cloudformation
都著力解決這個(gè)問(wèn)題)。開(kāi)發(fā)者思路變化提供了可能性。 - 虛擬化手段的變化 - cloud 時(shí)代采用標(biāo)配硬件來(lái)降低成本,采用虛擬化手段來(lái)滿足用戶按需使用的需求以及保證可用性和隔離性。然而無(wú)論是KVM還是Xen在 docker 看來(lái),都在浪費(fèi)資源,因?yàn)橛脩粜枰氖歉咝н\(yùn)行環(huán)境而非OS, GuestOS既浪費(fèi)資源又難于管理, 更加輕量級(jí)的LXC更加靈活和快速
- LXC的移動(dòng)性 - LXC在 linux 2.6 的 kernel 里就已經(jīng)存在了,但是其設(shè)計(jì)之初并非為云計(jì)算考慮的,缺少標(biāo)準(zhǔn)化的描述手段和容器的可遷移性,決定其構(gòu)建出的環(huán)境難于遷移和標(biāo)準(zhǔn)化管理(相對(duì)于KVM之類(lèi)
image
和snapshot
的概念)。docker 就在這個(gè)問(wèn)題上做出實(shí)質(zhì)性的革新。這是docker最獨(dú)特的地方。
面對(duì)上述幾個(gè)問(wèn)題,docker設(shè)想是交付運(yùn)行環(huán)境如同海運(yùn),OS如同一個(gè)貨輪,每一個(gè)在OS基礎(chǔ)上的軟件都如同一個(gè)集裝箱,用戶可以通過(guò)標(biāo)準(zhǔn)化手段自由組裝運(yùn)行環(huán)境,同時(shí)集裝箱的內(nèi)容可以由用戶自定義,也可以由專(zhuān)業(yè)人員制造。這樣,交付一個(gè)軟件,就是一系列標(biāo)準(zhǔn)化組件的集合的交付,如同樂(lè)高積木,用戶只需要選擇合適的積木組合,并且在最頂端署上自己的名字(最后一個(gè)標(biāo)準(zhǔn)化組件是用戶的app)。這也就是基于docker的PaaS產(chǎn)品的原型。
Docker 架構(gòu)
Docker 使用客戶端-服務(wù)器 (C/S) 架構(gòu)模式,使用遠(yuǎn)程API來(lái)管理和創(chuàng)建Docker容器。Docker 容器通過(guò) Docker鏡像來(lái)創(chuàng)建。容器與鏡像的關(guān)系類(lèi)似于面向?qū)ο缶幊讨械膶?duì)象與類(lèi)。
Docker | 面向?qū)ο?/th> |
---|---|
容器 | 對(duì)象 |
鏡像 | 類(lèi) |
Docker采用 C/S架構(gòu) Docker daemon 作為服務(wù)端接受來(lái)自客戶的請(qǐng)求,并處理這些請(qǐng)求(創(chuàng)建、運(yùn)行、分發(fā)容器)。 客戶端和服務(wù)端既可以運(yùn)行在一個(gè)機(jī)器上,也可通過(guò) socket 或者RESTful API 來(lái)進(jìn)行通信。
Docker daemon 一般在宿主主機(jī)后臺(tái)運(yùn)行,等待接收來(lái)自客戶端的消息。 Docker 客戶端則為用戶提供一系列可執(zhí)行命令,用戶用這些命令實(shí)現(xiàn)跟 Docker daemon 交互。
Docker特性
在docker的網(wǎng)站上提到了docker的典型場(chǎng)景:
- Automating the packaging and deployment of applications(使應(yīng)用的打包與部署自動(dòng)化)
- Creation of lightweight, private PAAS environments(創(chuàng)建輕量、私密的PAAS環(huán)境)
- Automated testing and continuous integration/deployment(實(shí)現(xiàn)自動(dòng)化測(cè)試和持續(xù)的集成/部署)
- Deploying and scaling web apps, databases and backend services(部署與擴(kuò)展webapp、數(shù)據(jù)庫(kù)和后臺(tái)服務(wù))
由于其基于LXC的輕量級(jí)虛擬化的特點(diǎn),docker相比KVM之類(lèi)最明顯的特點(diǎn)就是啟動(dòng)快,資源占用小。因此對(duì)于構(gòu)建隔離的標(biāo)準(zhǔn)化的運(yùn)行環(huán)境,輕量級(jí)的PaaS(如dokku), 構(gòu)建自動(dòng)化測(cè)試和持續(xù)集成環(huán)境,以及一切可以橫向擴(kuò)展的應(yīng)用(尤其是需要快速啟停來(lái)應(yīng)對(duì)峰谷的web應(yīng)用)。
- 構(gòu)建標(biāo)準(zhǔn)化的運(yùn)行環(huán)境,現(xiàn)有的方案大多是在一個(gè)baseOS上運(yùn)行一套puppet/chef,或者一個(gè)image文件,其缺點(diǎn)是前者需要base OS許多前提條件,后者幾乎不可以修改(因?yàn)閏opy on write 的文件格式在運(yùn)行時(shí)rootfs是read only的)。并且后者文件體積大,環(huán)境管理和版本控制本身也是一個(gè)問(wèn)題。
- PaaS環(huán)境是不言而喻的,其設(shè)計(jì)之初和dotcloud的案例都是將其作為PaaS產(chǎn)品的環(huán)境基礎(chǔ)
- 因?yàn)槠錁?biāo)準(zhǔn)化構(gòu)建方法(buildfile)和良好的REST API,自動(dòng)化測(cè)試和持續(xù)集成/部署能夠很好的集成進(jìn)來(lái)
- 因?yàn)長(zhǎng)XC輕量級(jí)的特點(diǎn),其啟動(dòng)快,而且docker能夠只加載每個(gè)container變化的部分,這樣資源占用小,能夠在單機(jī)環(huán)境下與KVM之類(lèi)的虛擬化方案相比能夠更加快速和占用更少資源
Docker局限
Docker并不是全能的,設(shè)計(jì)之初也不是KVM之類(lèi)虛擬化手段的替代品,簡(jiǎn)單總結(jié)幾點(diǎn):
- Docker是基于Linux 64bit的,無(wú)法在32bit的
linux/Windows/unix
環(huán)境下使用 - LXC是基于cgroup等linux kernel功能的,因此
container
的guest系統(tǒng)只能是linux base的 - 隔離性相比KVM之類(lèi)的虛擬化方案還是有些欠缺,所有container公用一部分的運(yùn)行庫(kù)
- 網(wǎng)絡(luò)管理相對(duì)簡(jiǎn)單,主要是基于namespace隔離
- cgroup的cpu和cpuset提供的cpu功能相比KVM的等虛擬化方案相比難以度量(所以dotcloud主要是按內(nèi)存收費(fèi))
- Docker對(duì)disk的管理比較有限
- container隨著用戶進(jìn)程的停止而銷(xiāo)毀,
container
中的log等用戶數(shù)據(jù)不便收集
Docker組成
- Docker主機(jī)(Host): 一個(gè)物理機(jī)或虛擬機(jī), 用于運(yùn)行Docker服務(wù)進(jìn)程和容器, 也成為宿主機(jī), node節(jié)點(diǎn)
- Docker服務(wù)器端(Server): Docker守護(hù)進(jìn)程, 運(yùn)行Docker容器
- Docker客戶端(Client): 客戶端使用docker命令或其他工具調(diào)用docker API
- Docker倉(cāng)庫(kù)(Registry): 保存鏡像的倉(cāng)庫(kù), 官方倉(cāng)庫(kù):hub.docker.com, 可以搭建私有倉(cāng)庫(kù)harbor
- Docker鏡像(Images): 鏡像可以理解為創(chuàng)建實(shí)例使用的模本, 相當(dāng)于RPM或者DEB包
- Docker容器(Container): 容器是從鏡像生成對(duì)外提供服務(wù)的一個(gè)或一組服務(wù), 相當(dāng)于RPM包中的程序運(yùn)行起來(lái)
Docker原理
Docker核心解決的問(wèn)題是利用LXC來(lái)實(shí)現(xiàn)類(lèi)似VM的功能,從而利用更加節(jié)省的硬件資源提供給用戶更多的計(jì)算資源。同VM的方式不同, LXC 其并不是一套硬件虛擬化方法 - 無(wú)法歸屬到全虛擬化、部分虛擬化和半虛擬化中的任意一個(gè),而是一個(gè)操作系統(tǒng)級(jí)虛擬化方法, 理解起來(lái)可能并不像VM那樣直觀。所以可以從虛擬化到docker要解決的問(wèn)題出發(fā),看看docker是怎么滿足用戶虛擬化需求的。
用戶需要考慮虛擬化方法,尤其是硬件虛擬化方法,需要借助其解決的主要是以下4個(gè)問(wèn)題:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-461816.html
- 隔離性 - 每個(gè)用戶實(shí)例之間相互隔離, 互不影響。 硬件虛擬化方法給出的方法是VM, LXC給出的方法是container,更細(xì)一點(diǎn)是kernel namespace
- 可配額/可度量 - 每個(gè)用戶實(shí)例可以按需提供其計(jì)算資源,所使用的資源可以被計(jì)量。硬件虛擬化方法因?yàn)樘摂M了CPU, memory可以方便實(shí)現(xiàn), LXC則主要是利用cgroups來(lái)控制資源
- 移動(dòng)性 - 用戶的實(shí)例可以很方便地復(fù)制、移動(dòng)和重建。硬件虛擬化方法提供snapshot和image來(lái)實(shí)現(xiàn),docker(主要)利用AUFS實(shí)現(xiàn)
- 安全性 - 這個(gè)話題比較大,這里強(qiáng)調(diào)是host主機(jī)的角度盡量保護(hù)container。硬件虛擬化的方法因?yàn)樘摂M化的水平比較高,用戶進(jìn)程都是在KVM等虛擬機(jī)容器中翻譯運(yùn)行的, 然而對(duì)于LXC, 用戶的進(jìn)程是lxc-start進(jìn)程的子進(jìn)程, 只是在Kernel的namespace中隔離的, 因此需要一些kernel的patch來(lái)保證用戶的運(yùn)行環(huán)境不會(huì)受到來(lái)自host主機(jī)的惡意入侵, dotcloud(主要是)利用kernel grsec patch解決的.
如果這份博客對(duì)大家有幫助,希望各位給恒川一個(gè)免費(fèi)的點(diǎn)贊??作為鼓勵(lì),并評(píng)論收藏一下?,謝謝大家?。。?br> 制作不易,如果大家有什么疑問(wèn)或給恒川的意見(jiàn),歡迎評(píng)論區(qū)留言。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-461816.html
到了這里,關(guān)于【Docker】Docker最近這么火,它到底是什么的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!