最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

docker容器的原理分析

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

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

      今天的重點(diǎn)問題是講述清楚什么是容器。

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

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

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

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

1、先查看下我們機(jī)器上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命令(關(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ā)現(xiàn),mysqld這個(gè)進(jìn)程的進(jìn)程號(hào)是1.

這里我要多嘴一下:

1、docker exec -it 4784586d01e0 bash

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

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

apt-get update & apt-get install procps

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

[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ā)現(xiàn)進(jìn)程號(hào)是18853。

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

為什么會(huì)這樣?

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

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

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

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

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

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

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

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

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

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

    容器一旦開始運(yùn)行,我們需要控制它使用的機(jī)器資源,例如磁盤、內(nèi)存、CPU等,否則它可能會(huì)耗盡物理機(jī)的資源,導(dǎo)致一些系統(tǒng)進(jìn)程發(fā)生崩潰。Cgroup技術(shù)就是專門為Linux進(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

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

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

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

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

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

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

Docker 包括三個(gè)基本概念:

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

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

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

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

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

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

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

相關(guān)文章

  • docker-compose如何自定義network

    docker-compose如何自定義network

    文章介紹了在DockerCompose中如何通過networks配置定義和使用橋接網(wǎng)絡(luò),包括如何在docker-compose.yml文件中指定使用bridge網(wǎng)絡(luò),服務(wù)間的通信方式以及如何為服務(wù)分配特定的IP地址
    2025-01-01
  • docker中nginx卸載、安裝、配置及掛載詳細(xì)教程

    docker中nginx卸載、安裝、配置及掛載詳細(xì)教程

    這篇文章主要給大家介紹了關(guān)于docker中nginx卸載、安裝、配置及掛載的相關(guān)資料,文中通過實(shí)例代碼介紹是非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-09-09
  • win10家庭版安裝docker遇到的問題小結(jié)

    win10家庭版安裝docker遇到的問題小結(jié)

    這篇文章主要介紹了win10家庭版安裝docker遇到的問題小結(jié),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-10-10
  • idea連接docker實(shí)現(xiàn)一鍵部署的方法

    idea連接docker實(shí)現(xiàn)一鍵部署的方法

    這篇文章主要介紹了idea連接docker實(shí)現(xiàn)一鍵部署的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • docker 復(fù)制容器的項(xiàng)目實(shí)踐

    docker 復(fù)制容器的項(xiàng)目實(shí)踐

    本文主要介紹了docker 復(fù)制容器的項(xiàng)目實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-11-11
  • Jenkins Docker靜態(tài)agent節(jié)點(diǎn)的構(gòu)建過程

    Jenkins Docker靜態(tài)agent節(jié)點(diǎn)的構(gòu)建過程

    這篇文章主要介紹了Jenkins Docker靜態(tài)agent節(jié)點(diǎn)的構(gòu)建,靜態(tài)節(jié)點(diǎn)就是通過java -jar這條命令去啟動(dòng)起來就可以了,本文通過圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-10-10
  • 使用Shell腳本批量啟停Docker服務(wù)

    使用Shell腳本批量啟停Docker服務(wù)

    最近日常測試中經(jīng)常需要手動(dòng)啟動(dòng)或停止docker,于是決定寫一個(gè)Shell腳本來代替人工操作,下面小編把我實(shí)現(xiàn)過程分享到腳本之家平臺(tái),需要的朋友參考下
    2019-11-11
  • 輕量級(jí)對(duì)象存儲(chǔ)服務(wù)minio安裝及瀏覽器使用教程

    輕量級(jí)對(duì)象存儲(chǔ)服務(wù)minio安裝及瀏覽器使用教程

    本次介紹了minio的安裝及瀏覽器中的簡單使用,對(duì)輕量級(jí)對(duì)象存儲(chǔ)服務(wù)minio安裝及使用教程感興趣的朋友一起看看吧
    2021-10-10
  • Docker中搭建配置Git環(huán)境的過程

    Docker中搭建配置Git環(huán)境的過程

    工作中遇到了需要在Docker環(huán)境中操作GitLab倉庫的場景,需要事先在Docker中搭好Git環(huán)境,但是很多朋友不是很清楚Docker配置Git環(huán)境的過程,今天通過本文給大家詳細(xì)介紹下,需要的朋友參考下吧
    2021-08-08
  • 搭建一個(gè)私有的Docker registry教程

    搭建一個(gè)私有的Docker registry教程

    這篇文章提供了一個(gè)非常務(wù)實(shí)的方法來處理搭建私有Docker registry時(shí)出現(xiàn)的各種錯(cuò)綜復(fù)雜的情況。我們將會(huì)使用一個(gè)運(yùn)行于DigitalOcean(之后簡稱為DO)的非常小巧的512MB VPS 實(shí)例
    2016-09-09

最新評(píng)論

信阳市| 绍兴市| 托克托县| 白银市| 海盐县| 孝昌县| 周至县| 双鸭山市| 咸丰县| 阳西县| 孟州市| 略阳县| 阳泉市| 花莲市| 阿城市| 阳原县| 顺义区| 凤翔县| 缙云县| 铁岭县| 亚东县| 涡阳县| 星座| 永州市| 大庆市| 施秉县| 宁明县| 江城| 公安县| 东城区| 鱼台县| 军事| 惠安县| 隆子县| 河津市| 毕节市| 河北区| 安达市| 陆川县| 萨迦县| 墨脱县|