Docker 容器化

引言

在解釋docker是什么之前,我們首先應該先了解的是容器化的概念。

什么是容器?就是一個沙箱,在這個沙箱中涵蓋了特定應用運行的一切依賴的內容。但他不是一個操作系統,且和底層的操作系統是隔離的。

什么是容器化?容器化就是將軟件和應用所需要的所有依賴打包到一個獨立的容器中,使得軟件能夠在不同的計算環境中,高效的、按照預期運行的技術。

先有容器化的概念還是先有的docker?先有的容器化概念,容器化最早提出是在1979年,貝爾實驗室發明了chroot,用于將一個進程的文件系統隔離起來,通常認為這是容器技術的開端。

和虛擬化技術有什么聯系?有關聯也有區別,參考下文“虛化技術”。

Docker 優勢

一項技術的優勢,通常是在說他解決了傳統技術的哪一項痛點,這也是技術持續迭代的一個動力。

傳統部署痛點

傳統的部署方式通常是在虛擬機上直接部署,如果你有部署過虛擬機服務,你會經歷過如下痛點:

1. 環境不一致

主要是設備、系統、工具等方面的差異,舉個例子:一般我們在服務器上都是使用Linux的相關版本,所以如果開發使用的是Linux系統,一些腳本等配置都可以無縫遷移,但如果使用windows,我們可能會經歷在本地能跑,但是部署到服務器卻因為缺少一些信息,無法啟動或調用失敗的問題。

2. 部署復雜

傳統的虛擬機手工部署,在首次部署時,需要安裝很多工具包,如果某個步驟出錯,就可能會需要我們從頭開始排查,耗費比較多的人力成本。后續的部署過程中,以war包為例,如果war包有問題,我們又需要趕緊重新部署舊的服務,否則服務掛了對用戶來說太痛了,這個時期的部署一般都選擇夜間用戶谷期進行。

當然,后來也演化除了一鍵部署等運維手段,但是依舊有跨環境部署的問題,因為生產環境限制永遠要比我們開發測試的環境更高。

3. 資源占用率很高

傳統虛擬化技術是模擬完整的操作系統實現相關的隔離,需要提前進行資源的“預分配”,所以這里的資源浪費是比較嚴重的,一臺服務器,可能部署3臺虛擬機就到頂了。

4. 擴容效率低

虛擬機部署方式下,我們如果遭遇到突發的大流量,比如某位名人空降微博熱搜,這種情況下,大概率是會宕機的(不是DDoS,勝似DDoS),等虛擬機的再擴容啟動(虛擬機啟動相對耗時較長),這波流量可能就過去了,吃不到。

Docker 的解決方法

對于以上的痛點,Docker 采取了“鏡像+容器”的方案來解決,實現了“一次構建,隨處運行”。

1. 鏡像的本質就是:應用運行時所需要的完整環境快照(包含程序、庫、資源、配置文件等),他不包含動態的數據,一旦構建完成,就不會再變了。

由于環境的固化,我們得以實現版本和配置差異的打平,解決了環境不一致的問題。同時由于鏡像分層存儲的架構設計,使得不同鏡像可以復用底層相同的層,從而避免“資源冗余”。

2. 容器的本質則是:一個具有Namespace的進程,它具有自己的文件系統、網絡和進程空間。

容器是一個輕量、隔離的執行環境,專門用于運行我們的鏡像而不需要考慮能否運行其他應用,同時由于共享操作系統內核,所以他沒有內核的開銷,不需要安裝完整的操作系統,再加上它本身也具有被創建、啟動、暫停、停止、刪除的能力,所以為什么不能說他是一個輕量化的虛擬機呢?

這些特點使得容器資源占用變低,啟動速度更快,從而也使得擴縮容的效率變高。

這里提供一下容器化和虛擬化技術的對比:

維度

容器化(Containerization)

虛擬化(Virtualization)

隔離級別

進程級(共享內核)

系統級(每個VM有獨立內核)

資源抽象

抽象應用層(運行時環境、依賴)

抽象硬件層(CPU、內存、存儲、網絡)

啟動速度

秒級(無需加載內核)

分鐘級(需啟動完整操作系統)

資源效率

高(輕量級)

低(VM管理程序占用額外資源)

密度

單主機可運行數百個容器

單主機通常運行數十個VM

隔離強度

中等(依賴內核安全機制,存在容器逃逸風險)

高(完全獨立的操作系統環境)

適用場景

微服務、DevOps、彈性伸縮、CI/CD

傳統應用遷移、關鍵業務系統、多租戶隔離

代表技術

Docker,Kubernetes,containerd

VMware vSphere,Hyper-V,KVM,Xen

