1. 程式人生 > 實用技巧 >Docker學習一:簡單理解docker技術原理

Docker學習一:簡單理解docker技術原理

備註:學習素材來源於拉鉤教育課程:https://kaiwu.lagou.com/course/courseInfo.htm?courseId=455#/detail/pc?id=4572

一、雛形chroot

首先了解下docker最早的雛形chroot:

  chroot是在unix系統的一個操作,針對正在運作的軟體行程和它的子程序,改變它外顯的根目錄。一個執行在這個環境下,經由chroot設定根目錄的程式,它不能夠對這個指定根目錄之外的檔案進行訪問動作,不能讀取,也不能更改它的內容。

  通俗的說,chroot可以限制程式執行的根目錄,使之不能訪問其他目錄。

通過如下命令建立一個模擬的系統:

mkdir rootdfs
cd rootfs 
docker export $(docker create busybox) 
-o busybox.tar tar -xf busybox.tar

檢視rootdfs目錄下檔案:

使用以下命令,可以啟動一個 sh 程序,並且把 /data/rootfs 作為 sh 程序的根目錄

# chroot /data/rootfs /bin/sh

進入sh程序後執行/bin/ls命令檢視檔案,可以發現檔案已經和主程序隔離:

繼續執行/bin/ip route命令,可以看到還是共享的主機的網路,也就是並未實現完整的隔離:

二、Docker容器原理

Docker 主要是利用 Linux 的 Namespace 、Cgroups 和聯合檔案系統三大機制來保證實現:

1、使用 Namespace 做主機名、網路、PID 等資源的隔離,其中docker主要用到的名稱空間:

  • pid namespace:用於隔離程序 ID。
  • net namespace:隔離網路介面,在虛擬的 net namespace 內使用者可以擁有自己獨立的 IP、路由、埠等。
  • mnt namespace:檔案系統掛載點隔離。
  • ipc namespace:訊號量,訊息佇列和共享記憶體的隔離。
  • uts namespace:主機名和域名的隔離。

2、使用 Cgroups 對程序或者程序組做資源(例如:CPU、記憶體等)的限制

3、使用聯合檔案系統用於映象構建和容器執行環境

  是一種通過建立檔案層程序操作的檔案系統,因此,聯合檔案系統非常輕快。Docker 使用聯合檔案系統為容器提供構建層,使得容器可以實現寫時複製以及映象的分層構建和儲存。常用的聯合檔案系統有 AUFS、Overlay 和 Devicemapper 等。