人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動態(tài)

docker容器的原理分析

發(fā)布日期:2021-12-21 20:18 | 文章來源:腳本之家

01 容器的本質(zhì)是什么?

今天的重點問題是講述清楚什么是容器。

要理解容器的概念,首先我們需要知道什么是進(jìn)程?當(dāng)我們在Linux操作系統(tǒng)執(zhí)行一個程序,這個程序可能是一個二進(jìn)制文件,它被調(diào)用的時候,變成了計算機內(nèi)存中的數(shù)據(jù)、寄存器中的值、堆棧中的指令、以及各種設(shè)備狀態(tài)信息的一個集合。像這樣的一個計算機執(zhí)行環(huán)境的綜合,我們稱之為進(jìn)程。

容器,就是為這個進(jìn)程提供一個"邊界",理解成白話,就是把這個進(jìn)程"包"起來,它本質(zhì)上是通過約束和修改進(jìn)程的一些動態(tài)表現(xiàn)實現(xiàn)的這個"包"的動作。

不難看出來,容器是一種特殊的、有"邊界"的進(jìn)程。

現(xiàn)在我們來看一個MySQL容器的進(jìn)程特點。

1、先查看下我們機器上mysql容器的containerID值,如下:

[root@VM-16-13-centosservice]#dockerps|grepmysql
4784586d01e0mysql"docker-entrypoint..."3monthsagoUp3monthsk8s_mysql.16d54d16_mysql-pd7jr_default_0032bce0-2b0f-11eb-98ad-5254002dbd85_d775f414

可以看到,containerID的值是4784586d01e0

2、首先我們通過docker exec命令(關(guān)于這條命令的介紹,下面會有講述)進(jìn)入一個容器里面,ps -ef命令查看進(jìn)程:

[root@VM-16-13-centosservice]#dockerexec-it4784586d01e0bash
root@mysql-pd7jr:/#ps-ef
UIDPIDPPIDCSTIMETTYTIMECMD
mysql1002020?03:20:20mysqld
root8820009:42?00:00:00bash
root888882009:46?00:00:00ps-ef

可以發(fā)現(xiàn),mysqld這個進(jìn)程的進(jìn)程號是1.

這里我要多嘴一下:

1、docker exec -it 4784586d01e0 bash

這條指令是告訴容器,我要進(jìn)入這個容器里面,并運行一個bash的指令。

2、如果你的docker里面不支持ps命令,你需要使用下面的命令安裝一下ps這個指令:

apt-get update & apt-get install procps

然后我們退出到容器外面,再次查看mysqld進(jìn)程的進(jìn)程號:

[root@VM-16-13-centosservice]#ps-ef|grepmysql
root5152505902020pts/500:00:00mysql-uroot-pxxxxx
root136442487902020pts/400:00:00mysql-uroot-pxxxxx
polkitd188531883702020?03:20:25mysqld

發(fā)現(xiàn)進(jìn)程號是18853。

可以得到一個結(jié)論,mysqld進(jìn)程在容器里面和容器外面執(zhí)行的結(jié)果不一樣。

為什么會這樣?

其本質(zhì)是docker容器中的進(jìn)程被隔離在了一個新的環(huán)境中,使得這些進(jìn)程只能看到重新計算過的PID號。前面我們說過,docker本質(zhì)上是通過約束和修改進(jìn)程的一些動態(tài),將一個物理機上的進(jìn)程"包"起來,我們看到的這個現(xiàn)象,就是"包"的結(jié)果。

那么Linux是如何將物理機進(jìn)程進(jìn)行的約束和修改呢?這里引入新的概念:

對于 Docker 等大多數(shù) Linux 容器來說,Linux 的Cgroups 技術(shù)是用來制造約束的主要手段,而
Namespace 技術(shù)則是用來修改進(jìn)程視圖的主要方法。

02 Cgroup技術(shù)和Namespace技術(shù)介紹

Namespace技術(shù)主要是為容器提供資源隔離用的。Namespace這個功能實現(xiàn)的方法比較簡單,通常情況下,我們創(chuàng)建Linux進(jìn)程的時候,系統(tǒng)會執(zhí)行一個clone的命令,類似:

intpid=clone(main_function,stack_size,SIGCHLD,NULL);

