摘要:而實(shí)際上在宿主機(jī)中也會(huì)同步啟動(dòng)一個(gè)進(jìn)程,其在宿主機(jī)中是。如果其中的某一個(gè)容器正在執(zhí)行密集型的任務(wù),那么它就會(huì)影響其他容器的任務(wù)執(zhí)行效率,導(dǎo)致多個(gè)容器相互影響并且搶占資源。
作者:榮幸
為什么是容器如果問(wèn)你現(xiàn)在最熱門(mén)的服務(wù)器端技術(shù)什么?想必很多人會(huì)不假思索的說(shuō)是容器!
容器技術(shù)實(shí)際上并不是一個(gè)新鮮的名詞,現(xiàn)在大家一提到容器馬上想到的就是Docker,但是容器這個(gè)詞并不是Docker公司發(fā)明的,早期的Pass項(xiàng)目如CloudFoundry,其底層就是基于namespace和cgroups的容器技術(shù)。
Docker在當(dāng)時(shí)實(shí)際上是個(gè)小弟,并沒(méi)有引起大家的注意,但是現(xiàn)在Docker已經(jīng)成為容器事實(shí)上的標(biāo)準(zhǔn),是什么讓Docker發(fā)展成現(xiàn)在這樣的程度呢?
這個(gè)功能就是Docker鏡像。
早期的Pass平臺(tái)最為人詬病的一個(gè)軟肋就是應(yīng)用的打包部署問(wèn)題,一個(gè)應(yīng)用包在本地部署的好好的,接入Pass平臺(tái)后卻問(wèn)題重重,而Docker鏡像解決了這個(gè)根本性問(wèn)題。
容器到底是怎么回事前面我們說(shuō)了容器實(shí)際上是很早以前就有的技術(shù),主要用到的是Linux的namespace,cgroups和rootfs。
我們經(jīng)常說(shuō)沙盒或者集裝箱,他們里面裝的是貨物,那容器這個(gè)沙盒裝的又是什么呢?是進(jìn)程!
我們把進(jìn)程裝進(jìn)一個(gè)沙盒(容器)里面,給他制造邊界,和盒子外面的世界隔離,所以我們會(huì)說(shuō)容器實(shí)際上就是加了圍墻的一個(gè)進(jìn)程。
Namespace為進(jìn)程制造邊界就需要用到namespace技術(shù),我們先運(yùn)行一個(gè)docker進(jìn)程看一下:
docker run -it busybox /bin/sh # -it 是提供一個(gè)tty的輸入輸出環(huán)境 # -d 后臺(tái)運(yùn)行程序 # -v 掛載外部存儲(chǔ) # -p 端口映射 # -e 參數(shù)變量 # busybox 輕量級(jí)的容器鏡像
我們執(zhí)行ps命令,可以看到有趣的現(xiàn)象,PID為1的就是我們的啟動(dòng)進(jìn)程。
而實(shí)際上在宿主機(jī)中也會(huì)同步啟動(dòng)一個(gè)進(jìn)程,其PID在宿主機(jī)中是22035。
這就是PID namespace實(shí)現(xiàn)的障眼法,它在Linux進(jìn)程啟動(dòng)的時(shí)候(clone函數(shù)),會(huì)添加CLONE_NEWPID的參數(shù),進(jìn)程就會(huì)看到一個(gè)新的命名空間,所以進(jìn)程ID就會(huì)變成1,實(shí)際上進(jìn)程在宿主機(jī)上面還是22035。
除了PID namespace之外,還有很多的namespace,比如Network、Mount、User等,通過(guò)這些namespace對(duì)進(jìn)程進(jìn)行網(wǎng)絡(luò)、儲(chǔ)存、文件等進(jìn)行限制,使這個(gè)進(jìn)程看不到宿主機(jī)的真實(shí)情況,裝在了盒子里,這就是容器的核心原理了。
Cgroups我們通過(guò) Linux 的命名空間為新創(chuàng)建的進(jìn)程隔離了文件系統(tǒng)、網(wǎng)絡(luò)、宿主機(jī)器上的其他進(jìn)程,但是命名空間并不能夠?yàn)槲覀兲峁┪锢碣Y源上的隔離,比如 CPU 或者內(nèi)存。在同一臺(tái)機(jī)器上可能運(yùn)行著多個(gè)對(duì)彼此以及宿主機(jī)器一無(wú)所知的『容器』,但這些容器卻共同占用了宿主機(jī)器的物理資源。
如果其中的某一個(gè)容器正在執(zhí)行 CPU 密集型的任務(wù),那么它就會(huì)影響其他容器的任務(wù)執(zhí)行效率,導(dǎo)致多個(gè)容器相互影響并且搶占資源。如何對(duì)多個(gè)容器的資源使用進(jìn)行限制就成了解決進(jìn)程虛擬資源隔離之后的主要問(wèn)題,而 Control Group(簡(jiǎn)稱 cgroups)就能隔離宿主機(jī)器上的物理資源,例如 CPU、內(nèi)存、磁盤(pán) I/O 和網(wǎng)絡(luò)帶寬。cgroups介紹、應(yīng)用實(shí)例及原理描述
容器是一個(gè)單進(jìn)程的模型通過(guò)namespace和cgroups的學(xué)習(xí)我們知道了容器就是一個(gè)啟用了多個(gè)namespace的應(yīng)用進(jìn)程,而這個(gè)進(jìn)程能夠使用的資源受到cgroups的限制。這里面有個(gè)很重要的概念:容器是一個(gè)單進(jìn)程的模型。
由于容器本質(zhì)上面是一個(gè)進(jìn)程,即PID=1的進(jìn)程,他是后續(xù)其他進(jìn)程的父進(jìn)程,這就意味著在一個(gè)容器內(nèi),你沒(méi)有辦法同時(shí)運(yùn)行兩個(gè)應(yīng)用,除非找到一個(gè)公共的PID=1的父進(jìn)程,并使用像systemd或者supervisor這樣的軟件替代PID=1的進(jìn)程來(lái)做為容器的啟動(dòng)進(jìn)程。
但是我們還是希望容器和應(yīng)用是同生命周期的,因?yàn)槿绻萜魇呛玫?,而里面的進(jìn)程卻已經(jīng)掛了,這樣處理起來(lái)就會(huì)非常麻煩了。
通過(guò)上面對(duì)容器原理的了解,我們能不能分析出容器和虛擬機(jī)的區(qū)別?
虛擬機(jī)需要hypervisor層,在上面創(chuàng)建虛擬機(jī)是一個(gè)完整的OS
容器是Linux上的一個(gè)進(jìn)程
虛擬機(jī)的OS資源消耗比容器大的多
容器使用的是宿主機(jī)上相同的內(nèi)核
容器隔離不了時(shí)間等資源
鏡像前面說(shuō)了Docker能夠成為容器現(xiàn)在的事實(shí)標(biāo)準(zhǔn),主要是因?yàn)镈ocker創(chuàng)新了鏡像這個(gè)東西,那么鏡像在Linux系統(tǒng)里面是怎么存在的呢?
我們Docker的工作目錄是/app/docker/docker/ ,其中有個(gè)overlay2子目錄,它就是我們的鏡像目錄。
我們?cè)谶@個(gè)目錄下有三個(gè)目錄和一個(gè)l的目錄,如下:
我們可以進(jìn)入其中一個(gè)目錄,并查看該目錄下diff子目錄的內(nèi)容:
到這里我們可以知道,鏡像是由多個(gè)層組織并定義的,這些層本質(zhì)上是文件,這些文件是只讀的,每層具體的文件存放在層標(biāo)識(shí)符下的diff目錄下。
所以我們?cè)谥谱麋R像的時(shí)候就需要理解層的概念,提高鏡像制作的效率和重復(fù)使用性。
以我們最常使用的Dockerfile制作鏡像舉例:
FROM node:8.16.0 RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime RUN echo "Asia/Shanghai" >> /etc/timezone RUN date -R RUN mkdir -p /opt/app/ WORKDIR /opt/app RUN rm -rf /opt/app/node_modules/ COPY package.json ./ RUN npm install --registry=https://registry.npm.taobao.org
Dockerfile 中的每一條命令在最終生成的鏡像中都會(huì)產(chǎn)生一層。Docker為了提高鏡像分發(fā)效率,給鏡像賦予了復(fù)用層的能力,在拉取,推送,build不同鏡像時(shí),不同鏡像中內(nèi)容相同的層可以被復(fù)用從而節(jié)省大量操作。
所以我們應(yīng)該盡量把不變的命令放到 Dockerfile 的上層,這樣會(huì)顯著提高鏡像的使用效率。
如果希望了解更多關(guān)于Docker或運(yùn)維技術(shù)的知識(shí),請(qǐng)關(guān)注徐徐運(yùn)維的公眾號(hào)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/27880.html
摘要:月日,杭州站圓滿收?qǐng)觥5诙患钨e阿里巴巴移動(dòng)安全專家何星宇,業(yè)界知名白帽子,本次的分享主題移動(dòng)開(kāi)發(fā)者所必須關(guān)注的安全那些事。杭州站分享已經(jīng)結(jié)束,非常感謝大家的參與。 showImg(https://segmentfault.com/img/bVqWqG); 11 月 14 日,SegmentFault D-Day 杭州站圓滿收?qǐng)?。雖然這次『云』議題比較高深,但絲毫沒(méi)有影響到愛(ài)挑戰(zhàn)的小伙...
摘要:月日數(shù)人云在上海舉辦金融沙龍,邀請(qǐng)上交所和近二十家來(lái)自銀行保險(xiǎn)證券的技術(shù)專家一同探討容器技術(shù)在金融業(yè)中的最佳實(shí)踐。數(shù)人云肖德時(shí)在會(huì)上將傳統(tǒng)金融行業(yè)通過(guò)容器可以解決的四大問(wèn)題做了逐一解讀。如何動(dòng)態(tài)的分配,就是剛才上交所介紹的一些治理的方法。 7月29日數(shù)人云在上海舉辦金融沙龍,邀請(qǐng)上交所和近二十家來(lái)自銀行、保險(xiǎn)、證券的IT技術(shù)專家一同探討容器技術(shù)在金融業(yè)中的最佳實(shí)踐。數(shù)人云CTO肖德時(shí)在...
摘要:對(duì)于商業(yè)市場(chǎng)來(lái)說(shuō),特別是中國(guó)這樣一個(gè)云計(jì)算才剛剛起步的市場(chǎng)。反觀云計(jì)算售賣(mài)的一些商品,目前主要還是以服務(wù)器為主。云計(jì)算的本質(zhì)是將計(jì)算能力轉(zhuǎn)化為標(biāo)準(zhǔn)化,可售賣(mài)的服務(wù)??梢哉f(shuō)是云計(jì)算實(shí)踐的一個(gè)經(jīng)典案例。有的人會(huì)問(wèn),云計(jì)算廠商需要提供哪些服務(wù)。 2015年伊始,國(guó)內(nèi)云計(jì)算市場(chǎng)可謂風(fēng)起云涌。各路群豪紛紛涌入這個(gè)市場(chǎng)。其中最活躍的領(lǐng)域當(dāng)屬I(mǎi)AAS。阿里騰訊硝煙未盡,百度重新檢討了自己的PAAS戰(zhàn)略后,...
摘要:所以借鑒大家慣用的傳統(tǒng)運(yùn)維思路,并配有一個(gè)與以前傳統(tǒng)對(duì)接的點(diǎn),廣發(fā)銀行有如下幾個(gè)做法第一,操作系統(tǒng)。所以廣發(fā)使用了一個(gè)配置文件包。版本流程這是廣發(fā)銀行持續(xù)集總的框架。 數(shù)人云上海&深圳兩地容器之Mesos/K8S/Swarm三國(guó)演義的嘉賓精彩實(shí)錄第一彈來(lái)啦。今天是廣發(fā)銀行數(shù)據(jù)中心的運(yùn)維老兵沈偉康關(guān)于傳統(tǒng)運(yùn)維與容器適配的全方位分享,萬(wàn)字長(zhǎng)文傾情奉上~ 沈偉康,廣發(fā)銀行數(shù)據(jù)中心 運(yùn)維中年人...
摘要:的在調(diào)查發(fā)現(xiàn)問(wèn)題在于的性能缺陷后,我們決定嘗試解析器的性能,這是為我們的工具編寫(xiě)的。這意味著即使忽略任何優(yōu)化,只是將解析器替換為解析器就可以緩解我們的性能瓶頸。 注: 轉(zhuǎn)自 微信公眾號(hào)高可用架構(gòu):從20秒到0.5秒:一個(gè)使用Rust語(yǔ)言來(lái)優(yōu)化Python性能的案例 導(dǎo)讀:Python 被很多互聯(lián)網(wǎng)系統(tǒng)廣泛使用,但在另外一方面,它也存在一些性能問(wèn)題,不過(guò) Sentry 工程師分享的在關(guān)...
閱讀 3276·2023-04-25 15:44
閱讀 1930·2019-08-30 13:11
閱讀 2925·2019-08-30 11:11
閱讀 3135·2019-08-29 17:21
閱讀 1362·2019-08-29 15:38
閱讀 1015·2019-08-29 12:49
閱讀 1852·2019-08-28 18:19
閱讀 3276·2019-08-26 14:01