2 回答

TA貢獻1784條經驗 獲得超9個贊
她正在通過這樣做來創建一種容器:
她將執行 main.go 并傳遞要在容器中執行的命令
為此,她運行了一個執行 run() 函數的進程
在 run() 函數中,她準備了一個要分叉的進程,該進程將執行 child() 函數
但在實際分叉之前,通過 syscall.SysProcAttr,她配置了一個新的命名空間:
“unix 分時”(syscall.CLONE_NEWUTS)這本質上將允許在子進程中有一個單獨的主機名
PIDs (syscall.CLONE_NEWPID) 這樣在她正在創建的“容器”中,她將擁有從 1 開始的新 PID
mounts (syscall.CLONE_NEWNS) 將使“容器”擁有單獨的掛載
接下來她執行 fork (cmd.Run())
在分叉的進程中,child() 函數在這里執行:
她通過 cg() 準備了一個控制組,它將限制“容器”可用的資源,這是通過在 /sys/fs/cgroup/ 中編寫一些適當的文件來完成的
接下來,她使用傳遞給 main.go 的 args 準備要執行的命令
她使用 chroot 到 /home/liz/ubuntufs 下的新根目錄
她monuts特殊fs proc和另一個臨時fs
最后,她執行作為參數提供給 main.go 的命令
在從頭開始的視頻容器中,她很好地呈現了這一切。在那里,她在容器中執行了一個 bash,該容器看到了新的 PID,有一個新的主機名,并且限制為 20 個進程。
為了讓它工作,她需要在 /home/liz/ubuntufs 下有一個完整的 ubuntu fs 克隆。
要帶回家的 3 個關鍵點是容器(以及她的“容器”)本質上是這樣做的:
使用命名空間來定義容器將看到的 PID/掛載(在這個容器示例中她沒有處理網絡)
使用 chroot 將容器限制為文件系統的一部分
使用 cgroups 來限制容器可以使用的資源

TA貢獻1831條經驗 獲得超9個贊
由于我缺乏 GO 經驗以及對自定義 docker 容器的經驗有限,我無法確認此代碼的作用。
雖然這不是直接回答標題中的問題,但我想提供一個答案,幫助您學習 docker 的基礎知識以幫助您入門。
你對容器的理解是正確的。嘗試查找使用您熟悉的語言的更簡單示例的教程。
一個讓您入門的簡單示例是創建一個您喜歡的 linux 操作系統的容器,將 docker 容器附加到您當前的終端,然后在容器中運行一些特定于操作系統的命令(例如在容器中安裝軟件或任何 linux 命令)
- 2 回答
- 0 關注
- 184 瀏覽
添加回答
舉報