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

從進程中去理解?Docker隔離技術(shù)

 更新時間:2022年04月02日 10:40:26   作者:wzlinux  
這篇文章主要介紹了從進程中去理解?Docker隔離技術(shù),Docker?公司發(fā)布的?Docker?項目具有里程碑式的意義;Docker?項目通過“容器鏡像”,解決了應用打包這個根本性難題,下文更多相關(guān)資料,需要的朋友可以參考一下

1、起源

“容器”這項技術(shù)的來龍去脈:

  • 容器技術(shù)的興起源于 PaaS 技術(shù)的普及;
  • Docker 公司發(fā)布的 Docker 項目具有里程碑式的意義;
  • Docker 項目通過“容器鏡像”,解決了應用打包這個根本性難題。

容器本身沒有價值,有價值的是“容器編排”。

也正因為如此,容器技術(shù)生態(tài)才爆發(fā)了一場關(guān)于“容器編排”的“戰(zhàn)爭”。而這次戰(zhàn)爭,最終以 Kubernetes 項目和 CNCF 社區(qū)的勝利而告終。

容器,到底是怎么一回事兒?

容器其實是一種沙盒技術(shù)。顧名思義,沙盒就是能夠像一個集裝箱一樣,把你的應用“裝”起來的技術(shù)。這樣,應用與應用之間,就因為有了邊界而不至于相互干擾;而被裝進集裝箱的應用,也可以被方便地搬來搬去,這不就是 PaaS 最理想的狀態(tài)嘛。
不過,這兩個能力說起來簡單,但要用技術(shù)手段去實現(xiàn)它們,可能大多數(shù)人就無從下手了。

2、容器類比進程

所以,我就先來跟你說說這個“邊界”的實現(xiàn)手段。

假如,現(xiàn)在你要寫一個計算加法的小程序,這個程序需要的輸入來自于一個文件,計算完成后的結(jié)果則輸出到另一個文件中。
由于計算機只認識 0 和 1,所以無論用哪種語言編寫這段代碼,最后都需要通過某種方式翻譯成二進制文件,才能在計算機操作系統(tǒng)中運行起來。
而為了能夠讓這些代碼正常運行,我們往往還要給它提供數(shù)據(jù),比如我們這個加法程序所需要的輸入文件。這些數(shù)據(jù)加上代碼本身的二進制文件,放在磁盤上,就是我們平常所說的一個“程序”,也叫代碼的可執(zhí)行鏡像(executable image)。
然后,我們就可以在計算機上運行這個“程序”了。
首先,操作系統(tǒng)從“程序”中發(fā)現(xiàn)輸入數(shù)據(jù)保存在一個文件中,所以這些數(shù)據(jù)就被會加載到內(nèi)存中待命。同時,操作系統(tǒng)又讀取到了計算加法的指令,這時,它就需要指示 CPU 完成加法操作。而 CPU 與內(nèi)存協(xié)作進行加法計算,又會使用寄存器存放數(shù)值、內(nèi)存堆棧保存執(zhí)行的命令和變量。同時,計算機里還有被打開的文件,以及各種各樣的 I/O 設備在不斷地調(diào)用中修改自己的狀態(tài)。
就這樣,一旦“程序”被執(zhí)行起來,它就從磁盤上的二進制文件,變成了計算機內(nèi)存中的數(shù)據(jù)、寄存器里的值、堆棧中的指令、被打開的文件,以及各種設備的狀態(tài)信息的一個集合。像這樣一個程序運起來后的計算機執(zhí)行環(huán)境的總和,就是我們今天的主角:進程。

所以,對于進程來說,它的靜態(tài)表現(xiàn)就是程序,平常都安安靜靜地待在磁盤上;而一旦運行起來,它就變成了計算機里的數(shù)據(jù)和狀態(tài)的總和,這就是它的動態(tài)表現(xiàn)。
容器技術(shù)的核心功能,就是通過約束和修改進程的動態(tài)表現(xiàn),從而為其創(chuàng)造出一個“邊界”。

3、隔離技術(shù)

對于 Docker 等大多數(shù) Linux 容器來說,Cgroups 技術(shù)是用來制造約束的主要手段,而 Namespace 技術(shù)則是用來修改進程視圖的主要方法。
你可能會覺得 Cgroups 和 Namespace 這兩個概念很抽象,別擔心,接下來我們一起動手實踐一下,你就很容易理解這兩項技術(shù)了。
假設你已經(jīng)有了一個 Linux 操作系統(tǒng)上的 Docker 項目在運行,比如我的環(huán)境是 Ubuntu 16.04 和 Docker CE 18.05
接下來,讓我們首先創(chuàng)建一個容器來試試。

$ docker run -it busybox /bin/sh
/ #

