兩個核心技術:1、“Linux namespaces”,是對全域系統資源的一種封裝隔離,使得處於不同namespace的進程擁有獨立的全域系統資源;2、“Control Groups”,能夠隔離宿主機器上的實體資源,實現對資源的配額和度量。
本教學操作環境:linux5.9.8系統、docker-1.13.1版、Dell G3電腦。
Docker是基於Go語言實作的雲端開源專案。
Docker透過虛擬化技術,解決了開發環境、測試環境、生產環境的一致的問題,讓App及其運行環境達到「Build,Ship and Run Any APP,Anywhere」的目的。方便做持續集成,並有助於整體發布和擴縮容的容器虛擬化技術。
docker的兩個核心技術:Namespaces , Controller Groups。
一、隔離性:Linux Namespace (ns)
Linux namespaces 是對全域系統資源的一種封裝隔離,使得處於不同namespace 的進程擁有獨立的全域系統資源,改變一個namespace 中的系統資源只會影響目前namespace 裡的進程,對其他namespace 中的進程沒有影響。這些資源包括:進程樹、網路介面、掛載點以及進程間通訊等資源。的在同一個 namespace 下的進程可以感知彼此的變化,而對外界的進程一無所知。這樣就可以讓容器中的進程產生錯覺,認為自己置身於一個獨立的系統中,從而達到隔離的目的。
每個使用者實例之間相互隔離, 互不影響。一般的硬體虛擬化方法給的方法是 VM,而 LXC 給的方法是 container,更細一點講就是 kernel namespace。其中pid、net、ipc、mnt、uts##、user等namespace將container 的進程、網路、訊息、檔案系統、UTS("UNIX Time-sharing System") 和使用者空間隔離。
1)、pid namespace
不同使用者的流程就是透過 pid namespace 隔離的,且不同 namespace 中可以有相同 pid。所有的 LXC 進程在 docker 中的父進程為 docker 進程,每個 lxc 進程有不同的 namespace。同時由於允許嵌套,因此可以很方便的實作 Docker in Docker。2)、net namespace
有了 pid namespace, 每個 namespace 中的 pid 能夠相互隔離,但網路連接埠還是共用 host 的連接埠。網路隔離是透過 net namespace 實現的, 每個 net namespace 有獨立的 network devices, IP addresses, IP routing tables, /proc/net 目錄。這樣每個 container 的網路就能隔離開來。 docker 預設採用 veth 的方式將 container 中的虛擬網卡同 host 上的一個 docker bridge: docker0 連接在一起。3)、ipc namespace
container 中進程互動或採用linux 常見的進程間互動方法(interprocess communication - IPC), 包含常見的訊號量、訊息隊列和共享記憶體。然而與 VM 不同的是,container 的進程間交互實際上還是 host 上具有相同 pid namespace 中的進程間交互,因此需要在 IPC 資源申請時加入 namespace 資訊 - 每個 IPC 資源有一個唯一的 32 位元 ID。4)、mnt namespace
類似 chroot,將一個行程放到特定的目錄執行。 mnt namespace 允許不同 namespace 的程序看到的檔案結構不同,這樣每個 namespace 中的程序所看到的檔案目錄就被隔離開了。同 chroot 不同,每個 namespace 中的 container 在 /proc/mounts 的資訊只包含所在 namespace 的 mount point。5)、uts namespace
UTS("UNIX Time-sharing System") namespace 讓每個container 擁有獨立的hostname 和domain name, 使其在網絡上可以被視為一個獨立的節點而非Host 上的一個流程。6)、user namespace
每個container 可以有不同的user 和group id, 也就是說可以在container 內部用container 內部的使用者執行程式而非Host 上的使用者。二、資源限制:Control Groups (cgroups)
#命名空間為新建立的進程隔離了檔案系統、網路並與宿主機器之間的進程相互隔離,但是命名空間並不能為我們提供實體資源上的隔離。但是如果在同一台機器上運行了多個對彼此以及宿主機器一無所知的容器,這些容器卻共同佔用了宿主機器的實體資源。而 Control Groups(簡稱 CGroups)就是能夠隔離宿主機器上的實體資源,例如 CPU、記憶體、磁碟 I/O 和網路頻寬。每一個 CGroup 都是一組被相同的標準和參數限制的過程,不同的 CGroup 之間是有層級關係的,也就是說它們之間可以從父類別繼承一些用來限制資源使用的標準和參數。
cgroups 實作了對資源的配額和度量。 cgroups 的使用非常簡單,提供類似文件的接口,在/cgroup 目錄下新建一個文件夾即可新建一個group,在此文件夾中新建task 文件,並將pid 寫入該文件,即可實現對該進程的資源控制。 groups 可以限制blkio、cpu、cpuacct、cpuset、devices、freezer、memory、net_cls、ns 九大子系統的資源,以下是每個子系統的詳細說明:
blkio 這個子系統設定限制每個區塊設備的輸入輸出控制。例如: 磁碟,光碟以及 usb 等等。
cpu 這個子系統使用排程器為 cgroup 任務提供 cpu 的存取。
cpuacct 產生 cgroup 任務的 cpu 資源報表。
cpuset 如果是多核心的 cpu,這個子系統會為 cgroup 任務分配單獨的 cpu 和記憶體。
devices 允許或拒絕 cgroup 任務對裝置的存取。
freezer 暫停和恢復 cgroup 任務。
memory 設定每個 cgroup 的記憶體限制以及產生記憶體資源報告。
net_cls 標記每個網路包以供 cgroup 方便使用。
ns 名稱空間子系統。
以上九個子系統之間也存在著一定的關係. 詳情請參閱官方文件。
推薦學習:《docker影片教學》
以上是docker核心技術是哪兩個的詳細內容。更多資訊請關注PHP中文網其他相關文章!