1. 程式人生 > 其它 >容器化-Docker-2-簡述容器化技術

容器化-Docker-2-簡述容器化技術

目錄

容器這個名詞的由來

說道這個容器這個詞,包括我們在網路上搜索的時候容器對應的最多的也是集裝箱

那麼容器這個詞是怎麼由來呢?在早起海運的時候貨物都是隨便堆放的,這對於後期的解除安裝和管理都是一個不小的難題

  • 包裝困難,每個貨物都需要有自己的包裝
  • 裝卸困難,每個貨物的大小、重量都不一樣需要不同的裝卸工具

集裝箱(容器誕生後)

  • 簡化了包裝,為避免貨物在運輸途中受到損壞,必須有堅固的包裝,而集裝箱具有堅固、密封的特點,其本身就是一種極好的包裝
  • 首先是裝卸效率特別低(普通貨船裝卸,一般每小時為35t左右,而集裝箱裝卸,每小時可達400t左右)

上面就是容器誕生的原因了

container這個詞有:集裝箱和容器兩個含義,集裝箱技術比較繞口、容器技術就成了container的實際翻譯了

什麼是容器技術

實機時代

痛點:

  • 多個APP放在一臺機上:存在資源搶佔以及故障影響
  • 多個APP放在多臺機器:存在資源浪費

解決方案:

  • 大家通過虛擬軟體來管理虛擬機器:建立、執行、銷燬解決了當時人們的訴求

虛機時代

隨著人們用虛擬化用的越來越溜,對資源的利用率越來越高

思考下我就為了啟動一個應用程式,我付出了什麼

  • 我就的安裝一遍作業系統
  • 重新部署一遍服務、還的確保一遍就正確
  • 虛機掛了、宿主掛了,上面的東西重新來一遍

提煉下目前的痛點:

  • 效率低
  • 易出錯
  • 容錯低

容器時代

人們需要一個新的技術,來解決當前的痛點,容器技術就誕生了

映象&容器

容器技術由兩部分組成:

  • 映象(特殊格式的打包檔案)
  • 容器(依賴核心功能建立的映象執行空間)

映象:包含了程式、程式依賴的Lib、環境,本質上就是一個壓縮包(它解決了環境一致性的問題)

