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

Docker?exec?的實(shí)現(xiàn)原理介紹

 更新時(shí)間:2022年04月02日 09:22:29   作者:wzlinux  
這篇文章主要介紹了Docker?exec的實(shí)現(xiàn)原理,詳細(xì)解讀了docker?exec這個(gè)操作背后,Linux?Namespace更具體的工作原理,這種通過(guò)操作系統(tǒng)進(jìn)程相關(guān)的知識(shí),逐步剖析Docker容器的方法,需要的朋友可以參考一下

我使用了 docker exec 命令進(jìn)入到了容器當(dāng)中。在了解了Linux Namespace 的隔離機(jī)制后,你應(yīng)該會(huì)很自然地想到一個(gè)問(wèn)題:docker exec 是怎么做到進(jìn)入容器里的呢?
實(shí)際上,Linux Namespace 創(chuàng)建的隔離空間雖然看不見(jiàn)摸不著,但一個(gè)進(jìn)程的 Namespace 信息在宿主機(jī)上是確確實(shí)實(shí)存在的,并且是以一個(gè)文件的方式存在。

比如,通過(guò)如下指令,你可以看到當(dāng)前正在運(yùn)行的 Docker 容器的進(jìn)程號(hào)(PID)是 25686:

$ docker inspect --format '{{ .State.Pid }}' 4ddf4638572d
25686

這時(shí),你可以通過(guò)查看宿主機(jī)的 proc 文件,看到這個(gè) 25686 進(jìn)程的所有 Namespace 對(duì)應(yīng)的文件:

$ ls -l /proc/25686/ns
total 0
lrwxrwxrwx 1 root root 0 Aug 13 14:05 cgroup -> cgroup:[4026531835]
lrwxrwxrwx 1 root root 0 Aug 13 14:05 ipc -> ipc:[4026532278]
lrwxrwxrwx 1 root root 0 Aug 13 14:05 mnt -> mnt:[4026532276]
lrwxrwxrwx 1 root root 0 Aug 13 14:05 net -> net:[4026532281]
lrwxrwxrwx 1 root root 0 Aug 13 14:05 pid -> pid:[4026532279]
lrwxrwxrwx 1 root root 0 Aug 13 14:05 pid_for_children -> pid:[4026532279]
lrwxrwxrwx 1 root root 0 Aug 13 14:05 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 Aug 13 14:05 uts -> uts:[4026532277]

可以看到,一個(gè)進(jìn)程的每種Linux Namespace,都在它對(duì)應(yīng)的 /proc/[進(jìn)程號(hào)]/ns 下有一個(gè)對(duì)應(yīng)的虛擬文件,并且鏈接到一個(gè)真實(shí)的 Namespace 文件上。
有了這樣一個(gè)可以“hold 住”所有 Linux Namespace 的文件,我們就可以對(duì) Namespace 做一些很有意義事情了,比如:加入到一個(gè)已經(jīng)存在的 Namespace 當(dāng)中。

這也就意味著:一個(gè)進(jìn)程,可以選擇加入到某個(gè)進(jìn)程已有的 Namespace 當(dāng)中,從而達(dá)到“進(jìn)入”這個(gè)進(jìn)程所在容器的目的,這正是 docker exec 的實(shí)現(xiàn)原理。

而這個(gè)操作所依賴的,乃是一個(gè)名叫 setns() 的 Linux 系統(tǒng)調(diào)用。它的調(diào)用方法,我可以用如下一段小程序?yàn)槟阏f(shuō)明:

#define _GNU_SOURCE
#include <fcntl.h>
#include <sched.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

#define errExit(msg) do { perror(msg); exit(EXIT_FAILURE);} while (0)

int main(int argc, char *argv[]) {
int fd;

fd = open(argv[1], O_RDONLY);
if (setns(fd, 0) == -1) {
errExit("setns");
}
execvp(argv[2], &argv[2]);
errExit("execvp");
}

這段代碼功能非常簡(jiǎn)單:它一共接收兩個(gè)參數(shù),第一個(gè)參數(shù)是 argv[1],即當(dāng)前進(jìn)程要加入的 Namespace 文件的路徑,比如/proc/25686/ns/net;而第二個(gè)參數(shù),則是你要在這個(gè) Namespace 里運(yùn)行的進(jìn)程,比如 /bin/bash。

