認(rèn)識(shí)容器基本操作和實(shí)現(xiàn)原理_第1頁(yè)
認(rèn)識(shí)容器基本操作和實(shí)現(xiàn)原理_第2頁(yè)
認(rèn)識(shí)容器基本操作和實(shí)現(xiàn)原理_第3頁(yè)
認(rèn)識(shí)容器基本操作和實(shí)現(xiàn)原理_第4頁(yè)
認(rèn)識(shí)容器基本操作和實(shí)現(xiàn)原理_第5頁(yè)
已閱讀5頁(yè),還剩17頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

起來探討容器里面的兩大關(guān)鍵技術(shù)——Namespace和Cgroups?;旧侠斫饬诉@兩個(gè)概念,你就能徹底搞懂容器的原理了。 Docker安裝完Docker之后,咱們先來用下面令運(yùn)行一個(gè)httpd服務(wù)1#dockerrun-d這命令也很簡(jiǎn)單,run-ddDaemoncentos/httpd:latest指定了具體要啟動(dòng)哪一個(gè)鏡像,比如這里咱們啟動(dòng)的是centos/httpd這個(gè)鏡像的latest版本。鏡像是Docker公司的創(chuàng)舉,也是一個(gè)偉大的發(fā)明。你想想,在沒有容器之前,你想安裝httpd的話,會(huì)怎么做?是不是得運(yùn)行一連串令?甚至不同的系統(tǒng)上操作方法也不一但你看,有了容器之后,你只要運(yùn)行一條命令就搞定了。其實(shí)所有的都在這個(gè)鏡像里它提供了容器中程序執(zhí)行需要的所有文件。具體來說,就是應(yīng)用程序想啟動(dòng),需要三類文centos/httpd:latestDocker里直接提供的。當(dāng)然,我們也可以自己做一個(gè)提供httpd服務(wù)的容器鏡像,這里仍然可以用Docker這個(gè)工具來自定義鏡像。DockerDockerfileDockerfile如果我們自己來做一個(gè)httpd的鏡像也不難,舉個(gè)例子,我們可以一起來寫一個(gè)Dockerfile,體會(huì)一下整個(gè)過程。用Dockerfilebuildimage的Dockerfile和對(duì)應(yīng)的 操作之前,我們首先要理解這個(gè)Dockerfile5行:123456#catDockerfileFROMcentos:8.1.1911RUNyuminstall-yCOPYfile1file2.tar.gzCMD["/sbin/httpd","-D",我們看下它做了哪幾件事:在一個(gè)centos的基準(zhǔn)鏡像上安裝好httpd的包,然后在httpd提供文件服務(wù)的配置 下,把需要對(duì)外提供的文件file1和file2拷貝過去,最后指定容器啟動(dòng)以后,需要自動(dòng)啟動(dòng)的httpd服務(wù)。有了這個(gè)鏡像,我們希望容器啟動(dòng)后,就運(yùn)行這個(gè)httpd服務(wù),讓用戶可以file1還有file2這兩個(gè)文件。我們具體來看這個(gè)Dockerfile的每一行,第一個(gè)大寫的詞都是Dockerfile專門定義的指令,也就是FROM、RUN、COPY、ADD、CMD,這些指令都很基礎(chǔ),所以我們不做詳細(xì)解釋了,你可以參考Dockerfile 文檔Dockerfiledockerbuild命令。下面這個(gè)命令中-f./Dockerfile指定Dockerfile文件,-tregistry/httpd:v1指定了生成出來的鏡像名,它的格式是"name:tag",這個(gè)鏡像名也是后面啟動(dòng)容器需要用1#dockerbuild-tregistry/httpd:v1-f./Dockerfiledockerbuild執(zhí)行成功之后,我們?cè)龠\(yùn)行dockerimages這個(gè)命令,就可以看到生代代123#docker 4secondsagoregistry/httpd:v1dockerrun1#dockerrun-ddockerps1#docker223CONTAINER"/sbin/httpd-D2seconds面介紹Dockerfile的時(shí)候,我們做這個(gè)鏡像是用來提供HTTP服務(wù)的,也就是讓用戶可以file1、file2這兩個(gè)文件。httpd第二步,對(duì)于HTTP文件服務(wù),如果我們能用curl命令文件,就可以證明這個(gè)容器提供了我們預(yù)期的httpd服務(wù)。我們先來做第一步驗(yàn)證,我們可以運(yùn)行dockerexec這個(gè)命令進(jìn)入容器的運(yùn)行空間,至于什么是容器的運(yùn)行空間,它的標(biāo)準(zhǔn)說法是容器名空間(Namespace),這個(gè)概念我進(jìn)入容器運(yùn)行空間之后,我們?cè)趺创_認(rèn)httpddockerexecdockerexecc5a9ff78d9c1-efhttpd1#2

