ZERO
????持續(xù)更新 請(qǐng)關(guān)注:https://zorkelvll.cn/blogs/zorkelvll/articles/2019/01/21/1548041077470
一在岂、背景
????對(duì)于大部分程序員而言(當(dāng)然嘍牛郑,可能只是我一個(gè)個(gè)例)卑惜,對(duì)docker的初步認(rèn)識(shí)可能就是安裝軟件起來非常方便堪簿,進(jìn)一步就是學(xué)會(huì)使用幾個(gè)docker命令承疲,最多謝謝compose文件;但是冲呢,對(duì)docker相關(guān)的基本概念、思想以及k8s編排工具等招狸,可能最多也只是聽過敬拓,卻從來都沒有深入研究過,因此為了完善自己對(duì)docker相關(guān)的理解而在此進(jìn)行記錄裙戏!
二乘凸、基本概念
1、容器
通俗地講累榜,容器就是一個(gè)存放東西的地方营勤;比如,在java中容器是存放java對(duì)象的集合如List壹罚;在Spring中IOC容器用于存放和管理各種bean對(duì)象葛作;而在軟件領(lǐng)域,容器則是存放軟件的一組環(huán)境猖凛,主要是將軟件打包成標(biāo)準(zhǔn)化單元赂蠢,以用于開發(fā)、交付和部署
2辨泳、虛擬機(jī)
容器是對(duì)操作系統(tǒng)層面進(jìn)行虛擬化的虱岂,容器間共享同一套系統(tǒng)資源;而虛擬機(jī)則是對(duì)硬件層面進(jìn)行虛擬化的菠红,然后在其上運(yùn)行一套完整操作系統(tǒng)第岖!
3、Docker
Docker是一種在操作系統(tǒng)層面的虛擬化容器试溯,實(shí)現(xiàn)對(duì)進(jìn)程的封裝和隔離
4蔑滓、鏡像 VS 容器 VS 倉庫
- 鏡像Image:一個(gè)特殊的文件系統(tǒng)
- 容器Container:鏡像運(yùn)行時(shí)的實(shí)體
- 倉庫Repository:集中存放鏡像文件的地方
三、docker核心技術(shù)
!1烫饼、命名空間Namespaces
命名空間Namespaces是linux提供的一種用于分離進(jìn)程樹猎塞、網(wǎng)絡(luò)接口、掛載點(diǎn)以及進(jìn)程間通信等資源的方法杠纵!
目標(biāo)是“希望在同一臺(tái)機(jī)器上的不同服務(wù)能夠做到完全隔離的效果荠耽,也即各個(gè)服務(wù)就像是運(yùn)行在多臺(tái)不同的機(jī)器上一樣”,對(duì)不同的容器實(shí)現(xiàn)了隔離比藻,保證各個(gè)服務(wù)之間互不影響和安全性
七種不同的命名空間:以在創(chuàng)建新的進(jìn)程時(shí)設(shè)置新進(jìn)程應(yīng)該在哪些資源上與宿主機(jī)進(jìn)行隔離
- CLONE_NEWCGROUP
- CLONE_NEWIPC
- CLONE_NEWNET
- CLONE_NEWNS
- CLONE_NEWPID
- CLONE_NEWUSER
- CLONE_NEWUTS
2铝量、進(jìn)程
進(jìn)程即一個(gè)正在執(zhí)行的程序,也是在現(xiàn)代分時(shí)系統(tǒng)中的一個(gè)任務(wù)單元银亲!
3慢叨、網(wǎng)絡(luò)
docker提供了四種不同的網(wǎng)絡(luò)模式Host、Container务蝠、None和Bridge模式
默認(rèn)為網(wǎng)橋Bridge模式拍谐,該模式除了分配隔離的網(wǎng)絡(luò)命名空間外,還會(huì)為所有的容器設(shè)置IP地址
4馏段、libnetwork
整個(gè)網(wǎng)絡(luò)部分的功能都是通過docker拆分出來的libnetwork實(shí)現(xiàn)的轩拨,它提供了一個(gè)連接不同容器的實(shí)現(xiàn),同時(shí)也能夠?yàn)閼?yīng)用給出一個(gè)能夠提供一致的編程接口和網(wǎng)絡(luò)層抽象的容器網(wǎng)絡(luò)模型
三個(gè)主要組件:Sandbox院喜,Endpoint亡蓉,Network
在容器網(wǎng)絡(luò)模型中,每一個(gè)容器內(nèi)部都包含一個(gè)sandbox喷舀,其中存儲(chǔ)著當(dāng)前容器的網(wǎng)絡(luò)棧配置砍濒,包括容器的接口、路由表和DNS設(shè)置硫麻;linux使用命名空間實(shí)現(xiàn)這個(gè)sandbox
每一個(gè)sandbox中都可能會(huì)有一個(gè)或多個(gè)endpoint爸邢,在linux上就是一個(gè)虛擬的網(wǎng)卡veth,sandbox通過endpoint加入到對(duì)應(yīng)的網(wǎng)絡(luò)中(該網(wǎng)絡(luò)可能是linux網(wǎng)橋或vlan)
5拿愧、掛載點(diǎn)
在新的進(jìn)程中創(chuàng)建隔離的掛載點(diǎn)命名空間需要在clone函數(shù)中傳入CLONE_NEWNS甲棍,以使得子進(jìn)程可以得到父進(jìn)程掛載點(diǎn)的拷貝;如果不傳入這個(gè)參數(shù)赶掖,子進(jìn)程對(duì)文件系統(tǒng)的讀寫就都會(huì)同步回父進(jìn)程以及整個(gè)主機(jī)的文件系統(tǒng)
如果一個(gè)容器需要啟動(dòng)感猛,那么它一定需要提供一個(gè)根文件系統(tǒng)rootfs,容器需要使用這個(gè)文件系統(tǒng)來創(chuàng)建一個(gè)新的進(jìn)程奢赂,所有二進(jìn)制的執(zhí)行都必須在這個(gè)根文件系統(tǒng)中
6陪白、chroot
通過改變當(dāng)前系統(tǒng)的根目錄,限制用戶的權(quán)利膳灶,建立一個(gè)與原系統(tǒng)完全隔離的目錄結(jié)構(gòu)
咱士!7立由、CGroups
Control Groups 能夠隔離宿主機(jī)器上的物理資源,如CPU序厉、內(nèi)存锐膜、磁盤I/O和網(wǎng)絡(luò)帶寬
每一組CGroup都是一組被相同的標(biāo)準(zhǔn)和參數(shù)限制的進(jìn)程,不同的CGroup之間有層級(jí)關(guān)系
弛房!8道盏、UnionFS
Linux的命名空間和控制組分別解決了不同資源隔離的問題,前者解決了進(jìn)程文捶、網(wǎng)絡(luò)以及文件系統(tǒng)的隔離荷逞,后者實(shí)現(xiàn)了CPU、內(nèi)存等資源的隔離粹排;种远;除此之外,還有一個(gè)非常重要的問題顽耳,即是鏡像問題需要解決
docker鏡像就是一個(gè)文件