這段代碼的的核心操作,則是通過(guò) open() 系統(tǒng)調(diào)用打開(kāi)了指定的 Namespace 文件,并把這個(gè)文件的描述符 fd 交給 setns() 使用。在 setns() 執(zhí)行后,當(dāng)前進(jìn)程就加入了這個(gè)文件對(duì)應(yīng)的 Linux Namespace 當(dāng)中了。

現(xiàn)在,你可以編譯執(zhí)行一下這個(gè)程序,加入到容器進(jìn)程(PID=25686)的 Network Namespace 中:

$ gcc -o set_ns set_ns.c
$ ./set_ns /proc/25686/ns/net /bin/bash
$ ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:ac:11:00:02
inet addr:172.17.0.2 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80::42:acff:fe11:2/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:12 errors:0 dropped:0 overruns:0 frame:0
TX packets:10 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:976 (976.0 B) TX bytes:796 (796.0 B)

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

正如上所示,當(dāng)我們執(zhí)行 ifconfig 命令查看網(wǎng)絡(luò)設(shè)備時(shí),我會(huì)發(fā)現(xiàn)能看到的網(wǎng)卡“變少”了:只有兩個(gè)。而我的宿主機(jī)則至少有四個(gè)網(wǎng)卡。這是怎么回事呢?
實(shí)際上,在 setns() 之后我看到的這兩個(gè)網(wǎng)卡,正是我在前面啟動(dòng)的 Docker 容器里的網(wǎng)卡。也就是說(shuō),我新創(chuàng)建的這個(gè) /bin/bash 進(jìn)程,由于加入了該容器進(jìn)程(PID=25686)的 Network Namepace,它看到的網(wǎng)絡(luò)設(shè)備與這個(gè)容器里是一樣的,即:/bin/bash 進(jìn)程的網(wǎng)絡(luò)設(shè)備視圖,也被修改了。
而一旦一個(gè)進(jìn)程加入到了另一個(gè) Namespace 當(dāng)中,在宿主機(jī)的 Namespace 文件上,也會(huì)有所體現(xiàn)。

在宿主機(jī)上,你可以用 ps 指令找到這個(gè) set_ns 程序執(zhí)行的 /bin/bash 進(jìn)程,其真實(shí)的 PID 是 28499:

# 在宿主機(jī)上
ps aux | grep /bin/bash
root 28499 0.0 0.0 19944 3612 pts/0 S 14:15 0:00 /bin/bash

這時(shí),如果按照前面介紹過(guò)的方法,查看一下這個(gè) PID=28499 的進(jìn)程的 Namespace,你就會(huì)發(fā)現(xiàn)這樣一個(gè)事實(shí):

$ ls -l /proc/28499/ns/net
lrwxrwxrwx 1 root root 0 Aug 13 14:18 /proc/28499/ns/net -> net:[4026532281]

$ ls -l /proc/25686/ns/net
lrwxrwxrwx 1 root root 0 Aug 13 14:05 /proc/25686/ns/net -> net:[4026532281]

/proc/[PID]/ns/net 目錄下,這個(gè) PID=28499 進(jìn)程,與我們前面的 Docker 容器進(jìn)程(PID=25686)指向的 Network Namespace 文件完全一樣。這說(shuō)明這兩個(gè)進(jìn)程,共享了這個(gè)名叫net:[4026532281] 的 Network Namespace。
此外,Docker 還專門提供了一個(gè)參數(shù),可以讓你啟動(dòng)一個(gè)容器并“加入”到另一個(gè)容器的 Network Namespace 里,這個(gè)參數(shù)就是 -net,比如:

$ docker run -it --net container:4ddf4638572d busybox ifconfig

這樣,我們新啟動(dòng)的這個(gè)容器,就會(huì)直接加入到 ID=4ddf4638572d 的容器,也就是我們前面的創(chuàng)建的應(yīng)用容器(PID=25686)的Network Namespace 中。所以,這里 ifconfig 返回的網(wǎng)卡信息,跟我前面那個(gè)小程序返回的結(jié)果一模一樣,你也可以嘗試一下。
而如果我指定–net=host,就意味著這個(gè)容器不會(huì)為進(jìn)程啟用 Network Namespace。這就意味著,這個(gè)容器拆除了 Network Namespace 的“隔離墻”,所以,它會(huì)和宿主機(jī)上的其他普通進(jìn)程一樣,直接共享宿主機(jī)的網(wǎng)絡(luò)棧。這就為容器直接操作和使用宿主機(jī)網(wǎng)絡(luò)提供了一個(gè)渠道。

