本篇摘要
本文圍繞虛擬化與容器化技術展開,涵蓋架構演進、Docker/K8S優勢與挑戰、namespace隔離實操(如主機名/PID隔離)、磁盤操作(dd/mkfs/df/mount)等,對比虛擬機與容器差異,闡明技術原理與架構選擇邏輯,強調資源隔離與彈性伸縮的核心價值。
歡迎拜訪: 點擊進入博主主頁
本篇主題: Docker演進+namespace操作詳解
制作日期: 2025.08.22
隸屬專欄: 點擊進入所屬Docker專欄
一.技術架構
由于這里過多與對redis之前的演進相似就不重復了如,見 點擊速看架構演進,只不過這里多了個容器編排架構。
容器編排架構:
問題背景
-
業務增長帶來系統資源利用率不高的問題,大量資源用于應對短時高并發,平時閑置,需動態擴縮容但難以直接下線服務器。
-
開發、測試、生產每套環境都需隔離,導致運維工作量大。
-
??部署與配置復雜且易錯??:微服務拆分細,導致部署工作量大,配置復雜,容易出錯。
-
??擴縮容麻煩且易錯??:微服務數量多,擴縮容操作麻煩且容易出錯,每次操作后可能需要重新配置環境參數。
-
??環境沖突與資源消耗??:微服務間運行環境可能沖突,需要更多資源或修改配置來解決。
容器化技術及工具
- 目前最流行的容器化技術是Docker,最流行的容器管理服務是Kubernetes(K8S)。
- 應用/服務可打包為Docker鏡像,通過K8S動態分發和部署鏡像。
- Docker鏡像可理解為能運行應用/服務的最小操作系統,包含運行代碼及設置好的運行環境。打包成鏡像后可分發到相關機器,直接啟動鏡像即可運行服務,簡化部署和運維。
K8S集群情況
- 通常設有生產和研發K8S集群,一般不共用。
- 研發集群通過命名空間完成應用隔離。
- 不同公司劃分集群方式不同,有的按研發目的分為研發和測試集群,有的按組織架構實現部門間資源復用 。
通過docker技術,直接降低了對應運維人員的苦惱,但是也增加了對應服務器的負擔,于是就引入了云服務器購買等方案。
一張圖形象理解docker技術:
如果我們把docker技術添加過去,發現它就就成了這樣:
對應操作流程:
- 發現和之前的微服務相比沒多大變化,其實真正變化在的就是降低了運維難度,對環境的部署,復用,轉移變得輕松了,但是需要的知識儲備量就高了。
對應優缺點:
1.??優點??
-
??部署運維高效??:部署、運維簡單快速,一條命令可完成大量服務的部署或擴縮容。
-
??隔離性好??:容器間文件系統、網絡等互相隔離,避免環境沖突。
-
??支持滾動更新??:版本切換可通過命令輕松完成升級或回滾。
2.??缺點??
-
技術門檻高??:技術棧多樣,對研發團隊要求較高。
-
??資源與成本問題??:機器仍需公司自行管理,非高峰期也需預留大量機器資源應對高峰,導致機器成本和運維成本高,資源利用率低。(解決方案:可考慮使用云廠商服務器)
因此可以的出對應的技術構架演進圖(由服務器到云服務器):
對應這些可能會有些疑問:
1. 如何決策要不要演進?
- 業務需求:業務增長快、模式變化大時需演進架構。
- 技術瓶頸:現有系統性能差、技術債務高時考慮演進。
- 團隊能力:團隊有技術儲備且能提升效率時可推進演進。
2. 架構必須這么演進么?
- 非唯一解:有多種演進方案可選,非固定模式。
- 成本考量:若優化成本低,可暫不大規模演進。
- 創新可能:可探索新思路,不局限傳統方向。
3. 架構必須是這么幾個么?
- 業務適配:不同業務需定制架構,無固定模式。
- 技術多元:新興技術帶來更多架構選擇。
- 靈活組合:可創新組合多種技術形成獨特架構。
4. Docker 的核心作用?
- 環境一致:打包應用及依賴,保證多環境運行一致。
- 資源隔離:容器獨立運行,避免相互干擾。
- 快速部署:提升應用部署和遷移效率。
虛擬化+容器化
- 物理機:實際的服務器或計算機,為虛擬機提供硬件環境,也叫“寄主”或“宿主”。
- 虛擬化:利用虛擬化技術把一臺計算機虛擬為多臺邏輯計算機,這些邏輯計算機可運行不同操作系統,應用程序在獨立空間運行互不影響,提升工作效率。
- 容器化:
- 屬于虛擬化技術,即操作系統層虛擬化。
- 將操作系統內核虛擬化,把用戶空間軟件實例分割成多個獨立單元在內核中運行。
- 這些軟件實例就是容器,對使用者而言像專用服務器程序。
- 容器技術是虛擬化的一種,Docker是現今容器技術的事實標準。
如圖:
- 容器A與B內部看不到,但是又共用同一個操縱系統的內核。
那么為什么要進行容器化與虛擬化:
- 讓利用唯一資源完成更多任務。
- 通過類似docker技術打包容器化,保證不會出現機器變化等導致的問題出現異常。
- 彈性資源伸縮:可以隨時操作簡單的增多與減少。
- 差異化環境提供:即隨時輕松切換環境(如ubuntu centos)
- docker容器化后啟動極快,無需虛擬內核。
- 沙箱安全:每個容器自己在自己的范圍操作,不會影響外部。
- 易拓展:拓展鏡像,拓展功能非常輕松。
虛擬機與容器
-
虛擬機(Virtual Machine, VM)
- 層級:硬件層與操作系統層之間。
- 原理:模擬完整硬件接口,運行獨立操作系統(如Windows上運行Android系統)。
- 特點:功能完整但資源占用高,適合跨平臺環境隔離。
-
容器(Container)
- 層級:操作系統層與函數庫層之間。
- 原理:模擬操作系統接口(如Docker利用Namespace/Cgroup),隔離應用及依賴。
- 特點:輕量(共享宿主機內核)、啟動快、資源占用少,屬應用級虛擬化。
如何實現?
虛擬機:
-
Type 1 Hypervisor(裸機虛擬化)
- 架構:直接運行在物理硬件(HARDWARE)上,無宿主操作系統。
- 特點:高性能、低延遲,直接管理硬件資源。
- 典型代表:Xen、VMware ESXi。
-
Type 2 Hypervisor(托管虛擬化)
- 架構:運行在宿主操作系統(HOST OS)之上,依賴宿主OS管理硬件。
- 特點:部署靈活,但性能略低(需經過宿主OS層)。
- 典型代表:VirtualBox、VMware Workstation。
-
核心區別
- Type 1:硬件→Hypervisor→Guest OS(高效,適合企業級)。
- Type 2:硬件→Host OS→Hypervisor→Guest OS(易用,適合開發/測試)。
容器化:
- 容器虛擬化,有別于主機虛擬化,是操作系統層的虛擬化。通過 namespace 進行各程序的隔離,加上 cgroups 進行資源的控制,以此來進行虛擬化。
二.空間命名隔離(namespace)
dd命令
- 全稱:Data Description 。
- 作用:是一個在 Unix 和類 Unix 系統(如 Linux)上用于復制和轉換文件的命令。它可以對磁盤、分區等進行低級別的操作,比如制作磁盤鏡像、從鏡像恢復數據、創建空文件等。例如,使用
dd if=/dev/zero of=test.img bs=1M count=100
可以創建一個大小為100MB的全零文件test.img
,這里if
表示輸入文件(/dev/zero
是一個特殊的設備文件,會不斷輸出空),of
表示輸出文件,bs
指定塊大小,count
指定塊的數量。
如下:
- 無法查看以為全0,不可打印,故出現卡死假象。
dd
命令核心參數速查表
類別 | 參數 | 作用 | 示例 |
---|---|---|---|
基礎操作 | if=file | 輸入文件(默認標準輸入) | if=/dev/zero |
of=file | 輸出文件(默認標準輸出) | of=test.img | |
bs=size | 塊大小(輸入/輸出統一,如 1M ) | bs=1M | |
count=n | 復制 n 個塊 | count=100 | |
skip=n | 跳過輸入文件前 n 塊 | skip=5 (跳過前 5MB) | |
seek=n | 跳過輸出文件前 n 塊 | seek=5 (跳過輸出前 5MB) | |
轉換選項 | conv=ascii | 轉換 EBCDIC → ASCII | conv=ascii |
conv=ebcdic | 轉換 ASCII → EBCDIC | conv=ebcdic | |
conv=lcase | 小寫轉大寫 | conv=lcase | |
conv=ucase | 大寫轉小寫 | conv=ucase | |
conv=swab | 交換每對字節(AB→BA) | conv=swab | |
conv=noerror | 出錯時繼續執行 | conv=noerror | |
conv=sync | 出錯時用零填充對齊塊 | conv=sync | |
狀態控制 | status=none | 隱藏所有輸出(靜默模式) | status=none |
status=progress | 顯示實時進度(需新版 dd ) | status=progress |
mkfs命令
- 全稱:Make File System 。
- 作用:用于在指定設備(如硬盤分區)上創建文件系統。它是一個前端工具,會根據不同的參數調用具體的文件系統創建工具(如
mkfs.ext4
用于創建 ext4 文件系統,mkfs.xfs
用于創建 XFS 文件系統等)。例如,mkfs.ext4 /dev/sda1
會在/dev/sda1
這個分區上創建 ext4 文件系統(可以理解成一個磁盤)。
進行格式化(文件必須有大小可用dd命令):
檢查下:
df命令
- 全稱:Disk Free 。
- 作用:用于顯示文件系統的磁盤空間使用情況,包括已用空間、可用空間、總空間以及掛載點等信息 。例如,執行
df -h
(-h
選項以人類可讀的格式顯示容量,如 KB、MB、GB 等)可以清晰地看到各個文件系統的磁盤空間使用概況。
這張圖片是關于 Shell 命令df
的說明文檔,主要內容如下:
1. 命令基本格式
df [OPTION]... [FILE]...
2. 常見參數
-a, --all
:包含所有的具有 0 Blocks 的文件系統-h, --human-readable
:使用人類可讀的格式(預設值是不加這個選項的…)-H, --si
:很像-h
,但是用 1000 為單位而不是用 1024-t, --type=TYPE
:限制列出文件系統的 TYPE-T, --print-type
:顯示文件系統的形式
mount命令
- 全稱:Mount 。
- 作用:用于將存儲設備(如硬盤分區、光盤、U盤等)或文件系統掛載到 Linux 文件系統的目錄樹中的某個掛載點上,使得用戶可以訪問設備中的數據。例如,
mount ./test.img
會將./test.img
這個 USB 設備分區掛載到mounttest
目錄下,之后就可以通過訪問mounttest
來讀寫該設備中的內容。
命令基本格式
mount [-l]
mount [-t vfstype] [-o options] device dir
常見參數說明
- -l:顯示已加載的文件系統列表。
- -t:指定加載的文件系統類型(如ext3、ext4、iso9660、tmpfs、xfs等),多數情況下可不指定,mount會自動識別。
- -o options:用于描述設備或文件的掛接方式,常見選項有:
- loop:將文件當作硬盤分區掛接。
- ro:以只讀方式掛接設備。
- rw:以讀寫方式掛接設備。
此外,還對device
(要掛接的設備)和dir
(掛載點目錄)進行了簡要說明。
用法:
這里之前使用了mkfs命令把對應有內容大小的文件然后格式化成對應文件系統(磁盤),因為linux對應的磁盤需要掛載才能使用,不像windows自己回掛載:
后面把它掛載到一個比如目錄,接下就能訪問這個目錄實現對對應磁盤操作(進行掛載的磁盤或文件系統需要有大小)。
成功被掛載,然后進行使用:
unshare命令
- 全稱:Unshare 。
- 作用:用于創建新的命名空間(namespace),并使當前進程及其子進程脫離原來的命名空間相關資源。命名空間是 Linux 內核提供的一種隔離機制,可以隔離進程、網絡、文件系統掛載等資源。比如,
unshare --mount --map-root-user --pid --fork --mount-proc /bin/bash
可以創建一個新的掛載命名空間、新的 PID 命名空間等,并以根用戶權限啟動一個新的 bash shell 環境,在這個新環境中可以獨立地進行文件系統掛載等操作,與原系統的資源相互隔離 。
核心功能
unshare
允許你在新的命名空間中運行程序,使得該程序在文件系統掛載、網絡、進程 ID、主機名/域名、IPC(進程間通信)等層面與原系統環境“隔離”,常用于容器化、沙箱測試或資源隔離場景。
常用參數及功能
參數(短選項 + 長選項) | 核心作用 |
---|---|
-i, --ipc | 啟動新進程時,不與父進程共享 IPC 命名空間(即信號量、消息隊列、共享內存等 IPC 資源相互隔離)。 |
-m, --mount | 啟動新進程時,不與父進程共享 Mount 命名空間(文件系統掛載點彼此獨立,可掛載/卸載而不影響原系統)。 |
-n, --net | 啟動新進程時,不與父進程共享 Net 命名空間(網絡設備、協議棧、端口等完全隔離,可配置獨立網絡環境)。 |
-p, --pid | 啟動新進程時,不與父進程共享 PID 命名空間(新進程在自己的 PID 空間里,能看到“從 1 開始”的進程樹)。 |
-u, --uts | 啟動新進程時,不與父進程共享 UTS 命名空間(主機名、域名可獨立設置,互不影響)。 |
-U, --user | 啟動新進程時,不與父進程共享 User 命名空間(用戶/用戶組 ID 可以重新映射,實現權限隔離)。 |
-V, --version | 查看 unshare 命令自身的版本信息。 |
--fork | 讓 unshare 先 fork 一個子進程,再在子進程里執行后續要運行的程序(常配合命名空間使用,規范進程層級)。 |
--mount-proc | 在進入新 Mount 命名空間后,自動掛載 proc 文件系統(讓新進程能看到“自己視角”的 /proc,方便調試與管理)。 |
主機名隔離:
再開一臺機器發現名字名字實現了隔離:
基于pid的隔離測試:
直接隔離:
因為新進程是重新創建的,和父進程無任何關系,自然不能干別的事。
需要--fork
,然它繼承一下父進程:
這里查看pid信息:ls /proc
:
發現還能看到之前父進程的,這里因此需要進行重新掛載(--mount-proc
)一下子進程的proc文件系統(也就是讓它有個全新的):
exit
退出當前環境。
- 這里發現只有我們啟動的那倆進程pid了。
- 但是新開一個機器就不一樣,成功隔離。
基于mount隔離測試:
首先先取消之前掛載的文件系統:
umount 被掛載目錄
但是發現:
說明有進程還在訪問,這里直接強行關閉:
umount -l 被掛載目錄
- 關閉成功。
然后進行掛載隔離發現:
- 因為剛取消了這個目錄對應掛載,結構發生變化,故需要退出重新執行unshare就行了:
- 上面被隔離的子進程機器發現成功掛載,但是宿主機看不到,成功實現掛載隔離。
三.本篇小結
通過實踐學習了虛擬化與容器化技術,用dd、mkfs等命令操作磁盤,理解了namespace隔離(如主機名、PID隔離)的原理;掌握了Docker/Kubernetes解決資源利用率低、環境沖突等問題的優勢,也認識到其技術門檻與成本挑戰,更清晰把握了從物理機到云服務器的架構演進邏輯。