說(shuō)docker必須要要說(shuō)容器,所以我們需要首先來(lái)說(shuō)一下容器的概念。
站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到個(gè)舊網(wǎng)站設(shè)計(jì)與個(gè)舊網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類(lèi)型包括:網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、國(guó)際域名空間、網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋個(gè)舊地區(qū)。
其實(shí)容器就是一工具,泛指可以容納其他的物品工具,可以用來(lái)存儲(chǔ)、運(yùn)輸物品;物品可以放在容器中的,而容器可以保護(hù)物品。
常見(jiàn)的容器:
瓶子
籃子
碗
集裝箱
柜子
說(shuō)容器,就必須對(duì)比容器和虛擬化技術(shù),首先就說(shuō)虛擬化技術(shù)。
我們實(shí)現(xiàn)虛擬化技術(shù)主要有兩種
方式1:主機(jī)虛擬化
這里所虛擬化的是整個(gè)硬件平臺(tái),比如vmware、virtual box,他們所虛擬出來(lái)的是一個(gè)完整的裸機(jī),我們可以再這個(gè)裸機(jī)上隨意的安裝os和軟件。
主機(jī)虛擬化是分為兩類(lèi)的
l?type-I(類(lèi)型1的虛擬化)
l?type-ii(類(lèi)型2的虛擬化)
程序運(yùn)行在虛擬機(jī)中,肯定比運(yùn)行在物理機(jī)中性能差,那么為什么還要將其運(yùn)行在虛擬機(jī)中?
復(fù)用:比如需要運(yùn)行兩個(gè)tomcat,讓其工作在虛擬機(jī)中,就可以實(shí)現(xiàn)8080套接字不沖突了
隔離:一個(gè)進(jìn)程在虛擬機(jī)中做任何操作,對(duì)于其他虛擬機(jī)中的進(jìn)程和物理機(jī)中的進(jìn)程都是沒(méi)有影響的
那么我們?cè)趺醇磳?shí)現(xiàn)隔離,又不影響性能呢?
一個(gè)主機(jī)在運(yùn)行起來(lái)之后,分為內(nèi)核空間和用戶空間,在用戶空間中就是運(yùn)行用戶空間進(jìn)程。
默認(rèn)所有的用戶進(jìn)程都是在同一個(gè)用戶空間的,那么此時(shí)我們要想隔離多個(gè)進(jìn)程的運(yùn)行環(huán)境,就可以創(chuàng)建多個(gè)用戶空間,而且多個(gè)用戶空間是互相隔離的
這里一個(gè)一個(gè)性對(duì)獨(dú)立的用戶空間就是我們所謂的linux 容器。
使用容器,目的是為了創(chuàng)建一個(gè)隔離的環(huán)境,在這個(gè)隔離環(huán)境環(huán)境中,應(yīng)該至少包括隔離如下幾個(gè)層面
UTS:主機(jī)名和域名
Mount:工作目錄,也稱(chēng)之為安裝樹(shù)
IPC:ipc是必須要進(jìn)行隔離的,如果不隔離IPC,那么多個(gè)進(jìn)程就可以互相通信,那么就不存在隔離了
PID:隔離PID也是必須的
user 和group:在容器中也要有獨(dú)立的用戶,比如都要有root ,但是這個(gè)root肯定不能都是真正的root,因?yàn)槿绻钦鎟oot用戶的話,就有權(quán)限刪除其他容器中的內(nèi)容了。
network:隔離網(wǎng)絡(luò)是最為重要的,因?yàn)橐粋€(gè)容器作為一個(gè)獨(dú)立的單元工作,那么就需要為每個(gè)容器準(zhǔn)備一個(gè)網(wǎng)卡、接口、tcp/IP協(xié)議棧。
這里有個(gè)概念就是namespaces(名稱(chēng)空間)
linux的內(nèi)核原生就支持了6種名稱(chēng)空間,在構(gòu)建容器的時(shí)候,就是從這6個(gè)名稱(chēng)空間中抽取出來(lái)一部分構(gòu)成一個(gè)容器。
各種名稱(chēng)空間與所支持的內(nèi)核版本
從這里可以看到,如果想更好的使用容器技術(shù),centos6就不適合了。
所謂的LXC,其實(shí)就是linux Container,這是一種基于模板的方式實(shí)現(xiàn)容器技術(shù)應(yīng)用的解決方案 ,在LXC中包含了一組工具
lxc-create:快速創(chuàng)建容器的命令
其實(shí)docker就是lxc的二次封裝發(fā)行版,他是用lxc作為容器引擎,同時(shí)使用鏡像技術(shù),將一個(gè)操作類(lèi)型容器所需要的文件提取安裝好,并打成一個(gè)包
當(dāng)創(chuàng)建容器的時(shí)候,只需要將這個(gè)包復(fù)制N份并啟動(dòng)容器,這樣就好了,速度很快。
當(dāng)用docker創(chuàng)建容器的時(shí)候,其實(shí)就是用lxc create來(lái)創(chuàng)建一個(gè)容器。
docker極大的降低了容器的使用難度
用來(lái)存放鏡像的服務(wù)器,我們稱(chēng)之為docker倉(cāng)庫(kù),在這個(gè)倉(cāng)庫(kù)中有我們幾乎能想到的全部的容器
docker使用了一種更為精巧的設(shè)計(jì),那就是每個(gè)容器中僅僅運(yùn)行一個(gè)進(jìn)程。
比如在一個(gè)容器中僅僅運(yùn)行nginx,如果要用apache,就需要下載另一個(gè)容器了,此時(shí)的nginx和apache就可會(huì)通過(guò)容器間的通信邏輯進(jìn)行通信。
這里讓每個(gè)進(jìn)程運(yùn)行在一個(gè)獨(dú)立的容器中,而且我們也知道容器是一個(gè)隔離的環(huán)境,那么這樣一來(lái),一個(gè)進(jìn)程出現(xiàn)了問(wèn)題,對(duì)于其他的進(jìn)程是不會(huì)受到影響的。
?
使用docker另個(gè)一好處:真正的實(shí)現(xiàn)的一次編寫(xiě),到處運(yùn)行了
現(xiàn)在我們的生成環(huán)境中,都是多版本并行的,如同時(shí)用著centos5 6 7,同時(shí)還用著windows、ubuntu等系統(tǒng),如果這個(gè)時(shí)候要開(kāi)發(fā)一個(gè)程序在所有的平臺(tái)都能運(yùn)行,這個(gè)時(shí)候往往是需要有好幾個(gè)團(tuán)隊(duì)分別開(kāi)發(fā)面向不同系統(tǒng)的版本。
而有了docker以后,就只需要開(kāi)發(fā)一個(gè)版本,并將這個(gè)軟件做到一個(gè)docker鏡像中,這樣只需要將這個(gè)鏡像放到任意的平臺(tái)上,只要這個(gè)平臺(tái)有docker,那么就可以運(yùn)行這個(gè)鏡像,同時(shí)這個(gè)程序也就可以開(kāi)始運(yùn)行了,所以,軟件開(kāi)發(fā)的難度大大降低了。
?
再來(lái)說(shuō)docker鏡像的構(gòu)建方式
docker鏡像的構(gòu)建方式是很特殊的,稱(chēng)之為:分層構(gòu)建、聯(lián)合掛載
以構(gòu)建nginx鏡像為例解釋一下
先做一個(gè)最底層、純凈的系統(tǒng),比如最小化的centos6系統(tǒng)
在這個(gè)centos系統(tǒng)的基礎(chǔ)上安裝一個(gè)nginx就構(gòu)成了鏡像
注意,構(gòu)建的鏡像只包含nginx本身,而不包含centos操作系統(tǒng)內(nèi)容
這個(gè)鏡像就包含了兩層,這兩層共同構(gòu)成了運(yùn)行在了linux上的centos
當(dāng)啟動(dòng)容器的時(shí)候,需要將這兩層都掛載上去就可以用了,這就是分層構(gòu)建、聯(lián)合掛載,
如果需要啟動(dòng)多個(gè)鏡像,其中有nginx、tomcat、apache等,如都是基于centos的,所以在下載的時(shí)候,只需要下載一個(gè)centos,再分別下載需要層就可以了。
為何能實(shí)現(xiàn)多個(gè)上層應(yīng)用公用底層系統(tǒng)?
是因?yàn)榈讓拥腸entos和tomcat都是只讀的。
當(dāng)用戶在所創(chuàng)建的容器中執(zhí)行寫(xiě)操作的時(shí)候,底層是只讀無(wú)法修改
所以,這個(gè)時(shí)候就會(huì)底層的資源復(fù)制一份上來(lái),然后在復(fù)制的這層中進(jìn)行修改,這種機(jī)制稱(chēng)之為:寫(xiě)時(shí)復(fù)制。
關(guān)于容器編排工具
比如我們有100個(gè)主機(jī)可以運(yùn)行docker,當(dāng)需要啟動(dòng)容器的時(shí)候,只需要編排工具發(fā)送指令,這個(gè)編排工具根據(jù)算法從后端的這幾種找一個(gè)來(lái)啟動(dòng)docker
再比如,我們要運(yùn)行amp的環(huán)境,這里三個(gè)程序就是三個(gè)容器,這三個(gè)容器的啟動(dòng)順序是有關(guān)系的,所以就需要設(shè)置啟動(dòng)的順序,這樣編排工具還需要可以根據(jù)順序依次啟動(dòng)。
編排有很多:
第一個(gè):docker自己的編排工具:這里其實(shí)是三個(gè)工具的組合,machine+swarm+compose
第二個(gè):ASF的,meos+marathon
第三個(gè):google的,kubbernets,簡(jiǎn)稱(chēng)k8s,這是因?yàn)閗和s間有8個(gè)字母
kvm:基于硬件虛擬化技術(shù),是需要cpu支持的,是虛擬出來(lái)一個(gè)虛擬機(jī),虛擬機(jī)管理器是需要占用額外的系統(tǒng)資源的,也就是即使不跑任何虛擬機(jī),都需要占用6%左右的系統(tǒng)資源
docker:基于內(nèi)核虛擬化技術(shù),沒(méi)有虛擬任何東西,但是是通過(guò)隔離技術(shù)實(shí)現(xiàn)的,所以不會(huì)對(duì)系統(tǒng)帶來(lái)額外的開(kāi)銷(xiāo)。
真正的docker是不應(yīng)該當(dāng)做虛擬機(jī)用的(雖然可以)
整個(gè)架構(gòu)分為了三個(gè)部分
l?1:客戶端:cient
l?2:服務(wù)器端:docker_hosts
l?3:倉(cāng)庫(kù)端:registery
l?各個(gè)部分之間通信是基于http或者h(yuǎn)ttps進(jìn)行通信的
docker_host部分
????服務(wù)器端就是靠運(yùn)行docker daemon來(lái)運(yùn)行在守護(hù)進(jìn)程模式的下的,此時(shí)的docker就會(huì)監(jiān)聽(tīng)在一個(gè)套接字之上了,而且docker是支持三種套接字的
l?ipv4套接字
l?ipv6套接字
l?unix socket套接字:也就是監(jiān)聽(tīng)在一個(gè)本地文件上。
docker倉(cāng)庫(kù)
首先docker的registery中提供了docker鏡像的存儲(chǔ)功能,而且還提供了用戶登錄下載鏡像時(shí)候的認(rèn)證功能。
另外docker的registery中,還包括repository,一個(gè)repository就是一個(gè)目錄,在一個(gè)目錄中只存儲(chǔ)一個(gè)應(yīng)該程序的鏡像,比如要?jiǎng)?chuàng)建的nginx的鏡像,那么就創(chuàng)建一個(gè)目錄,這個(gè)目錄名就是nginx,所有的nginx的鏡像都是放在同一個(gè)目錄下。
因?yàn)楝F(xiàn)在有多個(gè)鏡像,那么如果想唯一的標(biāo)識(shí)一個(gè)鏡像,就需要借助于tag(標(biāo)簽),比如第一個(gè)1.9 1.11 1.23,這樣通過(guò)repo名稱(chēng)和標(biāo)簽名的組合,就可以唯一的標(biāo)識(shí)一個(gè)鏡像。
docker官方提供有docker倉(cāng)庫(kù),但是其實(shí)也有第三方提供的,而且也可以自己做docker倉(cāng)庫(kù)。
1.簡(jiǎn)化配置
工作中的環(huán)境有生產(chǎn)環(huán)境、測(cè)試環(huán)境、開(kāi)發(fā)環(huán)境測(cè)試環(huán)境又分為功能測(cè)試、性能測(cè)試;生產(chǎn)環(huán)境又分為預(yù)生產(chǎn)環(huán)境和生成環(huán)境。
這么多的環(huán)境,環(huán)境不同,配置也就不同,如果配置不同,那么就可能會(huì)導(dǎo)致上線失敗,使用docker就可以簡(jiǎn)化配置,做一個(gè)鏡像,使用這個(gè)鏡像就可以完成部署上線。
2.代碼流水線管理
開(kāi)發(fā)人員在開(kāi)發(fā)完成以后,將代碼傳遞到服務(wù)器上,然后測(cè)試人員可以從服務(wù)器上拉去代碼進(jìn)行測(cè)試,測(cè)試完成以后,開(kāi)始進(jìn)行發(fā)布,首先就是進(jìn)行灰度發(fā)布,然后才是正事發(fā)布。
3.開(kāi)發(fā)效率
新員工入職后配置各種環(huán)境,這個(gè)過(guò)程就往往是比較麻煩的,那么這里,我們就可以用docker做個(gè)容器輕松來(lái)實(shí)現(xiàn)。
4.應(yīng)用隔離
各個(gè)應(yīng)用之間互相是隔離的。
5.服務(wù)器整合
也就是說(shuō)一個(gè)服務(wù)器可以跑多個(gè)容器實(shí)例
6.調(diào)試能力
處理bug的能力
7.多租戶
8.快速部署
docker是秒級(jí)的,啟動(dòng)速度極其快。
比如之前說(shuō)過(guò),春晚的微信搶紅包,用的是docker,說(shuō)是可以1秒啟動(dòng)1000個(gè)docker程序。
大中型公司選擇docker的理由
l?技術(shù)儲(chǔ)備
l?跟上節(jié)奏,提升自身技術(shù)
l?符和當(dāng)前業(yè)務(wù)需求
? ??(目前普遍都是第二個(gè),根本都不是第一個(gè)和第三個(gè))