Docker 引擎

image

上文說到容器的本質是一個進程,那么也就是說可以通過操作系統來直接 kill 掉對應的 docker 實例,也可以通過操作系統來啟停容器。

理論上來說是這樣,但是我們在創建一個 docker 容器的同時,需要需要一個工具幫我們去處理創建該進程所需要準備的東西,以及在創建完成后,可以幫助我們快速的去維護這些容器實例,所以,這樣一個工具,就是?Docker 引擎,他能做到的自然是不止我們現在說的這些內容。

從使用層面來說,Docker 引擎是 Docker 的核心組件,但是也不必過于害怕,這也就是一個普通的應用工具,和其他Linux命令一樣,只是他的能力聚焦于管理 Docker 核心資源:

鏡像(Image)、容器(Container)、網絡(Network)、存儲卷(Volume)

Docker 引擎的工作主要是負責管理和運行容器,包含以下幾個部分:

  • Docker 守護進程:Docker 引擎的后臺服務,負責持續運行并處理容器相關的請求,守護進程管理著整個容器的生命周期。
  • Docker REST API:提供 HTTP 的 API 接口,通過 HTTP 請求和 Docker 引擎進行交互。
  • Docker 命令行工具:cli 工具,可以在命令行直接輸入 Docker 命令與 Docker 引擎進行交互。
  • 容器與鏡像管理:鏡像的創建和存儲、容器的生命周期管理、容器網絡管理。

但整體看下來,不難發現,Docker 引擎所處理的主要就是我們前文所說的兩件事情:資源管理和容器的生命周期管理

在這里的“資源”所指代的范圍是比較大的,網絡也被認為是一種資源。

在目前的網絡上搜索 Docker ,大多數的文章基本是在進行 Docker 的命令行的使用及解釋,了解一下就行了,實際使用的時候翻閱也沒什么問題:

docker pull
docker run image
docker stop
docker ps
...

Docker 的輕量級

那么 Docker 的輕量級因何而來,為什么他就比虛擬機要輕量?

要理解這個問題,其實也就是一兩句話的事情:傳統的虛擬機是在一個硬件層之上運行的一個完整的操作系統,而 Docker 則是運行在應用層之上的。不妨想一下,啟動電腦快還是啟動應用快?

傳統虛擬機是通過虛擬化技術將底層的硬件虛擬化為硬件資源池,提供給上層的每個 VM (Virtual Machine,虛擬機)使用,讓每個 VM 都認為自己是獨立運行在物理機上的。

其后,每個 VM 又是運行的完整的操作系統,僅僅是操作系統+基礎服務就需要占用較多的資源,而且這些資源是被 VM 獨占的,不可被其他虛擬機復用。

虛擬機啟動時,會鎖定配置好的資源分配,如VM需要2c4g的基礎資源,則會預先鎖定,不讓其他 VM 使用該資源

這種虛擬化架構實際就是寄居虛擬化,主要分三層:宿主操作系統(Host OS) -> 虛擬機監控程序(Hypervisor) -> 虛擬機(Guest OS),下面是對應的架構圖,一個典型的應用就是我們熟知的 VMWare Workstation:

image

這就是傳統虛擬機重的由來。

Docker 的輕量級也并不是因為他解決了這些問題,而是因為他另辟蹊徑,不再去模擬一個完整的操作系統,而是基于 Linux 內核的 Namespace、Cgroups以及UnionFS技術,實現從系統級別的隔離轉換到了進程級別的隔離,從架構層面抹除了硬件模擬和虛擬機操作系統的開銷。

  • Namespace 提供資源隔離機制:將 PID、Network、Mount、User 等資源進行命名空間層級的劃分,不同的 Namespace 的進程無法互相訪問到。
  • Cgroups 進行配額限制:避免某一個進程組無限制的消耗資源,同時可以讓空閑資源被釋放。
  • UnionFS 實現鏡像分層復用:不同的鏡像可復用底層鏡像,減少存儲的冗余。

這樣一來,Docker 虛擬化的架構就變成了:

image

沒有了 Hypervisor 和 Guest OS,同時由于 Docker 是基于 Linux 內核技術的,所以宿主操作系統也只能是 Linux。

Docker 與云原生

云原生本質是一種構建和運行應用程序的方法,是以 k8s 為代表的一套技術體系和方法論[3]。這套技術體系是由 “容器化技術、編排調度、服務治理、可觀測性” 等技術組成,而其中的容器化技術是云原生的 “基礎載體”。而 Docker 則是容器化技術的 “開創者與早期絕對主導者”,也是云原生的核心應用,他通過解決傳統部署的痛點問題,使得以容器為基礎去構建分布式應用成為可能,從而推動了云原生的普及落地,可以說,如果沒有 Docker,那云原生可能發展的不會如此迅速,還需要等待另一個“Docker”技術來推動其發展。

