一、什么是docker容器
????????Docker容器是一種輕量級、可移植的軟件封裝技術,它允許開發者將應用程序及其依賴、配置文件、運行環境等打包到一個獨立的、自包含的執行單元中。容器與虛擬機相似,都提供了隔離的運行環境,但容器更加輕量級,因為它不需要像虛擬機那樣為每個應用配備完整的操作系統;而是共享主機的操作系統內核,同時利用資源隔離機制(如cgroups和命名空間)來保證容器間互不影響。
Docker容器的核心優勢包括:
- 輕量級:啟動和停止速度極快,資源利用率高,相比傳統虛擬機,容器在內存和CPU使用上更為高效。
- 標準化:Docker鏡像提供了一種標準化的軟件打包和交付方式,使得應用程序可以在任何支持Docker的環境中一致地運行,實現了“一次構建,到處運行”。
- 隔離性:每個容器都在自己的視圖中運行,擁有獨立的文件系統、網絡配置、進程空間等,與宿主機和其他容器隔離。
- 可移植性:Docker容器可以在不同的硬件平臺、操作系統和云環境中無縫遷移。
- 可擴展性:易于創建、復制和銷毀容器,便于實現水平擴展和負載均衡。
容器與虛擬機的區別
????????為什么要和虛擬機做比較,用過虛擬機的同學應該知道,虛擬機也是將主機資源分配出一部分,進行隔離,提供另一個系統環境。但是虛擬機是模擬出了一臺完整的電腦,包括它的硬件資源,虛擬機是可以像電腦一樣進入bios中,使用u盤安裝系統的。
容器
????????容器是應用層的抽象,它將代碼和依賴關系打包在一起。多個容器可以在同一臺機器上運行,并與其他容器共享操作系統內核,每個容器在用戶空間中作為獨立進程運行。容器占用的空間比VM少(容器映像的大小通常為幾十MB),可以處理更多的應用程序,并且需要更少的VM和操作系統。
虛擬機
????????虛擬機(VM)是物理硬件的抽象,將一臺服務器轉變為多臺服務器。管理程序允許多臺VM在單臺機器上運行。每個VM都包含操作系統的完整副本,應用程序,必要的二進制文件和庫 - 占用數十GB。虛擬機也可能很慢啟動。
為什么要使用容器?
????????首先建立在我們需要環境隔離的基礎上。
????????根據上面的介紹,可以看出虛擬機,是主機級虛擬化,完整的虛擬出一臺計算機,然后在虛擬出來的機器上安裝操作系統,做到環境隔離。想想我們的服務部署在虛擬機上是什么情況。
????????如上圖所示,在宿主機中安裝了系統,系統中安裝了虛擬機,虛擬機虛擬出一臺計算機,在虛擬計算機中安裝完整的系統,再將服務部署在虛擬系統中。
? ? ? ?部署的服務受虛擬機的內核調度,虛擬機受主機的調度,多層及下主機資源產生了嚴重的浪費。如果要在一臺機器上部署多個服務,還要環境隔離,那就需要有多個虛擬機,所需要的資源也就不言而喻。
如果使用容器是什么樣的呢?
????????容器是在主機的操作系統中,隔離出單獨的用戶空間,每個都是單獨的沙箱,環境互不影響。需要的系統資源也只是服務所需要的資源,減少了虛擬主機的資源開銷。
?二、什么是鏡像
Docker鏡像(Docker Image)是Docker技術中的核心組件之一,它是一個輕量級、可執行的獨立軟件包,充當了創建Docker容器的藍圖或模板。鏡像定義了運行應用程序所需的所有內容,包括代碼、運行時環境(如Python、Node.js等)、庫依賴、環境變量、配置文件以及操作系統的層。每個Docker容器都是從某個鏡像實例化而來的。
Docker鏡像的幾個關鍵特性包括:
-
分層結構:Docker鏡像是由多個層(layers)組成的,每一層代表了文件系統的差異變更。這種分層設計使得鏡像的構建、傳輸和存儲更加高效。當一個層被更改或添加,只會保存該層的差異部分,而非整個鏡像,這有助于減小存儲占用和加速鏡像的傳輸過程。
-
不可變性:一旦構建完成,鏡像的內容就是靜態的、只讀的。這意味著運行時對容器的修改不會影響到原始鏡像,保證了環境的一致性和可復現性。
-
內容尋址:每個鏡像層都有一個唯一的ID,通常是通過SHA256算法計算得出的校驗和,確保了鏡像的唯一性和完整性。當從Docker Hub或其他注冊表下載鏡像時,Docker會檢查本地是否已存在相同的層,從而避免重復下載,提高了效率。
-
可移植性:Docker鏡像可以在任何支持Docker的平臺上運行,確保了應用程序在不同環境之間的一致運行,實現了“一次構建,到處運行”的理念。
-
創建與管理:用戶可以通過Dockerfile來定義和自動化構建鏡像的過程,也可以基于現有鏡像使用
docker commit
命令創建新鏡像,或者通過docker pull
命令從Docker Hub等鏡像倉庫下載鏡像,使用docker images
命令查看本地鏡像列表。
三、什么是倉庫
Docker倉庫(Docker Repository)是集中存儲和分發Docker鏡像的場所,類似于代碼倉庫用于存儲代碼一樣,Docker倉庫用于存放用戶創建或下載的Docker鏡像(可以理解為軟件商店)。倉庫是Docker生態系統中非常關鍵的一部分,它支持Docker鏡像的分享、重用和版本控制。
Docker倉庫可以分為兩大類:
-
公共倉庫:最知名的公共倉庫是Docker Hub,這是Docker官方維護的服務,用戶可以免費上傳和下載鏡像。Docker Hub上存有成千上萬的鏡像,包括各種流行的應用、服務以及基礎鏡像,如Ubuntu、Nginx、MySQL等。任何人都可以搜索、下載這些鏡像來使用,也可以上傳自己的鏡像供他人使用。
-
私有倉庫:除了公共倉庫,用戶或組織還可以搭建自己的私有倉庫,用于存儲和管理不想公開的鏡像,或滿足企業內部的安全和合規要求。私有倉庫可以使用Docker官方提供的Docker Registry軟件來部署,也可以使用第三方的私有倉庫解決方案,如Harbor、GitLab Container Registry等。
Docker倉庫的工作原理涉及倉庫注冊服務器(Registry),這是一個存儲和分發鏡像的服務端組件。每個倉庫可以包含多個鏡像,每個鏡像又有不同的標簽(tags),標簽用來標記鏡像的版本或變體。當用戶執行docker pull
或docker push
命令時,實際上是在與倉庫注冊服務器進行通信,以下載或上傳鏡像。
參考文章:Docker容器技術----什么是容器? - 簡書