亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

docker容器的原理分析

 更新時間:2021年04月19日 10:13:06   作者:DBA隨筆  
這篇文章主要介紹了docker容器的相關資料,幫助大家更好的理解和學習使用docker容器,感興趣的朋友可以了解下

01 容器的本質是什么?

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

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

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

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

    現在我們來看一個MySQL容器的進程特點。

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、首先我們通過docker exec命令(關于這條命令的介紹,下面會有講述)進入一個容器里面,ps -ef命令查看進程:

[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這個進程的進程號是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 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ā)現進程號是18853。

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

為什么會這樣?

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

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

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

02 Cgroup技術和Namespace技術介紹

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

int pid = clone(main_function, stack_size, SIGCHLD, NULL);

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

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

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

    當然,不是所有的資源都能夠被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 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

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

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容器是由鏡像實例化而來的,這和我們學習的面向對象的概念十分相似,我們可以把鏡像想象成類,把容器想象成類經過實例化后的對象,這樣就非常好理解鏡像和容器的關系了。

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

這個關系可以更加清楚的表述為:

以上就是詳解docker容器的概念的詳細內容,更多關于docker容器的概念的資料請關注腳本之家其它相關文章!

相關文章

  • docker?掛載、修改文件的步驟

    docker?掛載、修改文件的步驟

    這篇文章主要介紹了docker?掛載、修改文件的步驟,咱們使用的是docker的 copy 命令從容器中 copy 出來相關的配置文件,在本地修改,修改完畢在使用docker的 copy 命令從本地 copy 到容器中,重啟容器生效的,需要的朋友可以參考下
    2023-03-03
  • Docker兩個容器互相請求接口的實現

    Docker兩個容器互相請求接口的實現

    在Docker中,容器通過Docker網絡進行相互通信,本文就來介紹一下Docker兩個容器互相請求接口的實現,感興趣的可以了解一下,感興趣的可以了解一下
    2023-11-11
  • 詳解使用?docker?compose?部署?golang?的?Athens?私有代理問題

    詳解使用?docker?compose?部署?golang?的?Athens?私有代理問題

    這篇文章主要介紹了使用?docker-compose?部署?golang?的?Athens?私有代理,幫助大家快速學習athens 如何構建私有代理,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • Docker常見指令詳解

    Docker常見指令詳解

    Docker是一個開放源代碼軟件,用于自動化部署應用程序為輕量級、可移植的容器,運行在幾乎任何地方,常用指令包括docker?pull下載鏡像,docker?images查看鏡像,docker?rmi移除鏡像等,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • docker-compose如何單獨更新某個服務

    docker-compose如何單獨更新某個服務

    這篇文章主要介紹了docker-compose如何單獨更新某個服務問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • docker 復制容器的實現步驟

    docker 復制容器的實現步驟

    本文主要介紹了docker 復制容器的實現步驟,主要介紹了三種方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-10-10
  • docker容器添加對外映射端口的實現

    docker容器添加對外映射端口的實現

    本文主要介紹了docker容器添加對外映射端口的實現 ,從而實現容器與外部網絡的通信,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-09-09
  • 運行docker需要的權限分析

    運行docker需要的權限分析

    在本篇文章了小編給各位分享的是一篇關于運行docker需要的權限分析,有興趣的朋友們可以參考下。
    2020-03-03
  • Docker容器互相連接三種實現方法詳解

    Docker容器互相連接三種實現方法詳解

    這篇文章主要介紹了Docker容器互連三種實現方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05
  • Docker中iptables規(guī)則在iptables重啟后丟失的完整過程

    Docker中iptables規(guī)則在iptables重啟后丟失的完整過程

    這篇文章主要給大家介紹了關于Docker中iptables規(guī)則在iptables重啟后丟失的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Docker具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2020-05-05

最新評論