Docker概念理解

容器技術(shù)

簡(jiǎn)單介紹

容器技術(shù)又稱為容器虛擬化

首先是一種虛擬化技術(shù)

虛擬化技術(shù)包括硬件虛擬化 半虛擬化 操作系統(tǒng)虛擬化

容器虛擬化就是操作系統(tǒng)虛擬化,是屬于輕量級(jí)的虛擬化

容器虛擬化技術(shù)是已經(jīng)集成到 Linux 內(nèi)核中的

容器的特性

容器首先是一個(gè)相對(duì)獨(dú)立的運(yùn)行環(huán)境,并且在一個(gè)容器環(huán)境中,應(yīng)該最小化對(duì)外界的影響,比如不能在容器中把宿主機(jī)上的資源全部消耗完,這就是資源控制。

容器虛擬化的核心技術(shù)

一般來說容器技術(shù)主要包含 Namespace 和 Cgroup 這兩個(gè)內(nèi)核特性

  • Namespace 又稱為命名空間(或名字空間), 主要做訪問隔離。其原理是針對(duì)一類資源進(jìn)行抽象,并將其封裝在一起提供給一個(gè)容器使用,對(duì)于這類資源,每個(gè)容器都有自己的抽象,而它們之間是不可見的,所以可以做到訪問隔離。
  • Cgroup 是 control group 的簡(jiǎn)稱,又稱為控制組,主要做資源控制。其原理是將一組進(jìn)程放在一個(gè)控制組里,通過給這個(gè)控制組分配指定的可用資源,達(dá)到控制這一組進(jìn)程可用資源的目的。

上述的兩個(gè)核心技術(shù)兩者并不存在依賴性,但是可以用組合的方式實(shí)現(xiàn)容器技術(shù)。

比如在一個(gè) Namespace 中的進(jìn)程恰好又在一個(gè) Cgroup 中,那么這些進(jìn)程就同時(shí)有了訪問隔離和資源控制。這恰恰是容器的特性。

容器技術(shù)的發(fā)展史

1982年

? 在普通的目錄結(jié)構(gòu)中創(chuàng)建一個(gè)完整的子目錄結(jié)構(gòu),可以稱為抽象化目錄結(jié)構(gòu)。

? 通過 chroot 技術(shù)實(shí)現(xiàn),就是把用戶的文件系統(tǒng)根目錄切換到某個(gè)指定的目錄下。

? 缺點(diǎn):

? 只是實(shí)現(xiàn)了視圖上的虛擬化

? 用戶實(shí)際上可以逃離設(shè)定的根目錄

2000年

linux 內(nèi)核版本 2.3.14 中引入了 pivot_root 技術(shù),它有效的避免了 chroot 帶來的安全性問題。

? 目前的容器技術(shù)都是使用了 pivot_root 技術(shù)來做根文件系統(tǒng)的切換。

? 缺點(diǎn):

? 僅僅是對(duì)文件系統(tǒng)隔離的增強(qiáng)

? 市場(chǎng)上也出現(xiàn)了一些商用的容器技術(shù),如 SWset(現(xiàn)在的 Odin) 開發(fā)的 Virtuozzo

2005年

? Odin公司在 Virtuozzo 的基礎(chǔ)上發(fā)布了 OpenVZ 技術(shù),同時(shí)開始推動(dòng) OpenVZ 中的核心容器技術(shù)進(jìn)入 Linux 內(nèi)核主線,而此時(shí) IBM 公司也在推動(dòng)類似的技術(shù),最后在社區(qū)的合作下,形成了目前大家看到的 Namespace 和 Cgorup

2013年

? 隨著容器技術(shù)在內(nèi)核主線中不斷成熟和完善,Docker 誕生了,并且由于它的誕生,容器技術(shù)才真正引起了全世界技術(shù)公司和開發(fā)人員的關(guān)注。

容器的組成

對(duì)于 Linux 容器的最小組成:

容器 = cgroup + namespace + rootfs + 容器引擎(用戶態(tài)工具)

  • Cgroup 資源控制,消耗的限制
  • Namespace 訪問隔離,空間的限制
  • rootfs 文件系統(tǒng)隔離
  • 容器引擎 生命周期控制

容器核心技術(shù)介紹

Cgroup

Cgroup 是什么

是 control group 的簡(jiǎn)寫,是屬于 Linux 內(nèi)核提供的一個(gè)特性,用于限制和隔離一組進(jìn)程對(duì)系統(tǒng)資源的使用。