到此這篇關(guān)于Docker exec 的實(shí)現(xiàn)原理介紹的文章就介紹到這了,更多相關(guān)Docker exec 的實(shí)現(xiàn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • docker私有倉(cāng)庫(kù)harbor搭建過(guò)程

    docker私有倉(cāng)庫(kù)harbor搭建過(guò)程

    這篇文章主要介紹了docker私有倉(cāng)庫(kù)harbor搭建過(guò)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • docker配置鏡像加速器的方法步驟

    docker配置鏡像加速器的方法步驟

    國(guó)內(nèi)常見(jiàn)的Docker鏡像加速器包括阿里云、網(wǎng)易云、騰訊云等,本文主要介紹了docker配置鏡像加速器的方法步驟,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-05-05
  • Docker核心原理之 Cgroup詳解

    Docker核心原理之 Cgroup詳解

    cgroup的內(nèi)核通過(guò)hook鉤子來(lái)實(shí)現(xiàn)管理進(jìn)程資源,提供了一個(gè)統(tǒng)一的接口,從單個(gè)進(jìn)程的資源控制到操作系統(tǒng)層面的虛擬卡的過(guò)渡,今天通過(guò)本文給大家介紹Docker核心原理之 Cgroup詳解,需要的朋友參考下吧
    2021-07-07
  • Ubuntu系統(tǒng)下docker?Pull鏡像錯(cuò)誤timeout解決辦法

    Ubuntu系統(tǒng)下docker?Pull鏡像錯(cuò)誤timeout解決辦法

    最近在用docker搭個(gè)開(kāi)發(fā)環(huán)境,發(fā)現(xiàn)在拉取鏡像的時(shí)候有點(diǎn)問(wèn)題,這篇文章主要給大家介紹了關(guān)于Ubuntu系統(tǒng)下docker?Pull鏡像錯(cuò)誤timeout的解決辦法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-07-07
  • docker倉(cāng)庫(kù)數(shù)據(jù)傳輸加密的問(wèn)題小結(jié)

    docker倉(cāng)庫(kù)數(shù)據(jù)傳輸加密的問(wèn)題小結(jié)

    這篇文章主要介紹了docker倉(cāng)庫(kù)數(shù)據(jù)傳輸加密的問(wèn)題小結(jié),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-12-12
  • docker連接spring boot和mysql容器方法介紹

    docker連接spring boot和mysql容器方法介紹

    這篇文章主要介紹了docker連接spring boot和mysql容器方法介紹,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-10-10
  • 教你如何獲取Harbor的帶tag的鏡像清單

    教你如何獲取Harbor的帶tag的鏡像清單

    這篇文章主要介紹了如何利用Java語(yǔ)言實(shí)現(xiàn)獲取harbor中全部鏡像的帶tag的清單,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-04-04
  • 解決docker run后容器出現(xiàn)Exited (0)情況的問(wèn)題

    解決docker run后容器出現(xiàn)Exited (0)情況的問(wèn)題

    這篇文章主要介紹了解決docker run后容器出現(xiàn)Exited (0)情況的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-03-03
  • Docker 中的 bootfs、rootfs 簡(jiǎn)介

    Docker 中的 bootfs、rootfs 簡(jiǎn)介

    Docker中的bootfs和rootfs是容器文件系統(tǒng)的兩個(gè)層次,bootfs負(fù)責(zé)內(nèi)核啟動(dòng),而rootfs提供運(yùn)行環(huán)境,容器共享宿主機(jī)內(nèi)核,因此沒(méi)有獨(dú)立的bootfs,只使用精簡(jiǎn)的rootfs,感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • docker 移除掉運(yùn)行不正常的container操作

    docker 移除掉運(yùn)行不正常的container操作

    這篇文章主要介紹了docker 移除掉運(yùn)行不正常的container操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-03-03

最新評(píng)論

泸西县| 贡山| 新宁县| 阳江市| 思茅市| 佛教| 孟州市| 萝北县| 黄石市| 宜良县| 青海省| 秭归县| 苏尼特右旗| 手游| 本溪| 林芝县| 徐闻县| 扬州市| 石泉县| 公主岭市| 澄城县| 五河县| 日照市| 正蓝旗| 花莲市| 淮北市| 辽阳市| 大悟县| 富宁县| 汝南县| 平武县| 大化| 仁怀市| 志丹县| 中超| 锡林浩特市| 双流县| 佛坪县| 遂宁市| 天全县| 长春市|