欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Docker 特性與原理詳細(xì)介紹與解析

 更新時(shí)間:2016年10月12日 10:39:11   作者:破修電腦的  
這篇文章主要介紹了Docker 特性與原理的相關(guān)資料,大家在了解基本命令和基本知識(shí)后,來(lái)看下原理性的通信,需要的朋友可以參考下

Docker 特性與原理

首先看看Docker提供了哪些特性:

  1. 交互式Shell:Docker可以分配一個(gè)虛擬終端并關(guān)聯(lián)到任何容器的標(biāo)準(zhǔn)輸入上,例如運(yùn)行一個(gè)一次性交互shell
  2. 文件系統(tǒng)隔離:每個(gè)進(jìn)程容器運(yùn)行在完全獨(dú)立的根文件系統(tǒng)里
  3. 寫(xiě)時(shí)復(fù)制:采用寫(xiě)時(shí)復(fù)制方式創(chuàng)建根文件系統(tǒng),這讓部署變得極其快捷,并且節(jié)省內(nèi)存和硬盤(pán)空間
  4. 資源隔離:可以使用cgroup為每個(gè)進(jìn)程容器分配不同的系統(tǒng)資源
  5. 網(wǎng)絡(luò)隔離:每個(gè)進(jìn)程容器運(yùn)行在自己的網(wǎng)絡(luò)命名空間里,擁有自己的虛擬接口和IP地址
  6. 日志記錄:Docker將會(huì)收集和記錄每個(gè)進(jìn)程容器的標(biāo)準(zhǔn)流(stdout/stderr/stdin),用于實(shí)時(shí)檢索或批量檢索
  7. 變更管理:容器文件系統(tǒng)的變更可以提交到新的映像中,并可重復(fù)使用以創(chuàng)建更多的容器。無(wú)需使用模板或手動(dòng)配置

從以上特性分別看實(shí)現(xiàn)原理

1. 交互式Shell

首先我們?cè)试S一個(gè)交互式的容器

$docker run -i -t <image name> /bin/bash

這樣就建立了一個(gè)到容器內(nèi)的交互式連接,看到的是如下的命令行:

root@df3880b17407:/#

這里我們啟動(dòng)了一個(gè)容器,以bash作為其根進(jìn)程.

root@df3880b17407:/# ps aux 
USER    PID %CPU %MEM  VSZ  RSS TTY   STAT START  TIME COMMAND
root     1 0.0 0.0 18164 2020 ?    S  06:06  0:00 /bin/bash

可以看到,在這個(gè)容器中,bash 的 PID為 1,而實(shí)體機(jī)平常情況下,是這樣的:

root@ubuntu:~# ps aux 
USER    PID %CPU %MEM  VSZ  RSS TTY   STAT START  TIME COMMAND
root     1 0.0 0.1 24716 2612 ?    Ss  Sep04  0:01 /sbin/init

大家都知道,所有進(jìn)程的共同祖先都是 PID=1的進(jìn)程

所以在容器中,所有以后創(chuàng)建的進(jìn)程都是通過(guò)/bin/bash 創(chuàng)建的,PID=1的 bash是容器中所有進(jìn)程的祖先理解了這點(diǎn)后,對(duì)容器的理解就很簡(jiǎn)單了.

2. 文件系統(tǒng)隔離

對(duì)于一個(gè)正在運(yùn)行的容器,其文件系統(tǒng)都是一個(gè)從根目錄開(kāi)始的虛擬文件系統(tǒng),在容器中看到的是這樣的:

root@df3880b17407:/# ll /
total 68
drwxr-xr-x  2 root root 4096 Jul 22 22:51 bin
drwxr-xr-x  2 root root 4096 Apr 10 22:12 boot
drwxr-xr-x  3 root root 4096 Jul 22 22:49 dev
drwxr-xr-x 85 root root 4096 Sep 5 06:49 etc
drwxr-xr-x  2 root root 4096 Apr 10 22:12 home
drwxr-xr-x 16 root root 4096 Jul 22 22:50 lib
drwxr-xr-x  2 root root 4096 Aug 12 03:30 lib64
drwxr-xr-x  2 root root 4096 Jul 22 22:48 media
drwxr-xr-x  2 root root 4096 Apr 10 22:12 mnt
drwxr-xr-x  2 root root 4096 Jul 22 22:48 opt
dr-xr-xr-x 356 root root  0 Sep 5 06:06 proc
drwx------  2 root root 4096 Jul 22 22:51 root
drwxr-xr-x  7 root root 4096 Sep 5 07:23 run
drwxr-xr-x  2 root root 4096 Aug 12 03:30 sbin
drwxr-xr-x  2 root root 4096 Jul 22 22:48 srv
dr-xr-xr-x 13 root root  0 Sep 5 06:06 sys
drwxrwxrwt  2 root root 4096 Sep 5 06:55 tmp
drwxr-xr-x 20 root root 4096 Sep 5 06:11 usr
drwxr-xr-x 19 root root 4096 Sep 5 06:11 var

