今天的重點(diǎn)問(wèn)題是講述清楚什么是容器。
要理解容器的概念,首先我們需要知道什么是進(jìn)程?當我們在Linux操作系統執行一個(gè)程序,這個(gè)程序可能是一個(gè)二進(jìn)制文件,它被調用的時(shí)候,變成了計算機內存中的數據、寄存器中的值、堆棧中的指令、以及各種設備狀態(tài)信息的一個(gè)集合。像這樣的一個(gè)計算機執行環(huán)境的綜合,我們稱(chēng)之為進(jìn)程。
容器,就是為這個(gè)進(jìn)程提供一個(gè)"邊界",理解成白話(huà),就是把這個(gè)進(jìn)程"包"起來(lái),它本質(zhì)上是通過(guò)約束和修改進(jìn)程的一些動(dòng)態(tài)表現實(shí)現的這個(gè)"包"的動(dòng)作。
不難看出來(lái),容器是一種特殊的、有"邊界"的進(jìn)程。
現在我們來(lái)看一個(gè)MySQL容器的進(jìn)程特點(diǎn)。
1、先查看下我們機器上mysql容器的containerID值,如下:
[root@VM-16-13-centos service]# docker ps | grep mysql 4784586d01e0 mysql "docker-entrypoint..." 3 months ago Up 3 months k8s_mysql.16d54d16_mysql-pd7jr_default_0032bce0-2b0f-11eb-98ad-5254002dbd85_d775f414
可以看到,containerID的值是4784586d01e0
2、首先我們通過(guò)docker exec命令(關(guān)于這條命令的介紹,下面會(huì )有講述)進(jìn)入一個(gè)容器里面,ps -ef命令查看進(jìn)程:
[root@VM-16-13-centos service]# docker exec -it 4784586d01e0 bash root@mysql-pd7jr:/# ps -ef UID PID PPID C STIME TTY TIME CMD mysql 1 0 0 2020 ? 03:20:20 mysqld root 882 0 0 09:42 ? 00:00:00 bash root 888 882 0 09:46 ? 00:00:00 ps -ef
可以發(fā)現,mysqld這個(gè)進(jìn)程的進(jìn)程號是1.
這里我要多嘴一下:
1、docker exec -it 4784586d01e0 bash
這條指令是告訴容器,我要進(jìn)入這個(gè)容器里面,并運行一個(gè)bash的指令。
2、如果你的docker里面不支持ps命令,你需要使用下面的命令安裝一下ps這個(gè)指令:
apt-get update & apt-get install procps
然后我們退出到容器外面,再次查看mysqld進(jìn)程的進(jìn)程號:
[root@VM-16-13-centos service]# ps -ef|grep mysql root 5152 5059 0 2020 pts/5 00:00:00 mysql -uroot -px xxxx root 13644 24879 0 2020 pts/4 00:00:00 mysql -uroot -px xxxx polkitd 18853 18837 0 2020 ? 03:20:25 mysqld
發(fā)現進(jìn)程號是18853。
可以得到一個(gè)結論,mysqld進(jìn)程在容器里面和容器外面執行的結果不一樣。
為什么會(huì )這樣?
其本質(zhì)是docker容器中的進(jìn)程被隔離在了一個(gè)新的環(huán)境中,使得這些進(jìn)程只能看到重新計算過(guò)的PID號。前面我們說(shuō)過(guò),docker本質(zhì)上是通過(guò)約束和修改進(jìn)程的一些動(dòng)態(tài),將一個(gè)物理機上的進(jìn)程"包"起來(lái),我們看到的這個(gè)現象,就是"包"的結果。
那么Linux是如何將物理機進(jìn)程進(jìn)行的約束和修改呢?這里引入新的概念:
對于 Docker 等大多數 Linux 容器來(lái)說(shuō),Linux 的Cgroups 技術(shù)是用來(lái)制造約束的主要手段,而
Namespace 技術(shù)則是用來(lái)修改進(jìn)程視圖的主要方法。
Namespace技術(shù)主要是為容器提供資源隔離用的。Namespace這個(gè)功能實(shí)現的方法比較簡(jiǎn)單,通常情況下,我們創(chuàng )建Linux進(jìn)程的時(shí)候,系統會(huì )執行一個(gè)clone的命令,類(lèi)似:
int pid = clone(main_function, stack_size, SIGCHLD, NULL);
它返回的就是我們創(chuàng )建的進(jìn)程的PID號。
而Namespace技術(shù)就是在Linux創(chuàng )建進(jìn)程的時(shí)候,多了一個(gè)參數,這個(gè)新參數暫且稱(chēng)之為newid,這樣,在容器內,我們看到的進(jìn)程的PID號,就是這個(gè)newid了。這個(gè)Namespace我們稱(chēng)之為PID Namespace。
除了這個(gè)Namespace,還有其他的,例如mount Namespace,Network Namespace等,分別是為了隔離掛載點(diǎn)和隔離網(wǎng)絡(luò )的。
當然,不是所有的資源都能夠被namespace化,例如時(shí)間和操作系統內核,就是一個(gè)服務(wù)器上的所有容器共享的。
容器一旦開(kāi)始運行,我們需要控制它使用的機器資源,例如磁盤(pán)、內存、CPU等,否則它可能會(huì )耗盡物理機的資源,導致一些系統進(jìn)程發(fā)生崩潰。Cgroup技術(shù)就是專(zhuān)門(mén)為L(cháng)inux進(jìn)程限制資源使用的。它的全程是Linux Control Group,它以文件和目錄的形式存放在/sys/fs/cgroups目錄下,如下:
[root@VM-16-13-centos service]# ls -l /sys/fs/cgroup/ total 0 drwxr-xr-x 4 root root 0 Nov 20 11:38 blkio lrwxrwxrwx 1 root root 11 Nov 20 11:38 cpu -> cpu,cpuacct lrwxrwxrwx 1 root root 11 Nov 20 11:38 cpuacct -> cpu,cpuacct drwxr-xr-x 5 root root 0 Nov 20 11:38 cpu,cpuacct drwxr-xr-x 3 root root 0 Nov 20 11:38 cpuset drwxr-xr-x 4 root root 0 Nov 20 11:38 devices drwxr-xr-x 3 root root 0 Nov 20 11:38 freezer drwxr-xr-x 3 root root 0 Nov 20 11:38 hugetlb drwxr-xr-x 5 root root 0 Nov 20 11:38 memory lrwxrwxrwx 1 root root 16 Nov 20 11:38 net_cls -> net_cls,net_prio drwxr-xr-x 3 root root 0 Nov 20 11:38 net_cls,net_prio lrwxrwxrwx 1 root root 16 Nov 20 11:38 net_prio -> net_cls,net_prio drwxr-xr-x 3 root root 0 Nov 20 11:38 perf_event drwxr-xr-x 4 root root 0 Nov 20 11:38 pids drwxr-xr-x 4 root root 0 Nov 20 11:38 systemd
不同的文件目錄里面,存儲不同的資源種類(lèi)被限制的值,其中,比較常用的:
blkio:為塊設備設置i/o限制,一般用于磁盤(pán)等設備
cpuset:為進(jìn)程分配單獨的CPU核心和對應的內存節點(diǎn)
memory:為進(jìn)程設定內存使用的限制。
當我們通過(guò)命令啟動(dòng)容器之后,操作系統會(huì )把這個(gè)docker進(jìn)程對應的PID填寫(xiě)到對應控制組的文件中,從而控制當前進(jìn)程使用的CPU資源值。
Docker 包括三個(gè)基本概念:
這三部分組成了Docker的整個(gè)生命周期,如上圖所示。
docker鏡像包含了文件系統,類(lèi)似于虛擬機的鏡像,它是只讀的模板。這個(gè)文件系統也通常被稱(chēng)之為rootfs,通常包含了bin、etc、sys、usr等一系列目錄。
docker容器是由鏡像實(shí)例化而來(lái)的,這和我們學(xué)習的面向對象的概念十分相似,我們可以把鏡像想象成類(lèi),把容器想象成類(lèi)經(jīng)過(guò)實(shí)例化后的對象,這樣就非常好理解鏡像和容器的關(guān)系了。
docker倉庫:類(lèi)似與代碼倉庫,是Docker集中存放鏡像文件的場(chǎng)所
這個(gè)關(guān)系可以更加清楚的表述為:
以上就是詳解docker容器的概念的詳細內容,更多關(guān)于docker容器的概念的資料請關(guān)注腳本之家其它相關(guān)文章!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站