這個命令是 Docker 項目最重要的一個操作,即大名鼎鼎的 docker run。
而 -it 參數(shù)告訴了 Docker 項目在啟動容器后,需要給我們分配一個文本輸入 / 輸出環(huán)境,也就是 TTY,跟容器的標準輸入相關(guān)聯(lián),這樣我們就可以和這個 Docker 容器進行交互了。而 /bin/sh 就是我們要在 Docker 容器里運行的程序。
所以,上面這條指令翻譯成人類的語言就是:請幫我啟動一個容器,在容器里執(zhí)行 /bin/sh,并且給我分配一個命令行終端跟這個容器交互。
這樣,我的 Ubuntu 16.04 機器就變成了一個宿主機,而一個運行著 /bin/sh 的容器,就跑在了這個宿主機里面。
上面的例子和原理,如果你已經(jīng)玩過 Docker,一定不會感到陌生。此時,如果我們在容器里執(zhí)行一下 ps 指令,

就會發(fā)現(xiàn)一些更有趣的事情:

/ # ps
PID USER TIME COMMAND
1 root 0:00 /bin/sh
10 root 0:00 ps

可以看到,我們在 Docker 里最開始執(zhí)行的 /bin/sh,就是這個容器內(nèi)部的第 1 號進程(PID=1),而這個容器里一共只有兩個進程在運行。這就意味著,前面執(zhí)行的 /bin/sh,以及我們剛剛執(zhí)行的 ps,已經(jīng)被 Docker 隔離在了一個跟宿主機完全不同的世界當中。
這究竟是怎么做到呢?
本來,每當我們在宿主機上運行了一個 /bin/sh 程序,操作系統(tǒng)都會給它分配一個進程編號,比如 PID=100。這個編號是進程的唯一標識,就像員工的工牌一樣。所以 PID=100,可以粗略地理解為這個 /bin/sh 是我們公司里的第 100 號員工,而第 1 號員工就自然是比爾 · 蓋茨這樣統(tǒng)領全局的人物。
而現(xiàn)在,我們要通過 Docker 把這個 /bin/sh 程序運行在一個容器當中。這時候,Docker 就會在這個第 100 號員工入職時給他施一個“障眼法”,讓他永遠看不到前面的其他 99 個員工,更看不到比爾 · 蓋茨。這樣,他就會錯誤地以為自己就是公司里的第 1 號員工。
這種機制,其實就是對被隔離應用的進程空間做了手腳,使得這些進程只能看到重新計算過的進程編號,比如 PID=1??蓪嶋H上,他們在宿主機的操作系統(tǒng)里,還是原來的第 100 號進程。

這種技術(shù),就是 Linux 里面的 Namespace 機制。而 Namespace 的使用方式也非常有意思:它其實只是 Linux 創(chuàng)建新進程的一個可選參數(shù)。我們知道,在 Linux 系統(tǒng)中創(chuàng)建線程的系統(tǒng)調(diào)用是 clone(),

比如:

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

這個系統(tǒng)調(diào)用就會為我們創(chuàng)建一個新的進程,并且返回它的進程號 pid。
而當我們用 clone() 系統(tǒng)調(diào)用創(chuàng)建一個新進程時,就可以在參數(shù)中指定 CLONE_NEWPID 參數(shù),比如:

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

這時,新創(chuàng)建的這個進程將會“看到”一個全新的進程空間,在這個進程空間里,它的 PID 是 1。之所以說“看到”,是因為這只是一個“障眼法”,在宿主機真實的進程空間里,這個進程的 PID 還是真實的數(shù)值,比如 100。
當然,我們還可以多次執(zhí)行上面的 clone() 調(diào)用,這樣就會創(chuàng)建多個 PID Namespace,而每個 Namespace 里的應用進程,都會認為自己是當前容器里的第 1 號進程,它們既看不到宿主機里真正的進程空間,也看不到其他 PID Namespace 里的具體情況。
除了我們剛剛用到的 PID Namespace,Linux 操作系統(tǒng)還提供了 Mount、UTS、IPC、Network 和 User 這些 Namespace,用來對各種不同的進程上下文進行“障眼法”操作。

比如,Mount Namespace,用于讓被隔離進程只看到當前 Namespace 里的掛載點信息;Network Namespace,用于讓被隔離進程看到當前 Namespace 里的網(wǎng)絡設備和配置。

這,就是 Linux 容器最基本的實現(xiàn)原理了。

所以,Docker 容器這個聽起來玄而又玄的概念,實際上是在創(chuàng)建容器進程時,指定了這個進程所需要啟用的一組 Namespace 參數(shù)。這樣,容器就只能“看”到當前 Namespace 所限定的資源、文件、設備、狀態(tài),或者配置。而對于宿主機以及其他不相關(guān)的程序,它就完全看不到了。

所以說,容器,其實是一種特殊的進程而已。

4、總結(jié)

談到為“進程劃分一個獨立空間”的思想,相信你一定會聯(lián)想到虛擬機。而且,你應該還看過一張?zhí)摂M機和容器的對比圖。

從進程去理解 Docker (29) _k8s