其實(shí)真是情況是這樣的,容器中的文件系統(tǒng)都是掛載到了真是系統(tǒng)中的一個(gè)目錄下面.

/var/lib/docker/containers/<image-long-id>/rootfs

這個(gè)配置是怎么來(lái)的呢,其實(shí)所有容器的管理都是通過(guò)lxc來(lái)管理的,lxc的配置文件放在

/var/lib/docker/containers/<image-long-id>/config.lxc

文件中有字段表示容器掛載到哪個(gè)文件目錄, 比如我的是這樣的:

lxc.rootfs = /var/lib/docker/containers/df3880b17407575cd642a6b7da3c7e417a55fad5bbd63152f89921925626d2b6/rootfs

打開(kāi)看一下,一目了然:

root@ubuntu:/var/lib/docker/containers/df3880b17407575cd642a6b7da3c7e417a55fad5bbd63152f89921925626d2b6/rootfs# ll
total 84
drwxr-xr-x 53 root root 4096 Sep 5 00:23 ./
drwx------ 4 root root 4096 Sep 5 00:53 ../
drwxr-xr-x 2 root root 4096 Jul 22 15:51 bin/
drwxr-xr-x 2 root root 4096 Apr 10 15:12 boot/
drwxr-xr-x 3 root root 4096 Jul 22 15:49 dev/
drwxr-xr-x 85 root root 4096 Sep 4 23:49 etc/
drwxr-xr-x 2 root root 4096 Apr 10 15:12 home/
drwxr-xr-x 16 root root 4096 Jul 22 15:50 lib/
drwxr-xr-x 2 root root 4096 Aug 11 20:30 lib64/
drwxr-xr-x 2 root root 4096 Jul 22 15:48 media/
drwxr-xr-x 2 root root 4096 Apr 10 15:12 mnt/
drwxr-xr-x 2 root root 4096 Jul 22 15:48 opt/
drwxr-xr-x 2 root root 4096 Apr 10 15:12 proc/
drwx------ 2 root root 4096 Jul 22 15:51 root/
drwxr-xr-x 7 root root 4096 Sep 5 00:23 run/
drwxr-xr-x 2 root root 4096 Aug 11 20:30 sbin/
drwxr-xr-x 2 root root 4096 Jul 22 15:48 srv/
drwxr-xr-x 2 root root 4096 Mar 12 18:41 sys/
drwxrwxrwt 2 root root 4096 Sep 4 23:55 tmp/
drwxr-xr-x 20 root root 4096 Sep 4 23:11 usr/
drwxr-xr-x 19 root root 4096 Sep 4 23:11 var/

這些就是容器中的真實(shí)目錄了,容器中對(duì)于目錄的操作都是操作了這個(gè)host機(jī)器的真實(shí)目錄。
對(duì)于不同的容器,掛載點(diǎn)是不一樣的,而容器不能穿越根目錄上一級(jí)去訪問(wèn), 所以這里對(duì)每一個(gè)容器都做到了文件系統(tǒng)隔離。

3. 寫(xiě)時(shí)復(fù)制

我們把每一個(gè)

/var/lib/docker/containers/<image-long-id>

看做是一個(gè)容器的配置目錄的話,可以看到在配置目錄下面有一個(gè) rw/目錄,打開(kāi)看有些什么

total 36
drwxr-xr-x 9 root root 4096 Sep 5 00:23 ./
drwx------ 4 root root 4096 Sep 5 00:53 ../
drwxr-xr-x 6 root root 4096 Sep 4 23:49 etc/
drwxr-xr-x 2 root root 4096 Sep 5 00:23 run/
drwxrwxrwt 2 root root 4096 Sep 4 23:55 tmp/
drwxr-xr-x 7 root root 4096 Sep 4 23:11 usr/
drwxr-xr-x 5 root root 4096 Sep 4 23:11 var/
-r--r--r-- 1 root root  0 Sep 4 23:06 .wh..wh.aufs
drwx------ 2 root root 4096 Sep 4 23:06 .wh..wh.orph/
drwx------ 2 root root 4096 Sep 4 23:11 .wh..wh.plnk/

里面是一些不完整的根目錄,這不能說(shuō)明什么,但是我們?cè)赾ontainer中寫(xiě)入文件后,看看其中的變化

在容器中執(zhí)行以下命令

root@df3880b17407:/# touch /opt/x

/opt 下我們生成了一個(gè)文件

再看看