此外,Docker 定義的容器鏡像標準,也成為了云原生應用的一個交付載體標準。目前的云原生應用的 CI/CD 標準流程是:代碼提交→自動構建 Docker 鏡像→鏡像推送到倉庫→編排工具拉取鏡像部署,可以看到,在這個過程中,鏡像就是代碼到運行時的中間載體,也是我們交付的一個產物標準。

目前 k8s (1.20 以后的版本)已經棄用了對 Docker 的直接支持,轉為原生支持 CRI 標準的容器運行時,但是這并不代表著 Docker 已經過時,只是 k8s 從以 Docker 主導轉變為了基于 Docker 標準,多工具的生態協同

image

總結

Docker 不僅是一項技術創新,更重塑了軟件產業的協作模式。Docker 將 Linux 內核的 Namespace、Cgroups、UnionFS 等技術封裝成簡單易用的工具鏈條,通過“鏡像-容器 ”架構解決了傳統部署的行業痛點問題,標準化了應用交付格式,為 k8s 等編排平臺提供了基礎載體,重塑了軟件開發流程,實現“一次構建,到處運行”的理想態,推動了云原生的迅速發展。

未來,隨著云原生技術持續演進,Docker 可能也不再是容器領域的唯一焦點,但其倡導的 "標準化、輕量化、可移植" 理念已深刻影響整個行業。無論是作為開發者日常工具,還是云原生基礎設施的重要組成部分,Docker 仍會在上云浪潮中扮演關鍵角色。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/922328.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/922328.shtml
英文地址,請注明出處:http://en.pswp.cn/news/922328.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LeetCode刷題——hot 100(3)

題目1:矩陣置零題目:問題分析:使用兩個布爾數組來分別記錄哪行哪列出現了0,當出現0的行和列,對應的布爾數組值置為true。再次遍歷數組,當出現行數組和列數組中的值為true,則對應的原數組的值置為…

Ajax-day2(圖書管理)-渲染列表

本篇筆記素材來自“黑馬程序員” 渲染列表圖書管理一、獲取數據二、渲染數據完整代碼圖書管理 Bootstrap 框架渲染列表(查)新增圖書(增)刪除圖書(刪)編輯圖書(改) 自己的圖書數據&a…

MOS管的電路

MOS管的三極都會存在以下三個電容,分別是:Cgs,Cgd,Cds 輸入電容CissCgsCgd 輸出電容CossCgdCds 反向傳輸電容CrssCgd,也叫米勒電容 然而,這三個等效電容是構成串并聯組合關系,他們并不是獨立的,而是相互…

STM32_05_時鐘樹

時鐘 d用來輸入數據,CLK就是我們的時鐘,CPU1s中72000000HZ個時鐘周期STM32的時鐘樹鎖相環HSE時鐘源HSI時鐘源LSE時鐘源LSI時鐘源SystemInit函數SetSysClock函數SetSysClockTo72函數SystemInit()后時鐘頻率大小總結RCC標準庫函數定義變量a&…

C語言---判斷語句

文章目錄1. if 語句2. if...else 語句3. if...else if...else 語句4. switch 語句5. 三元運算符 ( ? : )總結與對比如何選擇C語言中的判斷語句用于根據給定的條件來決定執行哪一段代碼。其核心是條件為真(必須)則執行一段代碼,條件為假&…

[硬件電路-212]:電流的本質確實是電子的移動

1. 微觀機制:電子的定向漂移與熱運動定向漂移(Drift Motion):在導體(如金屬)中,自由電子(價電子)受電場驅動,從負端向正端定向移動,形成宏觀電流。…

雙RFSOC47DR-16通道5GSPS ADC采集模塊

16通道5GSPS ADC采集板卡組成如圖1所示。該板卡的輸入接口為SMA單端輸入,ADC采集和處理采用Xilinx公司的XCZU47DR-2FFVE1156I芯片。板卡需配備4路QSFP28光口輸出,并需要集成網口、DDR4、SD卡、USB調試口。兩塊RF-Soc需確保連接通信功能。板卡的16通道需實…

pytest -- 中文文檔

前言 零基礎1小時快速入門pytest自動化測試教程,全套項目框架實戰pytest配置文件可以改變pytest的運行方式,它是一個固定的文件pytest.ini文件,讀取配置信息,按指定的方式去運行 非test文件 pytest里面有些文件是非test文件 pyt…

