自己動手寫docker 2

2021-09-11 09:31:20 字數 2235 閱讀 2240

2.1 linux namespace

linux 支援的namespace

namespace api的基本系統呼叫

// 不完整的ex,以下為呼叫後截圖為

package main

import (

"log"

"os"

"os/exec"

"syscall"

)func

main()

= &syscall.credential

cmd.stdin = os.stdin

cmd.stdout = os.stdout

cmd.stderr = os.stdout

if err := cmd.run(); err != nil

}複製**

go 建立uts namespace

go 建立ipc namespace

go 建立pid namespace

go 建立mount namespace

network namespace

2.2 linux cgroup
namespace 幫助程序隔離出單獨空間,cgroup限制每個空間可用資源

linux cgroup提供了對一組程序及將來子程序的資源限制,控制和統計能力,這些資源包括cpu,記憶體,儲存和網路等

cgroup的元件

hierarchy 把一組cgroup串成乙個樹狀結構,使cgroup可以繼承

乙個subsystem只能附加到乙個hierarchy上

乙個hierarchy可以新增多個subsystem

乙個程序可以在多個不在乙個hierarchy的cgroup中

fork的子程序預設在父程序cgroup中,但可以移出

docker 使用cgroup,docker建立容器時如果指定了 -m ,則會在預設的subsystem(ex:/sys/fs/cgroup/memory/)下建立(./docker/容器id子cgroup)

其他 tip:/proc/self/exe 會一直起乙個執行自己的子程序(即shell)

2.3 union file system
使用branch將不同的檔案系統的檔案和目錄「透明的」覆蓋,形成乙個單一一致的檔案系統,通過cow對檔案讀寫

有意思的是,現有的graphdriver中只有少部分是真正的有寫時複製語義的聯合檔案系統:overlay的兩個版本,從docker早期就存在的aufs。記住聯合檔案系統只是乙個基於檔案的介面,通過把一組目錄交錯起來來,形成乙個單一檢視。所以與它不是乙個真正的檔案系統,如ext4或者xfs,它僅僅是站在乙個已有的檔案系統上提供了這些功能。在一些場景,對於底層檔案系統是有要求的,並且docker也會同時檢查請求的聯合檔案系統和底層的檔案系統,來保證它們是相容的。

現在的linux上docker 預設使用overlay2而不是aufs

aufs 重寫了早期的union fs, 提高可靠性和效能,增加了寫分支的負載均衡

aufs 是docker選用的第一種儲存驅動,可以快速啟動,高效利用儲存和記憶體

image layer 和 aufs

container layer 和 aufs

自己動手寫docker之cgroup

實驗環境 ubuntu 18.10 作業系統已經預設把各種controller都掛載到 sys fs cgroup 目錄下了。ls sys fs cgroup 可以檢視有哪些controller mount grep cgroup 可以檢視掛載資訊 可以看到有乙個是cgroup2,其它都是cgrou...

自己動手寫bootloader

原始出處 作者資訊和本宣告。否則將追究法律責任。為了寫乙個bootloader讓板子跑起來,首先我們要知道bootloader是個什麼東東才行。簡單的說,bootloader就是乙個引導核心啟動的一段小 也就是說當啟動完核心之後,它的使命就已經結束。bootloader生命週期 初始化硬體 設定啟動...

自己動手寫CMS

簡易的cms外掛程式,可供借鑑或者擴充套件 流程 定義內容 分類與組織內容 儲存內容 操作控制內容 定義內容 制定目標 確定需要的內容型別 目標使用者定位 確定目標使用者需要何種技術 分類與組織內容 按內容所屬的邏輯層級關係來劃分 按內容的種類來劃分,比如video text audio等等 儲存內...