root@ubuntu:/var/lib/docker/containers/df3880b17407575cd642a6b7da3c7e417a55fad5bbd63152f89921925626d2b6/rw# ll
total 40
drwxr-xr-x 10 root root 4096 Sep 5 01:00 ./
drwx------ 4 root root 4096 Sep 5 00:53 ../
drwxr-xr-x 6 root root 4096 Sep 4 23:49 etc/
drwxr-xr-x 2 root root 4096 Sep 5 01:00 opt/
drwxr-xr-x 2 root root 4096 Sep 5 00:23 run/
drwxrwxrwt 2 root root 4096 Sep 4 23:55 tmp/
drwxr-xr-x 7 root root 4096 Sep 4 23:11 usr/
drwxr-xr-x 5 root root 4096 Sep 4 23:11 var/
-r--r--r-- 1 root root  0 Sep 4 23:06 .wh..wh.aufs
drwx------ 2 root root 4096 Sep 4 23:06 .wh..wh.orph/
drwx------ 2 root root 4096 Sep 4 23:11 .wh..wh.plnk/

是的,在host機(jī)器上新生成了 opt/目錄,這里做到了容器的寫(xiě)時(shí)復(fù)制

4. 資源隔離

以系統(tǒng)的三大進(jìn)程間通信的消息隊(duì)列來(lái)看

初始狀態(tài)在 ghost, ipcs -q 查看消息隊(duì)列

root@ubuntu:~/codes/msq# ipcs -q

------ Message Queues --------
key    msqid   owner   perms   used-bytes  messages  

ghost 創(chuàng)建一個(gè), 這里樓主自己寫(xiě)的代碼創(chuàng)建的消息隊(duì)列:

root@ubuntu:~/codes/msq# ./main 1
Create msq with key id 65536root@ubuntu:~/codes/msq# ipcs -q

------ Message Queues --------
key    msqid   owner   perms   used-bytes  messages  
0x00000001 65536   root    666    0      0      

然后在容器中查看 ipcs -q

root@df3880b17407:/# ipcs -q

------ Message Queues --------
key    msqid   owner   perms   used-bytes  messages 

可以看到系統(tǒng)資源是隔離的,這里只是說(shuō)了一部分,其實(shí)還包括了可以通過(guò)cgoup對(duì)其做CPU和Memory的Quota管理.
默認(rèn)情況下是使用了所有CPU和內(nèi)存的,但是可以在config.lxc增加如下配置設(shè)置CPU等,具體可以參考lxc的文檔

lxc.cgroup.cpu.shares=512 lxc.cgroup.cpuset.cpus=1.2

資源隔離的原理就在于利用cgroup,將不同進(jìn)程的使用隔離開(kāi),假設(shè)每個(gè)容器都是以bash啟動(dòng)的,那么在容器內(nèi)部,每個(gè)子進(jìn)程都只能使用當(dāng)前bash下面的資源,對(duì)于其他的系統(tǒng)資源是隔離的.子進(jìn)程的訪問(wèn)權(quán)限由父進(jìn)程決定

5.網(wǎng)絡(luò)隔離

在安裝好docker后,會(huì)默認(rèn)初始化一個(gè) docker0的網(wǎng)橋

docker0  Link encap:Ethernet HWaddr ee:8c:1f:8b:d7:59 
     inet addr:172.17.42.1 Bcast:0.0.0.0 Mask:255.255.0.0
     ...

在host機(jī)器上,會(huì)為每一個(gè)容器生成一個(gè)默認(rèn)的網(wǎng)卡類(lèi)似這樣的 vethdBVa1H veth*

這個(gè)網(wǎng)卡的一端連接在容器的eth0,一端連接到docker0.這樣就實(shí)現(xiàn)了每個(gè)容器有一個(gè)單獨(dú)的IP.

這里如果需要容器訪問(wèn)外網(wǎng),需要將eth0設(shè)置為混雜模式:

$ifconfig eth0 promisc

這樣看來(lái),容器會(huì)從172.17.0.0/24 這個(gè)網(wǎng)段選擇一個(gè)IP作為eth0的IP,這樣,容器就可以和外部通過(guò) docker0網(wǎng)橋通信了.

在容器內(nèi)部監(jiān)聽(tīng)一個(gè)端口 python -m SimpleHTTPServer 80 >> /tmp/log.log &
從ghost訪問(wèn) telnet 172.17.0.2 80
在容器中看到如下:

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address      Foreign Address     State    PID/Program name
tcp    0   0 0.0.0.0:80       0.0.0.0:*        LISTEN   2823/python   
tcp    0   0 172.17.0.2:80      172.17.42.1:46142    TIME_WAIT  - 

在host上看到

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address      Foreign Address     State    PID/Program name
tcp    0   0 172.17.42.1:46142    172.17.0.2:80      ESTABLISHED 10244/telnet

