用meteor框架做的微博網(wǎng)站淘寶指數(shù)官網(wǎng)入口
云原生介紹
1、云原生的定義
云原生為用戶指定了一條低心智負(fù)擔(dān)的、敏捷的、能夠以可擴(kuò)展、可復(fù)制的方式最大化地利用云的能力、發(fā)揮云的價(jià)值的最佳路徑。
2、云原生思想兩個(gè)理論
第一個(gè)理論基礎(chǔ)是:不可變基礎(chǔ)設(shè)施。
第二個(gè)理論基礎(chǔ)是:云應(yīng)用編排理論。
3、基礎(chǔ)設(shè)施向云演進(jìn)
(1) 過(guò)程:
① 傳統(tǒng)的應(yīng)用基礎(chǔ)設(shè)施是可變的:需要發(fā)布或者更新一個(gè)軟件,流程大致是這樣的,先通過(guò) SSH 連到服務(wù)器,然后手動(dòng)升級(jí)或者降級(jí)軟件包,逐個(gè)調(diào)整服務(wù)器上的配置文件,并且將新代碼直接都部署到現(xiàn)有服務(wù)器上。因此,這套基礎(chǔ)設(shè)施會(huì)不斷地被調(diào)整和修改。
② 在云上,應(yīng)用基礎(chǔ)設(shè)施是不可變的。一旦應(yīng)用部署完成之后,那么這套應(yīng)用基礎(chǔ)設(shè)施就不會(huì)再修改了。如果需要更新,那么需要現(xiàn)更改公共鏡像來(lái)構(gòu)建新服務(wù)直接替換舊服務(wù)。
(2) 意義:
基礎(chǔ)設(shè)施保持一致性和可靠性;
鏡像本身是自包含的,其包含了應(yīng)用運(yùn)行所需要的所有依賴;
云原生的基礎(chǔ)設(shè)施還提供了簡(jiǎn)單、可預(yù)測(cè)的部署和運(yùn)維能力;
應(yīng)用本身也可以更好地?cái)U(kuò)容。
容器的基本概念
一、容器與鏡像:
1、容器
(1) 操作系統(tǒng)中進(jìn)程的特點(diǎn):
第一,這些進(jìn)程可以相互看到、相互通信;
第二,它們使用的是同一個(gè)文件系統(tǒng),可以對(duì)同一個(gè)文件進(jìn)行讀寫操作;
第三,這些進(jìn)程會(huì)使用相同的系統(tǒng)資源。
這三個(gè)特點(diǎn)帶來(lái)的問(wèn)題:
具有高級(jí)權(quán)限的進(jìn)程可能會(huì)將其他進(jìn)程的數(shù)據(jù)進(jìn)行增刪改查;進(jìn)程與進(jìn)程之間的依賴可能會(huì)存在沖突;這些進(jìn)程使用的是同一個(gè)宿主機(jī)的資源,存在資源搶占的問(wèn)題。
(2) 什么是容器:
容器就是一個(gè)視圖隔離、資源可限制、獨(dú)立文件系統(tǒng)的進(jìn)程集合。
① 視圖隔離:就是能夠看到部分進(jìn)程以及具有獨(dú)立的主機(jī)名等;
② 控制資源使用率:對(duì)于內(nèi)存大小以及 CPU 使用個(gè)數(shù)等進(jìn)行限制;
③ 獨(dú)立文件系統(tǒng):容器將系統(tǒng)的其他資源隔離開來(lái),具有自己獨(dú)立的資源視圖。
2、鏡像
(1) 什么是鏡像
容器運(yùn)行時(shí)所需要的所有的文件集合稱之為容器鏡像。
通常采用 Dockerfile 來(lái)構(gòu)建鏡像。描述構(gòu)建的每個(gè)步驟,每個(gè)構(gòu)建步驟都會(huì)對(duì)已有的文件系統(tǒng)進(jìn)行操作,帶來(lái)文件系統(tǒng)內(nèi)容的變化,這些變化稱之為 changeset。當(dāng)我們把構(gòu)建步驟所產(chǎn)生的變化依次作用到一個(gè)空文件夾上,就能夠得到一個(gè)完整的鏡像。
changeset 的分層以及復(fù)用特點(diǎn)帶來(lái)的優(yōu)勢(shì):
① 提高分發(fā)效率:對(duì)于大的鏡像而言,將其拆分成各個(gè)小塊能夠并行下載這些數(shù)據(jù),提高鏡像的分發(fā)效率;
② 具有了復(fù)用能力之后,可以節(jié)約大量的磁盤空間。
(2) 如何構(gòu)建鏡像
① FROM 行表示以下的構(gòu)建步驟基于什么鏡像進(jìn)行構(gòu)建;
② WORKDIR 行表示會(huì)把接下來(lái)的構(gòu)建步驟都在哪一個(gè)相應(yīng)的具體目錄下進(jìn)行,類似于 Shell 里面的 cd;
③ COPY 行表示的是可以將宿主機(jī)上的文件拷貝到容器鏡像內(nèi);
④ RUN 行表示在具體的文件系統(tǒng)內(nèi)執(zhí)行相應(yīng)的動(dòng)作,運(yùn)行完畢后就得到一個(gè)應(yīng)用了;
⑤ CMD 行表示使用鏡像時(shí)的默認(rèn)程序名字。
當(dāng)有了 Dockerfile 之后,就可以通過(guò) docker build 命令構(gòu)建出所需要的應(yīng)用。
docker registry 鏡像倉(cāng)庫(kù),負(fù)責(zé)存儲(chǔ)所有產(chǎn)生的鏡像數(shù)據(jù)。只需要通過(guò) docker push 就能夠?qū)⒈镜冂R像推動(dòng)到鏡像倉(cāng)庫(kù)中,就能夠在生產(chǎn)環(huán)境上或者測(cè)試環(huán)境上將相應(yīng)的數(shù)據(jù)下載下來(lái)并運(yùn)行了。
(3) 如何運(yùn)行容器:
① 從鏡像倉(cāng)庫(kù)中將相應(yīng)的鏡像下載下來(lái);
② 通過(guò) docker images 來(lái)查看本地鏡像,在列表中選中想要的鏡像;
③ 當(dāng)選中鏡像之后,通過(guò) docker run 來(lái)運(yùn)行這個(gè)鏡像得到想要的容器,可以通過(guò)多次運(yùn)行得到多個(gè)容器。
一個(gè)鏡像就相當(dāng)于是一個(gè)模板,一個(gè)容器就像是一個(gè)具體的運(yùn)行實(shí)例,因此鏡像就具有了一次構(gòu)建、到處運(yùn)行的特點(diǎn)。
二、容器生命周期:
1、容器運(yùn)行時(shí)的生命周期
在使用 docker run 的時(shí)候會(huì)選擇一個(gè)鏡像來(lái)提供獨(dú)立的文件系統(tǒng)并指定相應(yīng)的運(yùn)行程序。這里指定的運(yùn)行程序稱之為 initial 進(jìn)程。這個(gè) initial 進(jìn)程啟動(dòng)的時(shí)候,容器也會(huì)隨之啟動(dòng),當(dāng) initial 進(jìn)程退出的時(shí)候,容器也會(huì)隨之退出??梢哉J(rèn)為容器的生命周期和 initial 進(jìn)程的生命周期是一致的。
容器內(nèi)不只有這樣的一個(gè) initial 進(jìn)程,initial 進(jìn)程本身也可以產(chǎn)生其他的子進(jìn)程或者通過(guò) docker exec 產(chǎn)生出來(lái)的操作,也屬于 initial 進(jìn)程管理的范圍內(nèi)。當(dāng) initial 進(jìn)程退出的時(shí)候,所有的子進(jìn)程也會(huì)隨之退出。
2、數(shù)據(jù)卷
當(dāng)一個(gè)容器退出被刪除之后,數(shù)據(jù)也就會(huì)丟失了。所以需要將容器所產(chǎn)生出來(lái)的重要數(shù)據(jù)持久化到指定的目錄上,這個(gè)目錄就稱之為數(shù)據(jù)卷。
(1) 數(shù)據(jù)卷特點(diǎn):
數(shù)據(jù)卷的生命周期是獨(dú)立于容器的生命周期的,也就是說(shuō)容器的創(chuàng)建、運(yùn)行、停止、刪除等操作都和數(shù)據(jù)卷沒(méi)有任何關(guān)系。將數(shù)據(jù)卷掛載到容器內(nèi),容器就能夠?qū)?shù)據(jù)寫入到相應(yīng)的目錄里面了,而且容器的退出并不會(huì)導(dǎo)致數(shù)據(jù)的丟失。
(2) 數(shù)據(jù)卷管理的方式:
① 通過(guò) bind 的方式,直接將宿主機(jī)的目錄直接掛載到容器內(nèi)。
② 將目錄管理交給運(yùn)行引擎。
三、容器和 VM 之間的差異
① VM 利用 Hypervisor 虛擬化技術(shù)來(lái)模擬 CPU、內(nèi)存等硬件資源,這樣就可以在宿主機(jī)上建立一個(gè) Guest OS,每一個(gè) Guest OS 都有一個(gè)獨(dú)立的內(nèi)核,比如 Ubuntu、CentOS 甚至是 Windows 等,在這樣的 Guest OS 之下,每個(gè)應(yīng)用都是相互獨(dú)立的,VM 可以提供一個(gè)更好的隔離效果。但是需要把一部分的計(jì)算資源交給虛擬化,很難充分利用現(xiàn)有的計(jì)算資源,并且每個(gè) Guest OS 都需要占用大量的磁盤空間。
② 容器是針對(duì)于進(jìn)程而言的,因此無(wú)需 Guest OS,只需要一個(gè)獨(dú)立的文件系統(tǒng)提供其所需要文件集合即可。所有的文件隔離都是進(jìn)程級(jí)別的,因此啟動(dòng)時(shí)間快于 VM,并且所需的磁盤空間也小于 VM。