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