execc5a9ff78d9c1ps-3C4100?-D5610?-D6710?-D7810?-D8910?-D這里我解釋一下,在這個(gè)dockerexec后面緊跟著的ID表示容器的ID,這個(gè)ID就是dockerpsIDc5a9ff78d9c1。在這個(gè)ID值的后面,就是我們要在容器空間里運(yùn)行的ps-ef命令。 中file1和file2文件是否存在dockerexec來查看一下容器的文件系統(tǒng)中,httpd錄/var/www/html是否有這兩個(gè)文件。很好,我們可以看到file1、file2這兩個(gè)文件也都放在指 #dockerexecc5a9ff78d9c1lshttpdcurlhttpd如果要httpd服務(wù),我們就需要知道這個(gè)容器的IP地址。容器的網(wǎng)絡(luò)空間也是獨(dú)立的,有一個(gè)它自己的IP。我們還是可以用dockerexec進(jìn)入到容器的網(wǎng)絡(luò)空間,查看一下這IPdockerexecc5a9ff78d9c1ipaddr命令,我們可以看到容器里網(wǎng)絡(luò)接口eth0上配置的IP是。這個(gè)IP目前只能在容器的宿主機(jī)問,在別的機(jī)器上目前是不能的。關(guān)于容器網(wǎng)絡(luò)代代12345678#dockerexecc5a9ff78d9c1ip1:lo:<LOOPBACK,UP,LOWER_UP>mtu65536qdiscnoqueuestateUNKNOWNgroupdefalink/loopback00:00:00:00:00:00brd00:00:00:00:00:00inet/8scopehost99valid_lftforeverpreferred_lft168:eth0@if169:<BROADCAST,MULTICAST,UP,LOWER_UP>mtu1500qdiscnoqueuestatlink/ether02:42:ac:11:00:02brdff:ff:ff:ff:ff:fflink-netnsid0inet/16brd55scopeglobalvalid_lftforeverpreferred_lft好了,獲取了httpd服務(wù)的IP地址之后,我們隨便一個(gè)文件試試,比如選file2我們?cè)谒拗鳈C(jī)上運(yùn)行curl,就可以這個(gè)文件了,操作如下。很好,文件成功了,這證明了我們這個(gè)提供httpd服務(wù)的容器正常運(yùn)行了。2%%%Average34Dload5666000--:--:-78#9上面的步驟完成之后,我們的第二步驗(yàn)證,用curlhttpd服務(wù)提供的文件也成功dockerexec命令通過這上面的這些操作練習(xí),估計(jì)你已經(jīng)初步感知到,容器的文件系統(tǒng)是獨(dú)立的,運(yùn)行的進(jìn)程環(huán)境是獨(dú)立的,網(wǎng)絡(luò)的設(shè)置也是獨(dú)立的。但是它們和宿主機(jī)上的文件系統(tǒng),進(jìn)程環(huán)境以及網(wǎng)絡(luò)感覺都已經(jīng)分開了。從用戶使用的角度來看,容器和一立的機(jī)器或者虛擬機(jī)沒有什么太大的區(qū)別,但是它和虛擬機(jī)相比,卻沒有各種復(fù)雜的硬件虛擬層,沒有獨(dú)立的Linux內(nèi)核。容器所有的進(jìn)程調(diào)度,內(nèi)存,文件的讀寫都直接跑在宿主機(jī)的內(nèi)核之上,這是怎么做要回答這個(gè)問題,你可以先記住這兩個(gè)術(shù)語Namespace和Cgroups。如果有人問你LinuxNamesapceCgroups。Namespace和Cgroups可以讓程序在一個(gè)資源可控的獨(dú)立()環(huán)境中運(yùn)行,這個(gè)就是容器了。我們現(xiàn)在已經(jīng)發(fā)現(xiàn):容器的進(jìn)程、網(wǎng)絡(luò)還有文件系統(tǒng)都是獨(dú)立的。那問題來了,容器的獨(dú)立運(yùn)行環(huán)境到底是怎么創(chuàng)造的呢?這就要提到Namesae這個(gè)概念了。所以接下來,就先從我們已經(jīng)有點(diǎn)感覺的Namesae開始分析。面我們運(yùn)行dockerexecc5a9ff78d9c1psef,看到了5個(gè)httpd進(jìn)程,而且也只有這5個(gè)進(jìn)程。1#2