這些資源包括 CPU、內(nèi)存、block I/O 和網(wǎng)絡(luò)帶寬。

Cgroup 從 2.6.24 開始進(jìn)入內(nèi)核主線。

從實(shí)現(xiàn)的角度來看,Cgroup 實(shí)現(xiàn)了一個(gè)通用的進(jìn)程分組的框架,不同的資源由各個(gè)子系統(tǒng)管理。

  • devices 設(shè)備權(quán)限控制
  • cpuset 分配指定的 CPU 和內(nèi)存節(jié)點(diǎn)。
  • cpu 控制 CPU 占用率
  • cpuacct 統(tǒng)計(jì) CPU 使用情況
  • memory 限制內(nèi)存的使用上限
  • freezer 凍結(jié) (暫停) Cgroup 中的進(jìn)程
  • net_cls 配合 tranffic contronller 限制網(wǎng)絡(luò)帶寬
  • net_prio 設(shè)置進(jìn)程的網(wǎng)絡(luò)流量?jī)?yōu)先級(jí)
  • huge_tlb 限制 HugeTLB d 使用
  • perf_event 允許 Perf 工具基于 Cgroup 分組做性能檢測(cè)
Cgroup 的接口

原生接口通過 cgorupfs 提供,是一種虛擬文件系統(tǒng)。

要想使用必須先掛載 cgroupfs 文件系統(tǒng),命令如下:

# mount -t cgroup -o cpuset cpuset  /sys/fs/cgroup/cpuset

注意: 這個(gè)動(dòng)作一般已經(jīng)在啟動(dòng)時(shí)由系統(tǒng)自動(dòng)完成了。

查看默認(rèn)的 cgroupfs

[root@localhost ~]# ls -l /sys/fs/cgroup/cpuset

Namespace

Namespace 介紹

Namespace 是將內(nèi)核的全局資源做封裝, 使得每個(gè) Namespace 都有一份獨(dú)立的資源,因此不同的進(jìn)程在各自的 Namespace 內(nèi)對(duì)同一種資源的使用不會(huì)互相干擾。

目前實(shí)現(xiàn)了以下幾種 Namespace

  • IPC 隔離 SystemV IPC 和 POSIX 消息隊(duì)列,IPC 就是進(jìn)程間通信

  • Network 隔離網(wǎng)絡(luò)資源,有獨(dú)立的 網(wǎng)絡(luò)設(shè)備, IP 地址, 路由表, /proc/net 目錄。

  • Mount 隔離文件系統(tǒng)掛載點(diǎn),不同 Namspace 的進(jìn)程看到的文件結(jié)構(gòu)不同

  • PID 隔離進(jìn)程 ID

  • UTS 隔離主機(jī)名和域名,UTS("UNIX Time-sharing System") 名字空間允許每個(gè)容器擁有獨(dú)立的

    ? hostname 和 domain name, 使其在網(wǎng)絡(luò)上可以被視作一個(gè)獨(dú)立的節(jié)點(diǎn)而非主機(jī)上的一個(gè)進(jìn)程。

  • User 隔離用戶 ID 和組 ID,每個(gè)容器可以有不同的用戶和組 id, 也就是說可以在容器內(nèi)用容器內(nèi)部的用

    ? 戶執(zhí)行程序而非主機(jī)上的用戶。

Docker 容器和虛擬機(jī)的區(qū)別

image.png
1. 實(shí)現(xiàn)原理技術(shù)不同

虛擬機(jī)是用來進(jìn)行硬件資源劃分的完美解決方案,利用的是硬件虛擬化技術(shù),如此VT-x 、AMD-V會(huì)通過一個(gè) hypervisor 層來實(shí)現(xiàn)對(duì)資源的徹底隔離。

而容器則是操作系統(tǒng)級(jí)別的虛擬化,利用的是內(nèi)核的 Cgroup 和 Namespace 特性,此功能通過軟件來實(shí)現(xiàn),僅僅是進(jìn)程本身就可以實(shí)現(xiàn)互相隔離,不需要任何輔助。

2. 使用資源方面不同

Docker 容器與主機(jī)共享操作系統(tǒng)內(nèi)核,不同的容器之間可以共享部分系統(tǒng)資源,因此更加輕量級(jí),消耗的資源更少。

虛擬機(jī)會(huì)獨(dú)占分配給自己的資源,不存在資源共享,各個(gè)虛擬機(jī)之間近乎完全隔離,更加重量級(jí),也會(huì)消耗更多的資源。

3. 應(yīng)用場(chǎng)景不同

