【学习笔记】Docker - 01. Docker是啥
我只是把之前的學(xué)習(xí)筆記整理一下,貼到這里,可能會(huì)顯得比較凌亂。。。
1.1?啥是Docker?
?
Docker 是一個(gè)開源項(xiàng)目,它被用來做構(gòu)建、打包和運(yùn)行程序。它是一個(gè)命令行程序,一個(gè)后臺(tái)進(jìn)程,也是一組使用邏輯方法來解決常見軟件問題的遠(yuǎn)程服務(wù),讓你可以簡(jiǎn)化安裝、運(yùn)行、發(fā)布、刪除軟件的體驗(yàn)。它是通過一種叫做容器的操作系統(tǒng)技術(shù)來實(shí)現(xiàn)這些功能的。
?
1.1.1 Hello World
前提條件:安裝Docker,需要互聯(lián)網(wǎng)連接。
命令:?docker run?dockerinaction/hello_world
?
docker?run,它告訴docker你想觸發(fā)這一系列動(dòng)作:在容器內(nèi)安裝和運(yùn)行程序
命令的第二部分指明了你想在容器里運(yùn)行的程序,?本例中就是?dockerinaction/hello_world,?它叫做鏡像?(image)?名?(有時(shí)候也叫做倉庫?repository).?從現(xiàn)在開始,?你就可以把鏡像的名字作為你想安裝或運(yùn)行的程序名.?鏡像本身就是一組文件和元數(shù)據(jù).?其中元數(shù)據(jù)包括了要運(yùn)行的特定程序和相關(guān)配置.
·?????????本例容器運(yùn)行結(jié)果就是輸出一個(gè)“hello world”,?輸出完,?程序就退出了.?這時(shí)容器的狀態(tài)被標(biāo)記為?stopped.
·?????????容器的運(yùn)行狀態(tài)直接和容器內(nèi)的單個(gè)運(yùn)行程序的狀態(tài)是綁定的.?如果一個(gè)程序在運(yùn)行狀態(tài),?那么容器也在運(yùn)行狀態(tài);?如果這個(gè)程序是出于停止?fàn)顟B(tài)的,?那么容器也是停止?fàn)顟B(tài)的.
·?????????重啟容器將會(huì)重新運(yùn)行該程序.
?
當(dāng)你第二次運(yùn)行該命令的時(shí)候:
?
1.1.2?容器
歷史上, UNIX風(fēng)格的操作系統(tǒng)使用jail這個(gè)術(shù)語來描述一個(gè)被修改的運(yùn)行時(shí)環(huán)境,?意思是它會(huì)把jailed的程序可訪問的資源限制在一定范圍之內(nèi).
任何使用Docker運(yùn)行的軟件都是放在容器內(nèi)的. Docker使用現(xiàn)有的容器引擎來提供根據(jù)最佳實(shí)踐來構(gòu)建的一致容器,?這就為每個(gè)人提供了更大的安全保障.
使用Docker,?用戶獲得容器的成本要低得很,?因?yàn)镈ocker會(huì)幫助你處理這一切.
?
1.1.3?容器不是虛擬化
·?????????與虛擬機(jī)不一樣, Docker容器不使用任何的硬件虛擬化.?在Docker容器內(nèi)運(yùn)行的程序直接與主機(jī)的Linux內(nèi)核交互.
o????許多程序是可以獨(dú)立運(yùn)行的,?對(duì)操作系統(tǒng)沒有更多的依賴,?頁不需要忍受整個(gè)啟動(dòng)過程造成的延遲
o????這是一個(gè)非常重要的區(qū)別.
o????Docker不是虛擬化技術(shù).
o????它幫助你使用你操作系統(tǒng)內(nèi)核已經(jīng)存在的容器技術(shù).
·?????????你可以在操作系統(tǒng)為現(xiàn)代Linux的虛擬機(jī)里面使用Docker.
?
1.1.4?容器中運(yùn)行軟件,?為的是隔離性
·?????????Docker?使用?Linux命名空間和cgroups,?cgroups自從2007年開始就成為了Linux?的一部分.
·?????????Docker?本身并不提供容器技術(shù),?但是它使得容器技術(shù)可以更簡(jiǎn)單的使用
·?????????
在這里CLI運(yùn)行在user space內(nèi)存里,?和其它程序一樣,?也是運(yùn)行在操作系統(tǒng)之上.?理想狀態(tài)下,?在user space里運(yùn)行的程序無法修改內(nèi)核空間(kernel space)內(nèi)存.?更廣泛的說,?操作系統(tǒng)是所有用戶程序和支撐計(jì)算機(jī)運(yùn)行的硬件之間的接口.
·?????????
你可以看見,?運(yùn)行Docker其實(shí)意味著在user space?里面運(yùn)行兩個(gè)程序.
o????Docker?引擎,?如果安裝適當(dāng)?shù)脑??這個(gè)進(jìn)行會(huì)一直運(yùn)行的.
o????Docker CLI,?這額是用戶交戶的Docker程序.?如果你想開始,?停止,?或安裝軟件,?你就會(huì)向Docker程序發(fā)送一個(gè)相應(yīng)的命令.
上圖中,?你可以看三個(gè)正在運(yùn)行的程序,?每一個(gè)都是作為Docker引擎的子進(jìn)程運(yùn)行的,?外邊包裹著一個(gè)容器.
o????委托進(jìn)程是運(yùn)行在user space的自己的內(nèi)存子空間里.
o????運(yùn)行在容器內(nèi)的程序至可以訪問它們自己的內(nèi)存和資源,?也就是容器限定的內(nèi)存和資源.
?
·?????????Docker構(gòu)建容器時(shí)(構(gòu)建容器在運(yùn)行時(shí))使用了10個(gè)主要的系統(tǒng)特性:
o????PID namespace—Process identifiers and capabilities
o????UTS namespace—Host and domain name
o????MNT namespace—File system access and structure
o????IPC namespace—Process communication over shared memory
o????NET namespace—Network access and structure
o????USR namespace—User names and identifiers
o????chroot()—Controls the location of the file system root
o????cgroups—Resource protection
o????CAP drop—Operating system feature restrictions
o????Security Modules—Mandatory access controls
1.1.5 Shipping Containers?運(yùn)輸容器
你可以把Docker容器看作物理運(yùn)輸使用的集裝箱一樣.?它就是一個(gè)箱子,?在這里你可以存儲(chǔ)和運(yùn)行應(yīng)用程序及其所有的依賴項(xiàng)(除了運(yùn)行操作系統(tǒng)內(nèi)核這一條).?和起重機(jī),?開車,?火車,?輪船可以很方便的使用集裝箱一樣,?用Docker來運(yùn)行,?復(fù)制,?分發(fā)容器也是非常簡(jiǎn)單的.?而且Docker讓這個(gè)傳統(tǒng)的集裝箱比喻更加完整,?它加入了打包和分發(fā)軟件的方式.?負(fù)責(zé)運(yùn)輸容器的組件就叫做鏡像?image.
?
前面的例子里的鏡像只包含一個(gè)文件,?一個(gè)linux的可執(zhí)行程序.
·?????????而一般來說, Docker鏡像是容器內(nèi)運(yùn)行的程序需要用到的所有文件的一個(gè)捆綁的快照.
·?????????從一個(gè)鏡像,?你可以創(chuàng)建任意個(gè)容器,?這些容器都是從同一個(gè)鏡像作為起點(diǎn)來創(chuàng)建的,?它們并不會(huì)共享對(duì)文件系統(tǒng)的修改.
·?????????當(dāng)你使用Docker分發(fā)軟件的時(shí)候,?你使用這些鏡像來進(jìn)行分發(fā),?其它的計(jì)算機(jī)也是通過這些鏡像來創(chuàng)建容器的.
·?????????鏡像就是Docker生態(tài)里可運(yùn)輸?shù)膯卧?
?
?
1.2 Docker?解決了什么問題?
·?????????使用軟件是一件非常復(fù)雜的事.
o????在安裝軟件前,?你需要考慮使用哪個(gè)操作系統(tǒng),
o????軟件所需的資源,
o????已經(jīng)安裝了哪些軟件,
o????它還依賴于其它哪些軟件.
o????還需要決定軟件應(yīng)該安裝在哪,
o????然后你還需要知道如何去安裝它.
現(xiàn)在各個(gè)軟件的安裝過程差別也非常大,?所以安裝軟件其實(shí)是非常復(fù)雜且沒有一致性的操作.?如果你想讓多臺(tái)電腦在不同時(shí)刻使用相同的一套軟件,?那么情況只會(huì)更加糟糕.
大部分人的電腦都安裝了不只一個(gè)程序,?很多程序還依賴于其它程序.?如果你想要使用的軟件無法和其它軟件很好的一起工作,?那么該怎么辦??災(zāi)難.
·?????????而當(dāng)多個(gè)程序共享依賴項(xiàng)的時(shí)候,?一切只會(huì)變得更加復(fù)雜:
o????如果一個(gè)程序的依賴項(xiàng)需要升級(jí),?而其它程序的這個(gè)依賴項(xiàng)卻不需要升級(jí),?那么會(huì)發(fā)生什么?
o????當(dāng)你移除了一個(gè)程序,?它真的被刪除了嗎?
o????你可以移除老的依賴項(xiàng)嗎?
o????你還記得為了安裝這個(gè)軟件你做的那些修改嗎??現(xiàn)在你想刪除這個(gè)軟件,?這些修改怎么辦?
所以說,?軟件越多,?越難管理.?此外,?還有安全性需要考慮.
這些一切的一切管理起來很難,?并且很浪費(fèi)時(shí)間.
?
1.2.1 Getting Organized
沒有Docker,?你的電腦看起來就像裝滿垃圾的抽屜一樣,?亂七八糟.
?
而使用Docker, Docker會(huì)把一切整理的井然有序,?通過鏡像和容器,?一切都被隔離了.
看起來這里創(chuàng)建了一些多余的依賴項(xiàng),?例如gcc,?所以會(huì)引入一些開銷.?這點(diǎn)以后再解釋,?簡(jiǎn)單的說就是Docker的打包系統(tǒng)會(huì)削減存儲(chǔ)開銷的.
?
1.2.2?改善可移植性
另一個(gè)軟件問題就是應(yīng)用程序的依賴項(xiàng)里通常包括特定的操作系統(tǒng).?操作系統(tǒng)間的可移植性對(duì)用戶來說是個(gè)大問題.?例如一些在Linux和Mac上可以兼容的程序,?想要在Windows上使用它就挺困難.?這可能需要重構(gòu)整個(gè)軟件,?而且還需要Windows有相應(yīng)的依賴替代項(xiàng).
現(xiàn)在, Docker可以在Linux上原生的運(yùn)行,?在Mac和Windows上需要使用一個(gè)虛擬機(jī).?這種在Linux上的聚合意味著在Docker容器中運(yùn)行的軟件只需要針對(duì)一組一致的依賴項(xiàng)編寫一次即可.
在Windows和Mac上, Docker使用一個(gè)很小的虛擬機(jī)來運(yùn)行所有容器.?這樣的話,?運(yùn)行虛擬機(jī)的開銷是固定的,?而容器的數(shù)量確實(shí)可以擴(kuò)展的.
優(yōu)點(diǎn)有三個(gè):
·?????????解鎖了新世界.?例如以前無法在Windows上運(yùn)行的Linux軟件現(xiàn)在也可以使用了.
·?????????可以在任何系統(tǒng)上運(yùn)行完全相同的軟件.
·?????????軟件維護(hù)者可集中精力針對(duì)一套平臺(tái)和依賴來開發(fā)軟件了.
?
1.2.3?保護(hù)你的計(jì)算機(jī)
容器可以保護(hù)我的計(jì)算機(jī)不受容器中運(yùn)行的軟件影響.
程序的風(fēng)險(xiǎn)主要有這些:
·?????????程序可能是惡意程序員寫的
·?????????善意開發(fā)者寫出來的程序也可能含有有害的bug
·?????????程序輸入處理中的漏洞,?可能被惡意攻擊者利用
?
和實(shí)體監(jiān)獄一樣,?容器里的任何東西只能訪問容器里面的東西.?但是用戶可以設(shè)置一些例外.
左側(cè)就是惡意程序直接訪問到了敏感資源.
右側(cè),?惡意程序被限制在了容器里.
?
1.3 Docker?為什么這么重要?
·?????????Docker?提供了一種抽象,?抽象允許你使用簡(jiǎn)化的方式來處理復(fù)雜的事物.?針對(duì)Docker來說,?我們只需考慮安裝哪個(gè)軟件即可.?安裝和刪除的過程異常簡(jiǎn)單.
·?????????每個(gè)人都可以使用,?省時(shí)省力省錢.
·?????????軟件社區(qū)正在大力推動(dòng)使用容器和Docker
·?????????它為桌面實(shí)現(xiàn)了移動(dòng)設(shè)備的應(yīng)用商店一樣的功能.?并且Docker的做法是跨平臺(tái)并且開放的.
·?????????更好更多的采用了操作系統(tǒng)的高級(jí)隔離特性.
?
1.4?何時(shí)何地使用Docker?
Docker幾乎可在任何地方運(yùn)行,?但是并不意味著這樣做就合適.
在桌面上運(yùn)行Windows/OS X原生程序是不行的.
容器對(duì)于必須取得機(jī)器全部控制權(quán)限的程序的安全性是沒有多大幫助的.
?
1.5 Docker在更大的生態(tài)中
·?????????今天容器的生態(tài)更大,?高級(jí)工具也很多,?它們主要是為了解決一些新出現(xiàn)的,?高階的問題:?容器編排,?高可用集群,?微服務(wù)生命周期管理,?可見性.
·?????????這些工具通常是作為插件或者依賴于Docker提供更高級(jí)的功能性.?有一些工具使用了Docker的子組件,?這些子組件是獨(dú)立的項(xiàng)目,?例如?runc,?libcontainerd, notary等.
·?????????Kubernetes是整個(gè)生態(tài)中除了Docker之外最值得一提的工具.?它提供了一個(gè)可擴(kuò)展平臺(tái),?用于在集群環(huán)境中把服務(wù)作為容器進(jìn)行編排.?它已經(jīng)成長為某種“數(shù)據(jù)中心操作系統(tǒng)”了.?就像Linux?內(nèi)核一樣,?云提供商和平臺(tái)公司都在對(duì)Kubernetes進(jìn)行包裝. Kubernetes依賴于像Docker一樣的容器引擎,?所以在你筆記本上構(gòu)建的容器和鏡像在Kubernetes里面也會(huì)運(yùn)行.
?
1.6 Docker?命令行幫助
docker
docker help
docker help <command>
?
?
總結(jié)
以上是生活随笔為你收集整理的【学习笔记】Docker - 01. Docker是啥的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 程序员修神之路--高并发系统设计负载均衡
- 下一篇: 使用 .NET CORE 创建 项目模板