它返回的就是我們創(chuàng)建的進(jìn)程的PID號。

而Namespace技術(shù)就是在Linux創(chuàng)建進(jìn)程的時候,多了一個參數(shù),這個新參數(shù)暫且稱之為newid,這樣,在容器內(nèi),我們看到的進(jìn)程的PID號,就是這個newid了。這個Namespace我們稱之為PID Namespace。

除了這個Namespace,還有其他的,例如mount Namespace,Network Namespace等,分別是為了隔離掛載點和隔離網(wǎng)絡(luò)的。

當(dāng)然,不是所有的資源都能夠被namespace化,例如時間和操作系統(tǒng)內(nèi)核,就是一個服務(wù)器上的所有容器共享的。

容器一旦開始運行,我們需要控制它使用的機器資源,例如磁盤、內(nèi)存、CPU等,否則它可能會耗盡物理機的資源,導(dǎo)致一些系統(tǒng)進(jìn)程發(fā)生崩潰。Cgroup技術(shù)就是專門為Linux進(jìn)程限制資源使用的。它的全程是Linux Control Group,它以文件和目錄的形式存放在/sys/fs/cgroups目錄下,如下:

[root@VM-16-13-centosservice]#ls-l/sys/fs/cgroup/
total0
drwxr-xr-x4rootroot0Nov2011:38blkio
lrwxrwxrwx1rootroot11Nov2011:38cpu->cpu,cpuacct
lrwxrwxrwx1rootroot11Nov2011:38cpuacct->cpu,cpuacct
drwxr-xr-x5rootroot0Nov2011:38cpu,cpuacct
drwxr-xr-x3rootroot0Nov2011:38cpuset
drwxr-xr-x4rootroot0Nov2011:38devices
drwxr-xr-x3rootroot0Nov2011:38freezer
drwxr-xr-x3rootroot0Nov2011:38hugetlb
drwxr-xr-x5rootroot0Nov2011:38memory
lrwxrwxrwx1rootroot16Nov2011:38net_cls->net_cls,net_prio
drwxr-xr-x3rootroot0Nov2011:38net_cls,net_prio
lrwxrwxrwx1rootroot16Nov2011:38net_prio->net_cls,net_prio
drwxr-xr-x3rootroot0Nov2011:38perf_event
drwxr-xr-x4rootroot0Nov2011:38pids
drwxr-xr-x4rootroot0Nov2011:38systemd

不同的文件目錄里面,存儲不同的資源種類被限制的值,其中,比較常用的:

blkio:為塊設(shè)備設(shè)置i/o限制,一般用于磁盤等設(shè)備

cpuset:為進(jìn)程分配單獨的CPU核心和對應(yīng)的內(nèi)存節(jié)點

memory:為進(jìn)程設(shè)定內(nèi)存使用的限制。

當(dāng)我們通過命令啟動容器之后,操作系統(tǒng)會把這個docker進(jìn)程對應(yīng)的PID填寫到對應(yīng)控制組的文件中,從而控制當(dāng)前進(jìn)程使用的CPU資源值。

03容器、鏡像和倉庫之間的關(guān)系

Docker 包括三個基本概念:

  • 鏡像(Image)
  • 容器(Container)
  • 倉庫(Repository)

這三部分組成了Docker的整個生命周期,如上圖所示。

docker鏡像包含了文件系統(tǒng),類似于虛擬機的鏡像,它是只讀的模板。這個文件系統(tǒng)也通常被稱之為rootfs,通常包含了bin、etc、sys、usr等一系列目錄。

docker容器是由鏡像實例化而來的,這和我們學(xué)習(xí)的面向?qū)ο蟮母拍钍窒嗨?,我們可以把鏡像想象成類,把容器想象成類經(jīng)過實例化后的對象,這樣就非常好理解鏡像和容器的關(guān)系了。

docker倉庫:類似與代碼倉庫,是Docker集中存放鏡像文件的場所

這個關(guān)系可以更加清楚的表述為:

以上就是詳解docker容器的概念的詳細(xì)內(nèi)容,更多關(guān)于docker容器的概念的資料請關(guān)注本站其它相關(guān)文章!

版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。

實時開通

自選配置、實時開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時在線

客服
熱線

400-630-3752
7*24小時客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部