如果需要外部能夠訪問(wèn)容器,需要做端口映射規(guī)則,和配置虛擬機(jī)一樣的道理, 只不過(guò)這里可以看到的是,80端口并沒(méi)有占用了本地端口,而是在容器內(nèi)部做了監(jiān)聽(tīng),外部是通過(guò)docker0 橋接過(guò)去的,每個(gè)容器間也做到了端口和網(wǎng)絡(luò)隔離.

6.日志記錄

不多說(shuō),在 /var/lib/docker/containers/<image-long-id>.log 下

7.變更管理

Docker的變更管理看做是git的版本管理好了。

生成鏡像的時(shí)候,未做改動(dòng)的部分就是上一個(gè)版本的鏡像的引用,如果做了改動(dòng),就是一個(gè)新的文件。

將剛才操作的容器做成鏡像

docker commit <image-id> <REPOSITORY>

此時(shí)的鏡像多出來(lái)的部分,比如我在這個(gè)鏡像中安裝了Python,那么多出來(lái)的部分作為新文件,其他部分任然是上一個(gè)版本的引用。

你可以搭建自己的鏡像服務(wù)器,push到自己的鏡像服務(wù)器,從其他機(jī)器拉下來(lái)后直接可以運(yùn)行。

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • Docker鏡像拉取報(bào)錯(cuò):Error response from daemon: Get https://registry-1.docker.io/v2/的問(wèn)題解決

    Docker鏡像拉取報(bào)錯(cuò):Error response from daemon: 

    這篇文章主要介紹了Docker鏡像拉取報(bào)錯(cuò):Error response from daemon: Get https://registry-1.docker.io/v2/的問(wèn)題解決,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • jenkins+gitlab+nginx部署前端應(yīng)用實(shí)現(xiàn)

    jenkins+gitlab+nginx部署前端應(yīng)用實(shí)現(xiàn)

    在日常開(kāi)發(fā)中,往往可能同時(shí)多個(gè)項(xiàng)目并行進(jìn)行開(kāi)發(fā),本文介紹了jenkins+gitlab+nginx部署前端應(yīng)用實(shí)現(xiàn),感興趣的可以了解一下
    2021-05-05
  • 聊聊Docker中容器的創(chuàng)建與啟停問(wèn)題

    聊聊Docker中容器的創(chuàng)建與啟停問(wèn)題

    一個(gè)進(jìn)程可以視為一個(gè)被執(zhí)行的應(yīng)用程序,同樣,一個(gè)Docker容器可以視為一個(gè)運(yùn)行中的Docker鏡像,這篇文章主要介紹了Docker中容器的創(chuàng)建與啟停,需要的朋友可以參考下
    2022-06-06
  • 安裝harbor作為docker鏡像倉(cāng)庫(kù)的問(wèn)題

    安裝harbor作為docker鏡像倉(cāng)庫(kù)的問(wèn)題

    這篇文章主要介紹了安裝harbor作為docker鏡像倉(cāng)庫(kù),主要包括docker和docker-compose離線部署,安裝harbor作為本地的倉(cāng)庫(kù),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • Ubuntu?環(huán)境下安裝?Docker環(huán)境詳解

    Ubuntu?環(huán)境下安裝?Docker環(huán)境詳解

    這篇文章主要介紹了Ubuntu?環(huán)境下安裝?Docker環(huán)境詳解的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • 利用Docker部署PostgreSQL 12.4主從方式

    利用Docker部署PostgreSQL 12.4主從方式

    這篇文章主要介紹了利用Docker部署PostgreSQL 12.4主從方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • docker運(yùn)行PostgreSQL數(shù)據(jù)庫(kù)維護(hù)執(zhí)行腳本備份數(shù)據(jù)庫(kù)與更新表結(jié)構(gòu)的方法

    docker運(yùn)行PostgreSQL數(shù)據(jù)庫(kù)維護(hù)執(zhí)行腳本備份數(shù)據(jù)庫(kù)與更新表結(jié)構(gòu)的方法

    這篇文章主要介紹了docker運(yùn)行PostgreSQL數(shù)據(jù)庫(kù)維護(hù),執(zhí)行腳本備份數(shù)據(jù)庫(kù)與更新表結(jié)構(gòu),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-05-05
  • Docker搭建部署Node項(xiàng)目的方法步驟

    Docker搭建部署Node項(xiàng)目的方法步驟

    本文主要介紹了Docker搭建部署Node項(xiàng)目的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Docker安裝mysql并解決中文亂碼問(wèn)題

    Docker安裝mysql并解決中文亂碼問(wèn)題

    本文主要介紹了Docker安裝mysql并解決中文亂碼問(wèn)題本人親自測(cè)試,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Docker安裝MinIO的實(shí)現(xiàn)示例

    Docker安裝MinIO的實(shí)現(xiàn)示例

    本文主要介紹了Docker安裝MinIO的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08

最新評(píng)論