Docker基本概念和麪試常見問題

Docker基本概念

由於不同機器不同的操作系統上,不同的庫和不同的組件,如果要將一個應用部署到多臺機器上就需要有大量的環境配置的操作。而且配環境是非常麻煩的事情,不同的系統下庫版本可能不同或者有的機器是物理斷網的很多環境配置上就很麻煩。

Docker主要解決了環境配置的問題,它是一種虛擬化技術,對進程進行隔離,被隔離的進程獨立於宿主的操作系統和其他隔離進程。

Docker和虛擬機的比較

虛擬機也是一種虛擬化的技術,和docker最大的區別時,它通過模擬硬件,並在硬件上安裝操作系統來實現。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-GjvhR2fT-1585938868332)(en-resource://database/902:0)]
從結構上看,左邊需要GuestOS層,左邊的Hypervisor層被右邊的Docker Engine層代替了。
我們需要知道的是GuestOS層是虛擬機安裝的操作系統,是一個完整的內核,Hypervisor是硬件虛擬化平臺。

虛擬機實現資源隔離的方式是利用獨立的GuestOS,以及利用Hypervisor虛擬化CPU、內存、IO設備等來實現的,因此Docker明顯來的更加輕量。

Docker利用的是當前的namespace來實現不同容器之間的隔離,利用了cgroup實現了對資源的隔離,利用了鏡像實例實現了和環境的隔離。

消耗的資源上來分析,docker除了運行的進程需要消耗資源外,系統的開銷非常小。而傳統的虛擬機就消耗就非常大,需要有多個操作系統。

傳統虛擬機的實現是在硬件層面上進行虛擬化,因此需要在虛擬化的硬件上在安裝操作系統,需要內核應用程序、庫文件;
Docker是在操作系統層面上的虛擬化,如果是在linux上就可以直接用linux的內核,每個container就使用虛擬化出來的迷你linux操作系統,就不需要從操作系統開始安裝。

優缺點,從啓動速度、佔用資源、遷移維護擴展效率上來談。

Docker在windows上使用

docker在windows上使用的時候實際上是內置了一個迷你的linux系統,因此虛擬化的時候就是根據迷你係統虛擬化出來。

Docker的分層原理

Docker的層次結構是建立在images的內容是靜態的基礎上的,當把images設爲靜態之後之前的東西就都是不可改的了,要改就只能創建一個新的容器,在容器的基礎上來修改; 創建容器的過程就相當於在原有靜態內容上多加了一個層,把容器中的操作記錄在這一層裏。

爲什麼採用分層結構呢?
其實和動態鏈接庫的概念有點像,就是想要達到鏡像複用的目的。 對於某個基礎鏡像我們可以在其基礎上不斷更新不同的分支,但是內存裏基礎鏡像只需要保存一個即可,其他的衍生鏡像的底層都是基礎鏡像分出來的。

如果修改了系統配置信息,那麼基礎鏡像會發生改變嗎?
不會的,所有的操作都只會保留在新的容器層上,等運行鏡像的時候會從基礎鏡像層一層一層往外走,所以容器層的操作最後能夠順利進行(如修改系統配置信息)。

修改文件的過程

添加文件:在容器中創建文件時,新文件被添加到容器層中。
讀取文件:在容器中讀取某個文件時,Docker 會從上往下依次在各鏡像層中查找此文件。一旦找到,立即將其複製到容器層,然後打開並讀入內存。
修改文件:在容器中修改已存在的文件時,Docker 會從上往下依次在各鏡像層中查找此文件。一旦找到,立即將其複製到容器層,然後修改之。
刪除文件:在容器中刪除文件時,Docker 也是從上往下依次在鏡像層中查找此文件。找到後,會在容器層中記錄下此刪除操作。
只有當需要修改時才複製一份數據,這種特性被稱作 Copy-on-Write。可見,容器層保存的是鏡像變化的部分,不會對鏡像本身進行任何修改。這樣就解釋了我們前面提出的問題:容器層記錄對鏡像的修改,所有鏡像層都是隻讀的,不會被容器修改,所以鏡像可以被多個容器共享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章