硬件開發2-ARM裸機開發3-IMX6ULL - 引入中斷

一、鋪墊引入中斷 → 按鍵1、概要:實現按鍵控制發光二極管和蜂鳴器輸入類型的外設:按鍵(key)2、參考手冊內容完成配置過程(1)key 按鍵原理圖(2)core 內核中命名 -- UART1 CTS&#x…

Ansible的 Playbook 模式詳解

目錄一、Playbook模式1.1 Playbook 的優勢1.2 Playbook 的組成1.3 安裝 httpd 服務案例1.4 Playbook 命令及常用參數1.5 Playbook 的語法 —— 權限相關1. remote_user2. become3. become_method1.6 Playbook 的通知與觸發機制1. notify2. handlers3. 使用示例4. 使用場景1.6 P…

猿輔導Java后臺開發面試題及參考答案

int 與 Integer 的區別是什么?若創建數量龐大的數字時使用 Integer,會對重復數字創建新對象嗎?int 是 Java 中的基本數據類型,直接存儲數值,占用 4 個字節,默認值為 0,不需要通過 new 關鍵字創建…

代碼隨想錄學習摘抄day9(回溯1-11)

一個樸實無華的目錄定義:回溯法也可以叫做回溯搜索法,它是一種搜索的方式。應用場景:回溯法解決的問題都可以抽象為樹形結構代碼模板題型第77題. 組合思路:每次從集合中選取元素,可選擇的范圍隨著選擇的進行而收縮&…

Altium Designer(AD24)打開工程文件的幾種方法

??《專欄目錄》 目錄 1,概述 2,源文件 2,菜單欄 4,工具欄 5,注意事項 1,概述 本文介紹幾種打開工程文件的方法。 2,源文件 找到工程的源文件存儲路徑,找到.PrjPcb的源工程文件,雙擊打開。 2,菜單欄 第1步:執行File→Open, 第2步:找到工程文件的存儲路徑,并選中…

Linux嵌入式自學筆記(基于野火EBF6ULL):2.點燈與ubuntu安裝

一、點燈登錄root:賬號:root ; 密碼:root點燈命令:echo 0 > /sys/class/leds/red/brightness #關閉red燈 echo 0 > /sys/class/leds/blue/brightness #關閉blue燈 echo 0 > /sys/class/leds/green/brightness …

【Java實戰?】Java實戰:MyBatis-Plus 開啟MySQL數據庫高效操作之旅

目錄 一、MyBatis-Plus 環境集成 1.1 項目依賴引入 1.2 數據庫配置 1.3 代碼生成器使用 二、核心 CRUD 操作實現 2.1 基礎查詢 2.2 數據新增與修改 2.3 復雜查詢場景 三、性能優化與高級特性 3.1 緩存配置 3.2 樂觀鎖實現 3.3 字段自動填充 四、實戰案例:用戶管理模塊開發 4.1…

開學季干貨——知識梳理與經驗分享

技術文章大綱:開學季干貨——知識梳理與經驗分享目標受眾分析明確文章面向的學生群體(如大學生、高中生) 分析不同群體的核心需求(課程準備、時間管理、工具使用) 結合技術場景(如數字筆記、在線協作&#…

Linux《線程(上)》

通過之前的學習我們已經了解了操作系統當中的基本的概念包括進程、基礎IO、磁盤文件存儲等,但是到目前為止我們還未了解到線程相關的概念,這就使得當前我們對操作系統的認知還不是完整的,現在我們是還是無法理解一個進程當中是如何同時的執行…

為什么知識復用時缺乏場景化指導影響實用性

知識復用時因缺乏場景化指導而嚴重影響實用性,其根本原因在于知識的價值本質上根植于其應用情境。脫離了場景的“純知識”往往是抽象、片面且難以行動的。這導致了認知鴻溝的產生、隱性知識的流失、決策風險的增加、以及學習遷移效率的低下。當使用者面對一份缺乏“…

擁抱直覺與創造力:走進VibeCoding的新世界

引言 在傳統觀念里,編程是一項高度理性、邏輯嚴密的活動,開發者需要像建筑師一樣,用代碼一行行地精確構建數字世界。然而,隨著人工智能技術的飛速發展,一種全新的編程理念和體驗正在興起——它就是 VibeCoding&#xf…

HTTP的Web服務測試在Python中的實現

在Web開發領域,對HTTP Web服務進行測試是確保服務穩定性和可靠性的關鍵步驟。Python作為一種功能強大的編程語言,提供了多種工具和庫來簡化這一過程。本文將介紹如何在Python中實現HTTP的Web服務測試。首先,Python的requests庫是測試HTTP Web…