目錄01 容器的本質是什么?
創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供庫倫網(wǎng)站建設、庫倫做網(wǎng)站、庫倫網(wǎng)站設計、庫倫網(wǎng)站制作等企業(yè)網(wǎng)站建設、網(wǎng)頁設計與制作、庫倫企業(yè)網(wǎng)站模板建站服務,10多年庫倫做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡服務。
今天的重點問題是講述清楚什么是容器。
要理解容器的概念,首先我們需要知道什么是進程?當我們在Linux操作系統(tǒng)執(zhí)行一個程序,這個程序可能是一個二進制文件,它被調用的時候,變成了計算機內存中的數(shù)據(jù)、寄存器中的值、堆棧中的指令、以及各種設備狀態(tài)信息的一個集合。像這樣的一個計算機執(zhí)行環(huán)境的綜合,我們稱之為進程。
容器,就是為這個進程提供一個"邊界",理解成白話,就是把這個進程"包"起來,它本質上是通過約束和修改進程的一些動態(tài)表現(xiàn)實現(xiàn)的這個"包"的動作。
不難看出來,容器是一種特殊的、有"邊界"的進程。
現(xiàn)在我們來看一個MySQL容器的進程特點。
1、先查看下我們機器上mysql容器的containerID值,如下:[root@VM-16-13-centos service]# docker ps | grep mysql4784586d01e0 mysql "docker-entrypoint..." 3 months ago Up 3 months k8s_mysql.16d54d16_mysql-pd7jr_default_0032bce0-2b0f-11eb-98ad-5254002dbd85_d775f414
可以看到,containerID的值是4784586d01e0
2、首先我們通過docker exec命令(關于這條命令的介紹,下面會有講述)進入一個容器里面,ps -ef命令查看進程:[root@VM-16-13-centos service]# docker exec -it 4784586d01e0 bashroot@mysql-pd7jr:/# ps -efUID PID PPID C STIME TTY TIME CMDmysql 1 0 0 2020 ? 03:20:20 mysqldroot 882 0 0 09:42 ? 00:00:00 bashroot 888 882 0 09:46 ? 00:00:00 ps -ef
可以發(fā)現(xiàn),mysqld這個進程的進程號是1.
這里我要多嘴一下:
1、docker exec -it 4784586d01e0 bash
這條指令是告訴容器,我要進入這個容器里面,并運行一個bash的指令。
2、如果你的docker里面不支持ps命令,你需要使用下面的命令安裝一下ps這個指令:
apt-get update & apt-get install procps
然后我們退出到容器外面,再次查看mysqld進程的進程號:[root@VM-16-13-centos service]# ps -ef|grep mysqlroot 5152 5059 0 2020 pts/5 00:00:00 mysql -uroot -px xxxxroot 13644 24879 0 2020 pts/4 00:00:00 mysql -uroot -px xxxxpolkitd 18853 18837 0 2020 ? 03:20:25 mysqld
發(fā)現(xiàn)進程號是18853。
可以得到一個結論,mysqld進程在容器里面和容器外面執(zhí)行的結果不一樣。
為什么會這樣?
其本質是docker容器中的進程被隔離在了一個新的環(huán)境中,使得這些進程只能看到重新計算過的PID號。前面我們說過,docker本質上是通過約束和修改進程的一些動態(tài),將一個物理機上的進程"包"起來,我們看到的這個現(xiàn)象,就是"包"的結果。
那么Linux是如何將物理機進程進行的約束和修改呢?這里引入新的概念:
對于 Docker 等大多數(shù) Linux 容器來說,Linux 的Cgroups 技術是用來制造約束的主要手段,而
02 Cgroup技術和Namespace技術介紹
Namespace技術主要是為容器提供資源隔離用的。Namespace這個功能實現(xiàn)的方法比較簡單,通常情況下,我們創(chuàng)建Linux進程的時候,系統(tǒng)會執(zhí)行一個clone的命令,類似:int pid = clone(main_function, stack_size, SIGCHLD, NULL);
它返回的就是我們創(chuàng)建的進程的PID號。
而Namespace技術就是在Linux創(chuàng)建進程的時候,多了一個參數(shù),這個新參數(shù)暫且稱之為newid,這樣,在容器內,我們看到的進程的PID號,就是這個newid了。這個Namespace我們稱之為PID Namespace。
除了這個Namespace,還有其他的,例如mount Namespace,Network Namespace等,分別是為了隔離掛載點和隔離網(wǎng)絡的。
當然,不是所有的資源都能夠被namespace化,例如時間和操作系統(tǒng)內核,就是一個服務器上的所有容器共享的。
容器一旦開始運行,我們需要控制它使用的機器資源,例如磁盤、內存、CPU等,否則它可能會耗盡物理機的資源,導致一些系統(tǒng)進程發(fā)生崩潰。Cgroup技術就是專門為Linux進程限制資源使用的。它的全程是Linux Control Group,它以文件和目錄的形式存放在/sys/fs/cgroups目錄下,如下:[root@VM-16-13-centos service]# ls -l /sys/fs/cgroup/total 0drwxr-xr-x 4 root root 0 Nov 20 11:38 blkiolrwxrwxrwx 1 root root 11 Nov 20 11:38 cpu -> cpu,cpuacctlrwxrwxrwx 1 root root 11 Nov 20 11:38 cpuacct -> cpu,cpuacctdrwxr-xr-x 5 root root 0 Nov 20 11:38 cpu,cpuacctdrwxr-xr-x 3 root root 0 Nov 20 11:38 cpusetdrwxr-xr-x 4 root root 0 Nov 20 11:38 devicesdrwxr-xr-x 3 root root 0 Nov 20 11:38 freezerdrwxr-xr-x 3 root root 0 Nov 20 11:38 hugetlbdrwxr-xr-x 5 root root 0 Nov 20 11:38 memorylrwxrwxrwx 1 root root 16 Nov 20 11:38 net_cls -> net_cls,net_priodrwxr-xr-x 3 root root 0 Nov 20 11:38 net_cls,net_priolrwxrwxrwx 1 root root 16 Nov 20 11:38 net_prio -> net_cls,net_priodrwxr-xr-x 3 root root 0 Nov 20 11:38 perf_eventdrwxr-xr-x 4 root root 0 Nov 20 11:38 pidsdrwxr-xr-x 4 root root 0 Nov 20 11:38 systemd
不同的文件目錄里面,存儲不同的資源種類被限制的值,其中,比較常用的:
blkio:為塊設備設置i/o限制,一般用于磁盤等設備
cpuset:為進程分配單獨的CPU核心和對應的內存節(jié)點
memory:為進程設定內存使用的限制。
當我們通過命令啟動容器之后,操作系統(tǒng)會把這個docker進程對應的PID填寫到對應控制組的文件中,從而控制當前進程使用的CPU資源值。03 容器、鏡像和倉庫之間的關系
Docker 包括三個基本概念:鏡像(Image) 容器(Container) 倉庫(Repository)
這三部分組成了Docker的整個生命周期,如上圖所示。
docker鏡像包含了文件系統(tǒng),類似于虛擬機的鏡像,它是只讀的模板。這個文件系統(tǒng)也通常被稱之為rootfs,通常包含了bin、etc、sys、usr等一系列目錄。
docker容器是由鏡像實例化而來的,這和我們學習的面向對象的概念十分相似,我們可以把鏡像想象成類,把容器想象成類經(jīng)過實例化后的對象,這樣就非常好理解鏡像和容器的關系了。
docker倉庫:類似與代碼倉庫,是Docker集中存放鏡像文件的場所
這個關系可以更加清楚的表述為:
以上就是詳解docker容器的概念的詳細內容,更多關于docker容器的概念的資料請關注腳本之家其它相關文章!
分享題目:docker容器的原理分析
當前URL:http://www.rwnh.cn/article38/iosepp.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供建站公司、企業(yè)網(wǎng)站制作、服務器托管、網(wǎng)站策劃、電子商務、外貿建站
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)