容器:是核心建立的一個隔離的空間,執行映象(它解決了隔離問題防止程式互相干擾)

  • 核心功能Namespace:隔離 (名稱空間,是Linux核心功能,對核心分割槽分為不同的空間,讓程式感覺獨佔一個系統)
  • 核心功能Cgroup:限制 (是control groups[控制組]的縮寫,是一種Linux核心功能,用於限制,說明和隔離程序集合的資源使用(CPU,記憶體,磁碟I/O,網路等)

核心的名稱空間就類似,一個教學樓,N個班級公用這個教學樓,每個班級都可以上課公用教學樓的資源

如何讓程式以為自己在獨立使用這個系統呢?我們建立的獨立執行空間通過Namespace來讓程式感覺自己在獨立的系統中執行,那一個系統都應該有什麼

Linux namespace 實現了 7 項資源隔離,基本上涵蓋了一個小型作業系統的執行要素,包括主機名、使用者許可權、檔案系統、網路、程序號、程序間通訊、資源。

NameSpace 系統呼叫引數 隔離內容 核心支援的版本
Mount namespaces CLONE_NEWNS 掛載點 Linux 2.4.19
UTS namespaces CLONE_NEWUTS 主機名 Linux 2.6.19
IPC namespaces CLONE_NEWIPC 程序間通訊 Linux 2.6.19
PID namespaces CLONE_NEWPID 程序號 Linux 2.6.24
Network namespaces CLONE_NEWNET 網路 Linux 2.6.29
User namespaces CLONE_NEWUSER 使用者許可權 Linux 3.8
Cgroup namespaces CLONE_NEWCGROUP 資源 Linux 4.6

每個namespace的特性都解決了特定的需求,是逐步迭代的,好比之前就支援6個namespace,到現在已經支援7個了

這裡簡單說下,映象和容器和Docker的關係:

  • Docker建立映象
  • Docker通過實現呼叫Linux核心功能(Linux namespace)建立執行空間執行映象

映象和容器的關係

要說區別其實不太恰當,它們應該是階段的關係

容器技術和Dokcer的關係

Dokcer實現了容器技術:

  • Docker實現了高效產生映象的功能
  • Docker實現了管理容器的功能,呼叫核心特性(Nmaespace&Cgroup)然後:建立容器、管理容器、銷燬容器
  • Docker的出現推動了容器技術的飛速發展(一次構建,到處執行[Build once, run everywhere])

容器技術的發展催生了,容器標準OCI(Open Container Initiative 開放容器倡議),Docker也遵循這個標準

OCI(open container initiative開放容器標準)

  • 容器映象標準(映象怎麼打)
  • 容器執行時標準(容器怎麼執行管理:配置、執行環境、生命週期)

決了什麼問題

  • 環境不一致(映象:把所需的環境、程式碼、資料打包成映象)
  • 程式隔離問題(容器:核心建立的獨立執行空間,讓程式與程式之間隔離)
  • 資源浪費問題(公用底層的:硬體、系統(核心))
  • 管理管理麻煩問題(構建映象方便、管理容器方便)

Docker

為什麼是Docker

Docker是容器的解決方案之一,其他的還有Podman、coreos等那為什麼選擇Docker

最火的容器解決方案

容器創業公司 Sysdig 釋出了 2019 年容器使用報告 Docker 佔據了容器平臺市場的大部分份額,佔比為 79%,而排在第二位的是 containerd,佔比為 18%,排在第三位的 CRI-O 專案,佔比為 4%。這個調查結果與信通院的國內市場調查結果有異曲同工之妙,國內近六成企業選擇 Docker 作為容器執行技術。

優勢

  • DockerFile快速構建一個映象
  • 映象版本控制
  • 還提供了免費的映象倉庫
  • 跨平臺(win、linux、ubuntu、mac)一次部署到處使用
  • 活躍的社群和生態

擴充套件閱讀

NameSpace詳解

1、UTS namespace
UTS(UNIX Time-sharing System) namespace提供主機名和域名的隔離,這樣每個docker容器就可以擁有獨立的主機名和域名,在網路上可以被視作一個獨立的節點,而非宿主機上的程序了。
2、IPC namespace
程序間通訊(Inter-Process Cmmunication,IPC)涉及的IPC資源包括常見的訊號量、訊息佇列和共享記憶體。申請IPC資源就申請了一個全域性唯一的32位ID,所以IPC namespace中實際上包含系統IPC識別符號以及實現POSIX訊息佇列的檔案系統。在同一個IPC namespace下的程序彼此可見。
3、PID namespace
Linux核心為所有的PID namespace維護了一個樹狀結構,最頂層的是系統初始時建立的,被稱為root namespace。它建立的新的PID namespace稱為child namespace(樹的子節點),而原先的PID namespace就是新建立的PID namespace的parent namespace(樹的父節點)。通過這種方式,不同的PID namespace會形成一個層級體系。所屬的父節點可以看到子節點中的程序,並可以通過訊號等方式對子節點中的程序產生影響,反過來,子節點卻不能看到父節點PID namespace中的任何內容。
4、mount namespace
mount namespace通過隔離檔案系統掛載點對隔離檔案系統提供支援,隔離後,不同mount namespace中的檔案結構發生變化也互不影響。
5、network namespace
network namespace主要提供了關於網路資源的隔離,包括網路裝置、IPv4、IPv6協議棧、IP路由表、防火牆、/proc/net目錄、/sys/class/net目錄、套接字(socket)等。一個物理的網路裝置最多存在於一個network namespace中,可以通過建立veth pair在不同的network namespace間建立通道,以達到通訊目的。
6、user namespace
user namespace主要隔離了安全相關的識別符號(identifier)和屬性(attribute),包括使用者ID、使用者組ID、root目錄、key(金鑰)以及特殊許可權。

容器化和虛擬化有啥區別

說道Docker不得不說一下虛擬化,我相信大部分人或多或少都用過Vmware這些虛擬化軟體。

我們使用虛擬化軟體,可以虛擬出一個物理主機來(我們稱之為虛擬機器),然後給他重新安裝系統

原理對比

虛擬化

虛擬化的原理:在OS中加入一個虛擬化層,虛擬化層可以對下層(HostOS)硬體資源(物理CPU、記憶體、磁碟、網絡卡、顯示卡等)進行封裝、隔離,抽象為另一種形式的邏輯資源,再提供給上層(GuestOS)使用。所以你可以理解VMM其實就是聯絡HostOS和GuestOS的一箇中間件,當然虛擬化可以將一份資源抽象為多份,也可以將多份資源抽象為一份。

通過虛擬化技術實現的虛擬機器一般被稱之為GuestOS(客戶),而作為GuestOS載體的物理主機稱之為HostOS(宿主)。

容器化

容器技術通通過主機HostOS(核心),虛擬化一個執行空間(本質上是執行在HostOS上),執行程式

  • 啟動快:虛機這邊要啟動一個程式首先要建立一個虛擬系統然後在安裝成,容器化就是啟動個程式這麼簡單
  • 速度快:虛機排程還是需要經過一個虛擬系統層,容器直接執行在(HostOS上)少了一層速度肯定會快
作者:羅天帥
出處:http://www.cnblogs.com/luotianshuai/
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線。