docker中pod是組合的多容器執行單元的意思;pod是Kubernetes裡的一個基礎單元,可以看做是容器的擴充套件或者增強型的容器,把多個程序打包在一個「Name Space」裡的時候,就構成了一個pod,pod裡面不同程序的應用包裝仍然是獨立的。
本教學操作環境:linux7.3系統、docker19.03版、Dell G3電腦。
Pod是一種組合的多容器執行單元,也是Kubernetes裡的一個基礎單元。你可以把它看作是一種容器的擴充套件或者增強型的容器。Pod裡面包括一個主容器和數個輔助容器,它們共同完成一個特定的功能。把多個程序(容器也是一種隔離的程序)打包在一個Name Space裡的時候,就構成了一個Pod。Pod裡面不同程序的應用包裝仍然是獨立的(每個容器都會有自己的映象)。
Pod的意義在於,它可以既保持主容器和輔助容器的的密切關係,又保持主容器的獨立性。由於主容器和輔助容器的生命週期相同,可以同時被建立和銷燬,因此把它們放在一個Pod中,可以使他們的互動更加高效。
而另一方面,主容器需要完成一些主要的工作,而另一些工作可能是有共性的,就可以單獨打包由輔助容器來執行。
擴充套件知識
容器是什麼?
要給容器下一個準確的定義,是一件不容易的事情,因為每個人看待容器的視角有所不同。在劉俊輝看來,容器既是一種計算單元的提供方式;又是一種應用的包裝形式。
- 容器是一種計算單元
作為一種計算單元,容器與執行緒、程序、虛擬機器器、物理機一樣(如下圖所示)。在連續尺度上,越往左隔離性、安全性和開銷越低,越往右則越高。而容器則恰恰是介於程序和虛擬機器器之間的一種計算單元。
但並非所有的應用都適合選擇容器,開發者可以根據自己應用的特點和需求選擇最適合的計算單元。例如,你的應用是高效能、互信的,且處於同一個管理區域,那麼用執行緒或者程序就可以滿足;但如果你的應用是多租戶的,並且和其他應用執行在同一個空間,那麼你就需要考慮如何將這些應用安全地隔離開,使得資料不會被洩露或效能受到影響。那麼這時,容器也許就是一個不錯的選擇了。
因為容器是一個「高度隔離的程序」,它在一般程序的隔離基礎上又增加了新的隔離機制,這些隔離機制是使用Linux的核心提供的,它包括一些名稱空間(Name Spaces)和CGroup。名稱空間可以分為網路、儲存和計算三大類。其中,最為重要的是網路名稱空間。它保證了容器的網路是獨立於其他容器網路的。每個容器自己看到的檔案系統和其他容器的是不共用的,每個容器只能看到自己的程序ID,而程序編號也是連續的。
而說到容器與虛擬機器器最大的區別,劉俊輝認為,相對於虛擬機器器,容器最大的特徵是它沒有自己獨立的作業系統,而是共用其宿主機上的一個作業系統;而虛擬機器器則執行在「一臺獨立的伺服器上」。因此,容器相比於虛擬機器器的成本會小,但隔離性卻有所欠缺。
- 容器是一種應用的包裝形式
有過應用開發經驗的人都知道,應用並不是一個單一的可執行檔案,一個稍微複雜一點的應用包括多個部分,包括:程式碼、可執行檔案、設定依賴、外部依賴(動態連結庫)等。
所以在應用發行包裝的時候,需要考慮目標作業系統的版本、系統架構以及它所依賴的模組等因素。否則應用安裝時會改動系統的不同部分。
而容器作為一個應用的包裝,它最大的特點就是實現了應用的獨立和便攜,容器本身包含了應用所有的依賴,這使得它可以再任意的基礎設施上執行,不會因為系統版本、架構的問題,而導致各種意外。
簡單來說,Docker可以看作是一個非常成功的容器管理平臺。Docker最重要的部分就是它的執行管理環境(如下圖所示)。
正如上面所說,容器是一個計算單元,那麼Docker的執行環境就是用來建立、管理和銷燬這些計算單元的。在建立和管理這些計算單元的時候,需要用到計算單元的包裝(也就是它的軟體發行包),這些包裝以容器映象的方式存放在它的執行環境中,所有的容器計算單元都是通過這些映象來建立的。
但映象本身會有版本的釋出、升級等需求,這就涉及到Docker的另一個重要組成部分DockerHub了。DockerHub有點像蘋果的App Store,它是一個非常大的「容器市場」,所有常用的軟體都可以在DockerHub上找到。
最後一個Docker的重要模組,就是使用者介面和管理工具,它們用來向容器的執行環境釋出命令或檢視狀態。只需要用一個Docker的命令加上一些引數,就可以實現建立、刪除、檢視容器的執行情況等操作。
接下來我們就來看看Docker的實際操作情況,我們會以執行一個Hello World的容器為例,講講Docker的使用情況。其實,只需要安裝好Docker就可以嘗試執行這個Hello World的容器了。
通過下面程式碼,我們來看看Docker做了些什麼:
首先我們看到Docker在本地要去找Hello World最新版本的映象,它發現本地並沒有這個映象後去DockerHub上把這個映象給下載了下來。然後,這個映象就被執行了,之後Docker後臺就建立了這樣一個容器。
Docker的出現,讓容器應用管理變得非常輕鬆,執行容器只需要一個命令就可以實現。而從DockerHub上下載映象、建立各種各樣的隔離環境、建立容器與外部的網路通訊環境都可以由Docker來完成。可以說Docker可以管理容器的整個生命週期。
作為對容器的總結,我們可以把容器最大的特點歸納為輕量級和完全獨立部署。這兩大特點與雲原生的彈性無限擴充套件和按需使用的定位十分吻合,也正因為如此,容器成為了雲原生的基石。
雖然容器和虛擬機器器都是計算單元,但從虛擬機器器到容器,並不能看做是一個簡單的效能提升或架構的改變,而是一種應用理念的改變。
舉個例子,從前伐木工人看書的時候會用斧子,後來大家覺得用斧子太費力氣,有個高人就介紹了另一個砍樹的工具「鋸子」。但如果伐木工人拿著鋸子去砍樹的話,會發現還沒有斧子好用。但事實是,斧子和鋸子是兩種使用的理念。
而說回容器和虛擬機器器理念的不同,我們可以通過下面的圖表來進一步感受。
容器的典型應用可以分為兩類,一類是微服務,一類是DevOps。
微服務是指系統的不同單元或功能執行不同的容器,每一個服務的容器數量可以根據自己的負載進行調整。比如,一個大系統包含使用者登入、貨品展示、貨品互動等功能,但這個系統的各個部分並不是同時線性增加的,有些部分可能忙一些,有些部分的容量可能還有富餘。
DevOps是指開發者、測試、生產過程流水線化。因為容器的「自包含」特性,當它作為標準的流通物品,可以使開發環境、測試環境和生產環境的應用包裝完全一致,這樣就減少了應用由於依賴關係設定錯誤等導致的意外,從而使得開發、測試、生產的整個流水線變得更高效。
Pod是一種組合的多容器執行單元,也是Kubernetes裡的一個基礎單元。你可以把它看作是一種容器的擴充套件或者增強型的容器。Pod裡面包括一個主容器和數個輔助容器,它們共同完成一個特定的功能。把多個程序(容器也是一種隔離的程序)打包在一個Name Space裡的時候,就構成了一個Pod。Pod裡面不同程序的應用包裝仍然是獨立的(每個容器都會有自己的映象)。
Pod的意義在於,它可以既保持主容器和輔助容器的的密切關係,又保持主容器的獨立性。由於主容器和輔助容器的生命週期相同,可以同時被建立和銷燬,因此把它們放在一個Pod中,可以使他們的互動更加高效。
而另一方面,主容器需要完成一些主要的工作,而另一些工作可能是有共性的,就可以單獨打包由輔助容器來執行。
非常推薦大家去一個叫Katacoda的網站,它上面有大量免費的線上實驗,包括Docker及Docker Image等動手操作專案,而且現在是完全免費的。大家不妨去這裡動手實操起來。
當一個容器平臺執行多個租戶應用的時候,很容易發生「側向攻擊」,即程序利用系統的漏洞來進行許可權提升,例如把自己的許可權升級成管理員,從而獲得對系統上執行的其他程序或容器的操作許可權。目前這類漏洞通常會導致惡意的使用計算資源用來「挖礦」。
針對這一問題,目前有兩種解決方案,一種是「限制系統呼叫」;一種是「獨立核心」。
限制系統呼叫,指的是通過限制應用的系統呼叫,來降低應用的能力,從而避免對其他應用的危害。目前,Google的Givsor和IBM的Nabla都是採用的這種做法。如下圖所示,原來一個應用會存取到所有的系統呼叫,但在Nabla的模式下,應用只會存取必要的系統呼叫,其他呼叫則都被遮蔽了。
但這種方法的弊端在於,它需要你在一開始就要給應用開放「恰到好處」的許可權,如果一不小心沒有開放足夠的許可權,那應用就可能會崩潰。
獨立核心則參考了虛擬機器器的解決方案,它是指在容器中增加一個新的核心,這個核心是輕量化的,包括「微核心」和Unikernel兩種實現方式。Unikernel和應用是編譯在一起的,它們之間可以直接通過函數呼叫,而不需要系統呼叫。
這一方案的好處在於,容器本質上只是跟自己的核心打交道,而核心則是跟宿主機打交道,核心與宿主機的互動只需要一些通用的指令即可,不涉及到直接呼叫到危害系統的指令。目前Kata Container和京東智聯雲原生容器,就是採用的這種方式。
這種方式的好處在於,微核心作為一個最小化的作業系統,可以滿足所有系統的呼叫,同時去除一些不必要的系統操作部分;它的系統啟動時間非常短,可以達到秒級,同時開銷比虛擬機器器要小。
推薦學習:《》
以上就是docker中pod是什麼意思的詳細內容,更多請關注TW511.COM其它相關文章!