若需要資源的完全隔離并且不考慮資源的消耗,可以使用虛擬機(jī)。

若是想隔離進(jìn)程并且需要運(yùn)行大量進(jìn)程實(shí)例,應(yīng)該選擇 Docker 容器。

Docker 容器和虛擬機(jī)合作

可以在一臺(tái)虛擬機(jī)上創(chuàng)建 Docker 容器

image.png

什么是Docker

2013 年初,一個(gè)叫 dotCloud 的 PaaS 服務(wù)提供商,將一個(gè)內(nèi)部項(xiàng)目 Docker 開源。

之后 Docker 一詞迅速爆紅。

這家公司干脆出售了其所持有的 PaaS 平臺(tái)業(yè)務(wù),并且改名為 Docker.Inc ,之后專注于 Docker 的開發(fā)和推廣。

Docker 實(shí)際上是一個(gè)開源的容器引擎,可以方便的對(duì)容器進(jìn)行管理。

目前 Docker 已經(jīng)加入 Linux 基金會(huì),并遵循 Apache 2.0 協(xié)議,其代碼托管于 Github

https://github.com/docker/docker

image.png

Docker 的架構(gòu)

image.png

docker是一個(gè)C/S模式的架構(gòu),后端是一個(gè)松耦合架構(gòu),模塊各司其職。

  1. 用戶是使用Docker Client與Docker Daemon建立通信,并發(fā)送請(qǐng)求給后者。
  2. Docker Daemon作為Docker架構(gòu)中的主體部分,首先提供Server的功能使其可以接受Docker Client的請(qǐng)求;
  3. Engine執(zhí)行Docker內(nèi)部的一系列工作,每一項(xiàng)工作都是以一個(gè)Job的形式的存在。
  4. Job的運(yùn)行過程中,當(dāng)需要容器鏡像時(shí),則從Docker Registry中下載鏡像,并通過鏡像管理驅(qū)動(dòng)graphdriver將下載鏡像以Graph的形式存儲(chǔ);
  5. 當(dāng)需要為Docker創(chuàng)建網(wǎng)絡(luò)環(huán)境時(shí),通過網(wǎng)絡(luò)管理驅(qū)動(dòng)networkdriver創(chuàng)建并配置Docker容器網(wǎng)絡(luò)環(huán)境;
  6. 當(dāng)需要限制Docker容器運(yùn)行資源或執(zhí)行用戶指令等操作時(shí),則通過execdriver來完成。
  7. libcontainer是一項(xiàng)獨(dú)立的容器管理包,networkdriver以及execdriver都是通過libcontainer來實(shí)現(xiàn)具體對(duì)容器進(jìn)行的操作

實(shí)際上 Docker 并不會(huì)直接于內(nèi)核交互,是通過一個(gè)更底層的工具 Libcontainer 與內(nèi)核交互的。

Libcontainer 才是真正意義上的容器引擎,它通過 clone 系統(tǒng)調(diào)用直接創(chuàng)建容器,通過 pivot_root 系統(tǒng)調(diào)用進(jìn)入容器,且通過直接操作 Cgroupfs 文件實(shí)現(xiàn)對(duì)資源的管控,而 Docker 更側(cè)重于處理更上層的業(yè)務(wù)。

Docker 的另一個(gè)優(yōu)勢(shì)是對(duì)層級(jí)鏡像的創(chuàng)新應(yīng)用,即不同的容器可以共享底層的只讀鏡像。

通過寫入自己特有的內(nèi)容后添加新的鏡像層,新增的鏡像層和下層的鏡像一起又可以作為基礎(chǔ)鏡像被更上層的鏡像使用。

Graph

先說 Union Mount,它支持把一個(gè)目錄A疊加到另一個(gè)目錄B之上;用戶對(duì)目錄B的讀取就是A加上B的內(nèi)容,而對(duì)B目錄里文件寫入和改寫則會(huì)保存在目錄A上,因?yàn)锳在上一層。

比如一個(gè)最主要的應(yīng)用是,把一張CD/DVD和一個(gè)硬盤目錄給聯(lián)合 mount在一起,然后,你就可以對(duì)這個(gè)只讀的CD/DVD上的文件進(jìn)行修改(當(dāng)然,修改的文件存于硬盤上的目錄里)。

Docker 對(duì) Union mount 的應(yīng)用,使得在多個(gè)容器使用通過一個(gè)基礎(chǔ)鏡像時(shí),可以極大的減少內(nèi)存占用,因?yàn)椴煌娜萜髟L問同一個(gè)文件時(shí),只會(huì)占用一份內(nèi)存。這就需要使用支持 Union mount 的文件系統(tǒng)作為存儲(chǔ)的 Graph設(shè)備,比如 AUFS 和 Overlay。