execc5a9ff78d9c1ps-3C4100?-D5610?-D6710?-D7810?-D8910?-D如果我們不用dockerexec,直接在宿主機(jī)上運(yùn)行ps-ef,就會(huì)看到很多進(jìn)程。如果我們運(yùn)行一下grephttpd,同樣可以看到這5個(gè)httpd的進(jìn)程:3C40?/sbin/httpd-50?/sbin/httpd-60?/sbin/httpd-70?/sbin/httpd-80?/sbin/httpd-這兩組輸出結(jié)果到底有什么差別呢,你可以仔細(xì)做個(gè)對(duì)比,最大的不同就是進(jìn)程的PID不一樣。PIDdockerexecc5a9ff78d9c1psef和ps-ef實(shí)質(zhì)的區(qū)別在哪里呢?如果理解了PID為何不同,我們就能搞清楚LinuxNamespace的概念了,為了方便后文的講解,我們先用下面這張圖來梳理一下我們看到的PID。LinuxPIDNamespace,PID個(gè)PIDNamespace,就是指每建立出一個(gè)Namespace,就會(huì)單獨(dú)對(duì)進(jìn)程進(jìn)行PID編號(hào),每個(gè)Namespace的PID編號(hào)都從1PIDNamespaceNamespace這也就是說,如果有另外一個(gè)容器,那么它也有自己的一個(gè)PIDNamespace,而這兩個(gè)PIDNamespace之間是不能看到對(duì)方的進(jìn)程的,這里就體現(xiàn)出了Namespace的作用:而在宿主機(jī)上的HostPIDNamespace,它是其他Namespace的父親Namespace,可以看到在這臺(tái)機(jī)器上的所有進(jìn)程,不過進(jìn)程PID編號(hào)不是ContainerPIDNamespace里講了PIDNamespace之后,我們了解到Namespace其實(shí)就是一種機(jī)制,主要目的是運(yùn)行在同一個(gè)宿主機(jī)上的容器,讓這些容器之間不能彼此的資源。這種有兩個(gè)作用:第一是可以充分地利用系統(tǒng)的資源,也就是說在同一臺(tái)宿主機(jī)上可以運(yùn)行多個(gè)用戶的容器;第二是保證了安全性,因?yàn)椴煌脩糁g不能對(duì)方的資源除了PIDNamespace,還有其他常見的Namespace類型,比如我們之前運(yùn)行了dockerexecc5a9ff78d9c1ipaddrIP實(shí)就是在查看NetworkNamespace。NetworkNamespacelo,eth0,還有獨(dú)立的TCP/IP的協(xié)議棧配置。代代123456789#dockerexecc5a9ff78d9c1ip1:lo:<LOOPBACK,UP,LOWER_UP>mtu65536qdiscnoqueuestateUNKNOWNgroupdefalink/loopback00:00:00:00:00:00brd00:00:00:00:00:00inet/8scopehostvalid_lftforeverpreferred_lft168:eth0@if169:<BROADCAST,MULTICAST,UP,LOWER_UP>mtu1500qdiscnoqueuestatlink/ether02:42:ac:11:00:02brdff:ff:ff:ff:ff:fflink-netnsid0inet/16brd55scopeglobalvalid_lftforeverpreferred_lftdockerexecc5a9ff78d9c1ls那容器自己的根文件系統(tǒng)完全獨(dú)立于宿主機(jī)上的根文件系統(tǒng),這一點(diǎn)是怎么做到的呢?其實(shí)這里依靠的是MuntNamspace,Mountamesae保證了每個(gè)容器都有自己獨(dú)立的文件結(jié)構(gòu)。中所有的NamespaceLinux的作用是保證資源的。在后面的課程,講解到具體問題時(shí),我會(huì)不斷地提到Namespace這個(gè)概念。好了,我們剛才說了Namespace,這些Namespace盡管類型不同,其實(shí)都是為了容器資源:PIDNamespace負(fù)責(zé)不同容器的進(jìn)程,NetworkNamespace又負(fù)責(zé)管理網(wǎng)絡(luò)環(huán)境的,MountNamespace管理文件系統(tǒng)的。正是通過這些Namespace,我們才出一個(gè)容器,這里你也可以把它看作是一臺(tái)“計(jì)既然是一臺(tái)“計(jì)算機(jī)”,你肯定會(huì)問這個(gè)“計(jì)算機(jī)”有多少CPU,有多少M(fèi)emory?。磕敲碙inux如何為這些“計(jì)算機(jī)”來定義CPU,定義Memory的容量呢?想要定義“計(jì)算機(jī)”各種容量大小,就涉及到支撐容器的第二個(gè)技術(shù)Cgroups(ControlGroups)了。Cgroups可以對(duì)指定的進(jìn)程做各種計(jì)算機(jī)資源的限制,比如限制CPU的使用率,內(nèi)存使用量,IO設(shè)備的流量等等。Cgroups究竟有什么好處呢?要知道,在Cgroups出現(xiàn)之前,任意一個(gè)進(jìn)程都可以創(chuàng)建出成百上千個(gè)線程,可以輕易地消耗完一臺(tái)計(jì)算機(jī)的所有CPU資源和內(nèi)存資源。但是有了Cgroups這個(gè)技術(shù)以后,我們就可以對(duì)一個(gè)進(jìn)程或者一組進(jìn)程的計(jì)算機(jī)資源的消Cgroups通過不同的子系統(tǒng)限制了不同的資源,每個(gè)子系統(tǒng)限制一種資源。每個(gè)子系統(tǒng)限制資源的方式都是類似的,就是把相關(guān)的一組進(jìn)程分配到一個(gè)控制組里,然后通過樹結(jié)構(gòu)進(jìn)行管理,每個(gè)控制組都設(shè)有自己的資源控制參數(shù)。完整的Cgroups子系統(tǒng)的介紹,你可以查看LinuxProgrammer’sManual這里呢,我們只需要了解幾種比較常用的Cgroups子系統(tǒng):CPU(一組進(jìn)程,你可以理解為一個(gè)容器里所有的進(jìn)程)可使用的最大CPU。cpusetCPU因?yàn)閙emory子系統(tǒng)的限制參數(shù)最簡(jiǎn)單,所以下面我們就用memory子系統(tǒng)為例,一起看看Cgroups是怎么對(duì)一個(gè)容器做資源限制的。對(duì)于啟動(dòng)的每個(gè)容器,都會(huì)在Cgroups子系統(tǒng)下建立一 ,在Cgroups中這也被稱作控制組,比如下圖里的"docker-<id1>""docker-<id2>"等。然后我們?cè)O(shè)置這個(gè)還記得,我們之前用Docker創(chuàng)建的那個(gè)容器嗎?在每個(gè)Cgroups子系統(tǒng)下,對(duì)應(yīng)這個(gè)容器就會(huì)有一個(gè)docker-c5a9ff78d9c1……這個(gè)容器的ID號(hào),容器中所有的進(jìn)程都會(huì)在這個(gè)控制組中cs這個(gè)參數(shù)里。你看下面的這些進(jìn)程號(hào)是不是很熟悉呢?沒錯(cuò),它們就是前面我們用ps看到的進(jìn)程號(hào)。我們實(shí)際看一下這個(gè)例子里的memoryCgroups,它可以控制Memory的使用量。比如說,這個(gè)控制組Memory的最大用量設(shè)置為2GB。具體操作是這樣的,我們把(2*1024*1024*1024= memoryCgroup控制組中的memory.limit_in_bytes里,這樣設(shè)置后,cs里面所有進(jìn)程Memory使用量之和,最大也不會(huì)超過2GB。1123456789#cd/sys/fs/cgroup/memory/system.slice/docker-#cs#>#cat剛剛我們通過memoryCgroups定義了容器的memory可以使用的最大值。其他的子系統(tǒng)稍微復(fù)雜一些,但用法也和memory類似,我們?cè)诤竺娴恼n程中會(huì)結(jié)合具體的實(shí)例來詳細(xì)解釋其他的Cgroups。Cgroups有v1和v2Cgroupsv1在Linux中很早就實(shí)現(xiàn)了,各系統(tǒng)比較獨(dú)立,每個(gè)進(jìn)程在各個(gè)memoryCgroupblkioCgroup)v1產(chǎn)環(huán)境中,大部分使用的還是v1。Cgroupsv2解決了v1不過Cgroupsv2在生產(chǎn)環(huán)境的應(yīng)用還很少,因?yàn)樵摪姹竞芏嘧酉到y(tǒng)的實(shí)現(xiàn)需要較新版本的Linux內(nèi)核,還有無論是主流的Linux版本還是容器云平臺(tái),比如Kubernetes,對(duì)v2的支持也剛剛起步。所以啊,我們?cè)诤竺鍯groups的講解里呢,主要還是用Cgroupsv1這個(gè)版本I/OCgroupsv2好了,上面我們解讀了Namespace和Cgroups兩大技術(shù),它們是Linux下實(shí)現(xiàn)容器的兩個(gè)基石,后面課程中要討論的容器相關(guān)問題,或多或少都和NamespaceCgroups目前呢,你只需要先記住這兩個(gè)技術(shù)的作用,Namespace幫助容器來實(shí)現(xiàn)各種計(jì)算資源的,Cgroups主要限制的是容器能夠使用的某種資源量。這一講,我們對(duì)容器有了一個(gè)大致的認(rèn)識(shí),包括它的“形”,一些基本的容器操作;還有它的“神”,也就是容器實(shí)現(xiàn)的原理。啟動(dòng)容器的基本操作是這樣的,首先用Dockerfile來建立一個(gè)容器的鏡像,然后再用這個(gè)我們可以運(yùn)行dockerexec這個(gè)命令進(jìn)入容器的運(yùn)行空間,查看進(jìn)程是否啟動(dòng),檢查配我們用dockerexec命令查看了容器的進(jìn)程,網(wǎng)絡(luò)和文件系統(tǒng),就能體會(huì)到容器的文件NamespaceCgroups,Linux具體來說,Namespace幫助容器實(shí)現(xiàn)各種計(jì)算資源的,Cgroups主要對(duì)容器使用某所以我們?cè)谶@里可以直接記?。喝萜髌鋵?shí)就是Namesapce+Cgroups用DockerfileDocker13人覺得很贊|提建議 歸科技所有 不得售賣。頁(yè)面已增加防盜追蹤,將依法其上一 開篇詞|一個(gè)態(tài)度兩個(gè)步驟,成為容器實(shí)戰(zhàn)高下一 02|理解進(jìn)程(1):為什么我在容器中不能kill1號(hào)進(jìn)程求教老師一個(gè)問題,我們有三個(gè)服務(wù)ABC部署在K8S里,它們各自設(shè)置了resoucelimit(cpumemoryA1B1C1被分配到同一個(gè)node上,A2B2分配到另外一個(gè)上。流量經(jīng)過loadbalanceA1A2B1B2各自是均勻的,但是A1B1使用的cpu占比相對(duì)于A2B2要高出5%~6%。我認(rèn)為盡管docker通過namespace和cgroups來和限制使用的資源,但是對(duì)于宿主機(jī)而言,各個(gè)docker實(shí)例之間還是存在競(jìng)爭(zhēng)cpu…體情況先做一個(gè)比較,從硬件類型開始,OS版本,宿主機(jī)上的其他負(fù)載的情況,如果這些都一樣,那么可以對(duì)A1/A2,B1/B2做perf看看熱點(diǎn)函數(shù)。3老師好1.我們現(xiàn)在對(duì)docker容器的使用就如同虛擬機(jī)一樣一個(gè)容器運(yùn)行多個(gè)進(jìn)程但是我聽說docker2.之前在某次創(chuàng)建docker控制好像必須修改grub3其實(shí)我大多數(shù)時(shí)候的交互方式是-itbinbash的方式當(dāng)成虛擬機(jī)來用這樣是否有問題4.我們現(xiàn)在的環(huán)境其實(shí)并沒有做過多限制容器之間相互干擾和影響要設(shè)置限制然后平滑的…,或者2 31Linuxbridgeinterfacedocker0上的IP,IP在同一個(gè)網(wǎng)段,22”會(huì)導(dǎo)致對(duì)同一進(jìn)程的資源協(xié)調(diào)比較,比如memoryCgroup與blkioCgroup之間就不能協(xié)作“-->CY老師能展開介紹一下為什么memorycgroup和blkiocgroup不能協(xié)作的問題嗎?為什么cgroupv2就可以了呢?另外,cgroupv1diskIOnetworkIOcgroupv2memorycgroupblkiocgroupcgroupv2就可以了呢?cgroupv1blkio可以對(duì)DirectI/O做限流。cgroupv1net_clstccgroupv2iomemoryDirectI/OBufferedI/O做限流,但是不支持2dockerfile中FROM作者回復(fù):dockerbaseimage,拿centos為例子,可以建一個(gè) 打成一個(gè)tarball,用dockerimport成為一個(gè)baseimage.1 1使用了這么多年的Docker,1 2 11 1[root@localhost~]#echo >/sys/fs/cgroup/memory/docker/7142bb2[root@localhost~]#dockerstats…dockerrun--memory=400m-dregistry/zombie-老師您好,請(qǐng)教一下,學(xué)下如何給各個(gè)服務(wù)合理分配resoucelimit,但不知t。我在后面的課程里也會(huì)介紹cpu/memory/blkio/pids這幾個(gè)Cgroups. shim$ps-ef|grep 17:30?00:00:00/usr/sbin/httpd-root27204180220Nov17?00:00:06containerd-shim-namespacemoby-workdir/var/li0c74aebfc706b849c665672f7de74f5210f00b887c4a0e7c31ae31-address/var/run/docker/containerd/containerd.sock-containerd-binary/usr/bin/containerd-runtime-root/var/run/docker/runtime-runc-s

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論