這幅圖的左邊,畫出了虛擬機的工作原理。其中,名為 Hypervisor 的軟件是虛擬機最主要的部分。它通過硬件虛擬化功能,模擬出了運行一個操作系統(tǒng)需要的各種硬件,比如 CPU、內(nèi)存、I/O 設備等等。然后,它在這些虛擬的硬件上安裝了一個新的操作系統(tǒng),即 Guest OS。
這樣,用戶的應用進程就可以運行在這個虛擬的機器中,它能看到的自然也只有 Guest OS 的文件和目錄,以及這個機器里的虛擬設備。這就是為什么虛擬機也能起到將不同的應用進程相互隔離的作用。
而這幅圖的右邊,則用一個名為 Docker Engine 的軟件替換了 Hypervisor。這也是為什么,很多人會把 Docker 項目稱為“輕量級”虛擬化技術(shù)的原因,實際上就是把虛擬機的概念套在了容器上。

可是這樣的說法,卻并不嚴謹。

在理解了 Namespace 的工作方式之后,你就會明白,跟真實存在的虛擬機不同,在使用 Docker 的時候,并沒有一個真正的“Docker 容器”運行在宿主機里面。Docker 項目幫助用戶啟動的,還是原來的應用進程,只不過在創(chuàng)建這些進程時,Docker 為它們加上了各種各樣的 Namespace 參數(shù)。
這時,這些進程就會覺得自己是各自PID Namespace 里的第 1 號進程,只能看到各自 Mount Namespace 里掛載的目錄和文件,只能訪問到各自 Network Namespace 里的網(wǎng)絡設備,就仿佛運行在一個個“容器”里面,與世隔絕。

到此這篇關(guān)于從進程中去理解 Docker隔離技術(shù)的文章就介紹到這了,更多相關(guān)Docker隔離技術(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解docker 容器不自動退出結(jié)束運行的方法

    詳解docker 容器不自動退出結(jié)束運行的方法

    本文主要簡單介紹 docker 容器與前置進程的關(guān)系,以及如何編寫 Dockerfile/docker-compose.yml 優(yōu)雅的讓容器可以常駐運行。具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • 在Docker中的ubuntu中安裝Python3和Pip的問題

    在Docker中的ubuntu中安裝Python3和Pip的問題

    這篇文章主要介紹了在Docker中的ubuntu中安裝Python3和Pip的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • docker搭建redis主從哨兵集群的實現(xiàn)步驟

    docker搭建redis主從哨兵集群的實現(xiàn)步驟

    本文主要介紹了docker搭建redis主從哨兵集群的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • 手把手教你實現(xiàn)給Docker開啟IPv6網(wǎng)絡支持

    手把手教你實現(xiàn)給Docker開啟IPv6網(wǎng)絡支持

    這篇文章主要為大家介紹了Docker開啟IPv6網(wǎng)絡支持實現(xiàn)方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • 一步步教你用docker部署postgreSQL數(shù)據(jù)庫

    一步步教你用docker部署postgreSQL數(shù)據(jù)庫

    這篇文章主要給大家介紹了關(guān)于如何使用docker部署postgreSQL數(shù)據(jù)庫的相關(guān)資料,PostgreSQL是一款功能豐富的關(guān)系型數(shù)據(jù)庫,類似于MySQL,它也是受歡迎程度非常高的,需要的朋友可以參考下
    2023-11-11
  • 使用Docker搭建Java環(huán)境的步驟方法

    使用Docker搭建Java環(huán)境的步驟方法

    本篇文章主要介紹了使用Docker搭建Java環(huán)境的步驟方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • 解決使用Docker Compose管理容器的問題

    解決使用Docker Compose管理容器的問題

    在Docker Compose中,根據(jù)一個配置文件,將所有與應用系統(tǒng)相關(guān)的應用和對應的容器進行配置,再根據(jù)Docker Compose提供的命令進行啟動,就可以解決上面說的多容器之間的復雜問題,感興趣的朋友跟隨小編一起看看吧
    2021-09-09
  • docker中修改鏡像容器的存放目錄的方法

    docker中修改鏡像容器的存放目錄的方法

    本篇文章主要介紹了docker中修改鏡像容器的存放目錄的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • iptables使用及docker的iptables規(guī)則

    iptables使用及docker的iptables規(guī)則

    Docker在創(chuàng)建容器時,會自動添加一些iptables規(guī)則來實現(xiàn)網(wǎng)絡隔離和轉(zhuǎn)發(fā)等功能,本文主要介紹了iptables使用及docker的iptables規(guī)則,具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • 關(guān)于Docker容器內(nèi)部無法解析域名問題的解決

    關(guān)于Docker容器內(nèi)部無法解析域名問題的解決

    最近工作中遇到一個問題,項目內(nèi)部需要訪問外網(wǎng),但上傳文件,但是一直報unknown host,無法解析域名,所以下面這篇文章主要給大家介紹了關(guān)于Docker容器內(nèi)部無法解析域名問題的解決方法,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-07-07

最新評論