簡述對於docker的大體認識

 最近3天用零散時間藉助官網和一些簡單教程資料學習了一下docker,稍微談一下自己的認識和理解。


Docker與虛擬機區別的理解


 很多初學人會很難區分docker和虛擬機的區別,因爲用起來給人的感覺是一樣的,都差不多,但實際上這兩者從設計初衷就不一樣。學過或者說了解過Linux內核的人都知道,docker是基於內核中的cgroup和namespace這兩者對進程進行封裝隔離,這是屬於操作系統層面的虛擬化技術。之所以稱之爲容器,因爲他是獨立於宿主和其他的隔離的進程。傳統虛擬機是虛擬出一套硬件後,在上面運行一個完整的操作系統。相對於虛擬機來說,docker使用的是宿主機器的內核,沒有虛擬硬件,虛擬機是使用的自己的內核。因此相比來說,這就體現出了docker的輕便指出,也就知道了爲什麼安裝一個虛擬機需要十幾個G,而一個docker容器運行起來只有簡單的幾百M。

 引用網上的圖例,這裏我就不再畫了:

虛擬機:


Docker


 從圖上可以看出,根本的區別在於,docker是用docker的守護進程(docker daemon)來管理容器裏面所有的進程,對應的虛擬機的架構是對硬件層面的虛擬化。


鏡像和容器的理解


 這兩者的區別也是在最初學習階段比較難以區分理解的兩個概念。

鏡像


 首先我們知道操作系統分爲內核和用戶空間。對於Linux而言,內核啓動之後,會掛載root文件系統爲其提供用戶空間支持。那麼一個docker鏡像中都有什麼,根據上面的我們已知docker是基於namespace來的,鏡像中不含有內核,根據官方給出的文檔,鏡像相當於是一個root文件系統。比如官方給出的Ubuntu:16.04鏡像中只有最小系統的root文件系統。
其實docker竟像是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源資源、配置等文件外,還包含了一些爲運行時準備的一些配置參數(如匿名卷、環境變量、用戶等)。鏡像不包含任何動態數據,其內容在構建之後也不會被改變。

容器


 容器和鏡像的關係可以用面向對象編程語言中的類和實例一樣,類是靜態的定義,實例是運行中的實體,放到這裏理解,這個例子最合適不過了。容器實際上是進程,可以通過docker top+容器ID或者docker inspect -f '{{.State.Pid}}' CONTAINERID也可以看得到,再就是通過docker exec進入到容器裏面通過cgroup.procs文件。容器的進程與直接在宿主執行的進程不同,因爲有自己獨立命名空間。因此他有自己的文件系統、網絡配置、進程空間、自己的用戶ID空間。

以上就是最近學習docker的心得和自己的理解,如有錯誤還請指正。

參考:

1.https://docs.docker.com/

2.https://gitee.com/docker_practice/docker_practice

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