換個角度看Docker

2021-08-04 15:58:04 字數 1688 閱讀 5027

這篇解析將會涉及:

在開始討論前,先丟擲一些問題,可先別急著檢視答案,討論的過程可以讓答案更有趣,問題如下:

先來理解一下虛擬機器概念,廣義來說,虛擬機器是一種模擬系統,即在軟體層面上通過模擬硬體的輸入和輸出,讓虛擬機器的作業系統得以執行在沒有物理硬體的環境中(也就是宿主機的作業系統上),其中能夠模擬出硬體輸入輸出,讓虛擬機器的作業系統可以啟動起來的程式,被叫做hypervisor。用一張圖來說明這個關係就是:

在這張圖中:

當然android模擬機乙個大問題就是:啟動速度非常慢,最長可達10分鐘或以上,這是因為單純模擬硬體的輸入輸出,效率是很差的,所以這樣的虛擬機器如果真部署在伺服器上,速度是感人的。

這個時候,就有計算機科學家提出了非常偷懶的想法:假如我們不模擬硬體輸入輸出,只是做下真實硬體輸入輸出的搬運工,那麼虛擬機器的指令執行速度,就可以和宿主機一致了。當然這前提是宿主機的硬體架構必須和虛擬硬體架構一致。比如,

由於本篇並不是主要關於虛擬機器的內容,所以這些點就點到而止。

一般來說,虛擬機器都會有自己的kernel,自己的硬體,這樣虛擬機器啟動的時候需要先做開機自檢,啟動kernel,啟動使用者程序等一系列行為,雖然現在電腦執行速度挺快,但是這一系列檢查做下來,也要幾十秒,也就是虛擬機器需要幾十秒來啟動。

至此就可以回答引言提到的兩個問題:

q: docker 容器有自己的kernel嗎?

a: 沒有,docker和宿主機共享kernel

q: docker的kernel version由映象確定還是由宿主機確定

a: 由宿主機決定

接下來討論linux啟動流程 中,容器需要使用其中的幾步?

linux的啟動流程如下圖:

在講解容器之前,先來談談linux實現程序的原理,linux實現程序的方法為fork,實現的方式分為兩個步驟:

在記憶體中複製乙個父程序,得到「子程序」,此時子程序就是父程序上下文的簡單轉殖,內容完全一致

設定子程序的 pid,parent_pid,以及其他和父程序不一致的內容

從程序被製造的步驟可以看出,程序大部分資源和父程序共享,如果需要製造乙個看起來像虛擬機器的程序,我們需要比普通的程序多做幾步。

如果做完這幾步,至少在程序自身看來,和虛擬機器執行環境上已經區別不大了,對應到linux系統中,這幾個隔離需要的方法:clone(2) - linux manual page

而clone方法和fork方法,在複製上下文的時候,呼叫的都是syscall_clone() 本質上它們是差不多的。

所以雖然docker幫助我們準備好了rootfs位址,映象裡面的檔案,以及各種資源隔離的配置,但是在啟動乙個容器的時候,它只是呼叫系統中早已內建的可以隔離資源的方法,而kernel支援這些方法,也是在建立程序的方法上做了一層資源隔離的擴充套件而已。

這就解釋了docker兩個特性:

讓我們再來看看前面提出的問題:linux啟動流程 中,容器需要使用其中的幾步?

看完了fork,clone以及一大堆隔離後,相信很容易有答案了,這中間容器做完了隔離之後就算啟動完畢,根本就不會來做kernel init之類的步驟,所以答案是一步都不用。

換個角度看理財

個人理財不僅是金融規劃,要從掙 賺 省 防四個方面入手。雖然越來越多的經理人開始重視理財,但真正熟悉理財的卻不多。理財包含哪些內容?應該怎樣做?介紹理財的四個方面和應注意的一些問題。什麼是理財 個人理財是在既定的理財目標下,充分分析個人財物現狀和風險承擔能力,通過平衡安排各種收入與支出,選擇不同風險...

換個角度看世界

換個角度看世界 jack zhai 人與動物的差別是人類有思想 做事善總結,所以人類的進化是加速式的 時間上呈指數性的。但你知道,人的一生都是在不停的改變自己 有人說是否定自己 隨著年齡的長大,社會角色的變化,自我心態的變化,人的思想也在變化,很多人說這是成熟的表現,我看不全是,是看世界的角度在變化...

換個角度看MVC中的耦合性

換個角度看mvc中的耦合性 在mvc模式的主動通知中有兩種通知方案 1,模型僅僅是通知檢視,模型發生了改變,至於具體發生了哪些改變並沒有告訴檢視,需要檢視在得到通知後,根據自己的興趣點去主動查詢模型中的相關資料。2,模型在通知檢視時同時攜帶改通知相關的資料 這些資料通常可以滿足檢視進行更新的需要 這...