Docker學習一:簡單理解docker技術原理
阿新 • • 發佈:2020-09-08
備註:學習素材來源於拉鉤教育課程: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 等。