Docker 功能和組件

  • Docker 客戶端
  • Docker daemon
  • Docker 容器
  • Registry

Docker 客戶端

在 Linux 系統(tǒng)上,Docker 將客戶端和服務(wù)端統(tǒng)一在同一個(gè)二進(jìn)制文件中發(fā)布。

客戶端用 docker command 來發(fā)起請(qǐng)求,也可以使用一整套 RESTful API 來發(fā)起請(qǐng)求。

Docker daemon

可以被理解為 Docker server ,另外也常常用 Docker Engine 來描述它,因?yàn)樗鼘?shí)際上是驅(qū)動(dòng)整個(gè) Docker 功能的核心引擎。

接收客戶端的請(qǐng)求,并實(shí)現(xiàn)請(qǐng)求所要求的功能,同時(shí)針對(duì)請(qǐng)求返回相應(yīng)的結(jié)果。

Docker 容器

在Dockers 的功能和概念中, 容器是一個(gè)核心內(nèi)容,在性能上給 Docker 在虛擬化方面帶來了極大的優(yōu)勢(shì)。

功能上 Docker 同過 Libcontainer 實(shí)現(xiàn)對(duì)容器生命周期的管理,信息的設(shè)置和查詢,以及監(jiān)控和通信等功能。

并且容器是對(duì)鏡像的完美詮釋,容器以鏡像為基礎(chǔ),使鏡像有了鮮活的生命,同時(shí)為鏡像提供了一個(gè)標(biāo)準(zhǔn)的和隔離的運(yùn)行環(huán)境。

Docker 鏡像

與容器對(duì)應(yīng),是一個(gè)還沒有運(yùn)行起來的環(huán)境。

包括了應(yīng)用和這些應(yīng)用運(yùn)行時(shí)的環(huán)境。

它只是一個(gè)可定制的 rootfs。

Docker 鏡像的另一創(chuàng)新就是 它是層級(jí)的并且可復(fù)用。

通常通過 Dockerfile 來創(chuàng)建,Dockerfile 提供了鏡像內(nèi)容的定制。

鏡像就像是面向?qū)ο缶幊讨械念?,而容器就是這個(gè)類的實(shí)例

Registry

是一個(gè)存放鏡像的倉(cāng)庫(kù),通常被部署在互聯(lián)網(wǎng)服務(wù)器或者云端。

Registry 相當(dāng)于傳輸軟件的中轉(zhuǎn)站。

Docker 公司提供了官方的 Registry ,叫 Docker Hub。

Docker Hub 提供了大多數(shù)常用的軟件和發(fā)行版的官方鏡像,當(dāng)然還有無數(shù)個(gè)人用戶的個(gè)人鏡像,都是免費(fèi)的。

Registry 本身也是一個(gè)單獨(dú)的開源項(xiàng)目,任何人都可以下載后部署自己的 Registry

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Docker容器技術(shù)已經(jīng)發(fā)展了好些年,在很多項(xiàng)目都有應(yīng)用,線上運(yùn)行也很穩(wěn)定。整理了部分Docker的學(xué)習(xí)筆記以及新...
    __七把刀__閱讀 11,629評(píng)論 0 58
  • 1. 容器 1.1 定義 一種沙盒技術(shù),可以將應(yīng)用運(yùn)行在其中,與外界隔離這個(gè)沙盒可以被方便地“轉(zhuǎn)移”。 本質(zhì)上,他...
    小劉要學(xué)習(xí)閱讀 4,352評(píng)論 0 1
  • 一、Docker 簡(jiǎn)介 Docker 兩個(gè)主要部件:Docker: 開源的容器虛擬化平臺(tái)Docker Hub: 用...
    R_X閱讀 4,521評(píng)論 0 27
  • 上文詳細(xì)介紹了HashMap的內(nèi)容,但是由于HashMap不是線程安全的,因此使用起來會(huì)存在一定的風(fēng)險(xiǎn)。本文主要介...
    niaoge2016閱讀 1,629評(píng)論 2 2
  • 因?yàn)槭浅鯌?,想要認(rèn)真對(duì)待,所以寫了下來。 我叫提子,今年22歲。和S桑交往中。 S桑,人如其名,是純種霓虹國(guó)東京人...
    雪糕提子閱讀 186評(píng)論 0 0

友情鏈接更多精彩內(nèi)容