云原生技術(shù)系列-Containerization容器化Docker

前言

Docker 是一個(gè)開源的應(yīng)用容器引擎,基于 Go 語(yǔ)言 并遵從 Apache2.0 協(xié)議開源。

Docker 可以讓開發(fā)者打包他們的應(yīng)用以及依賴包到一個(gè)輕量級(jí)、可移植的容器中,然后發(fā)布到任何流行的 Linux 機(jī)器上,也可以實(shí)現(xiàn)虛擬化。

容器是完全使用沙箱機(jī)制,相互之間不會(huì)有任何接口(類似 iPhone 的 app),更重要的是容器性能開銷極低。

image.png

正文

物理機(jī)、虛擬機(jī)和容器

image.png
image.png
image.png

容器虛擬化的是操作系統(tǒng)而不是硬件,容器之間是共享同一套操作系統(tǒng)資源的。
虛擬機(jī)技術(shù)是虛擬出一套硬件后,在其上運(yùn)行一個(gè)完整操作系統(tǒng)。
因此容器的隔離級(jí)別會(huì)稍低一些。

image.png

明顯區(qū)別:
Docker比虛擬化少了兩層,取消了 hypervisor 層和 GuestOS 層,使用 Docker Engine 進(jìn)行調(diào)度和隔離,所有應(yīng)用共用主機(jī)操作系統(tǒng),因此在體量上 Docker 較虛擬機(jī)更輕量級(jí),在性能上優(yōu)于虛擬化,接近裸機(jī)性能。

本質(zhì)區(qū)別:

  • 虛擬機(jī)是操作系統(tǒng)級(jí)別的資源隔離,
  • 容器是進(jìn)程級(jí)別的隔離
image.png

Docker優(yōu)勢(shì):

  • 更低的硬件成本
  • 更快速的部署環(huán)境
  • 更簡(jiǎn)便的環(huán)境維護(hù)
  • 與微服務(wù)架構(gòu)更為契合

Docker不足:

  • 隔離效果不如VM,共享宿主機(jī)操作系統(tǒng)的一些基礎(chǔ)庫(kù)等
  • 網(wǎng)絡(luò)配置功能相對(duì)簡(jiǎn)單,主要以橋接方式為主
  • 查看日志也不夠方便靈活

Docker的優(yōu)勢(shì)

  • 輕量:在一臺(tái)機(jī)器上運(yùn)行的多個(gè)Docker容器可以共享這臺(tái)機(jī)器的操作系統(tǒng)內(nèi)核;它們能夠迅速啟動(dòng),只需占用很少的計(jì)算和內(nèi)存資源。鏡像是通過文件系統(tǒng)層進(jìn)行構(gòu)造的,并共享一些公共文件。這樣就能盡量降低磁盤用量,并能更快地下載鏡像。
  • 標(biāo)準(zhǔn):Docker容器基于開放式標(biāo)準(zhǔn),能夠在所有主流Linux版本、Microsoft Windows以及包括VM、裸機(jī)服務(wù)器和云在內(nèi)的任何基礎(chǔ)設(shè)施上運(yùn)行。
  • 安全:Docker賦予應(yīng)用的隔離性不僅限于彼此隔離,還獨(dú)立于底層的基礎(chǔ)設(shè)施。Docker默認(rèn)提供最強(qiáng)的隔離,因此應(yīng)用出現(xiàn)問題,也只是單個(gè)容器的問題,而不會(huì)波及到整臺(tái)機(jī)器。

Docker Engine

Docker daemon: 運(yùn)行在宿主機(jī)上,Docker守護(hù)進(jìn)程,用戶通過Docker client(Docker命令)與Docker daemon交互

Docker client: Docker 命令行工具,是用戶使用Docker的主要方式,Docker client與Docker daemon通信并將結(jié)果返回給用戶,Docker client也可以通過socket或者RESTful api訪問遠(yuǎn)程的Docker daemon

image.png

Docker的理念

Build, Ship, and Run Any App, Anywhere

image.png
image.png

Docker的核心組成

image.png

鏡像Image

image.png
image.png
  • 內(nèi)容:打包程序運(yùn)行所需的應(yīng)用、環(huán)境等參數(shù)信息
  • 分層結(jié)構(gòu),每層一個(gè)hash值,類似于Git commit,方便回滾,因此建議在制作每一層的功能盡量相對(duì)獨(dú)立和完整。
  • 好處:減少了硬盤存儲(chǔ)的大小。保存每次變更,不保存每個(gè)版本的完整結(jié)果。
  • 注意:刪除每一層不需要的內(nèi)容。Why?某一層遺忘刪除的內(nèi)容會(huì)被保留到后續(xù)的層級(jí),從而導(dǎo)致最終鏡像膨脹。

容器(Container)

鏡像(Image)和容器(Container)的關(guān)系,就像是面向?qū)ο蟪绦蛟O(shè)計(jì)中的類和實(shí)例一樣,鏡像是靜態(tài)的定義,容器是鏡像運(yùn)行時(shí)的實(shí)體。

容器可以被創(chuàng)建、啟動(dòng)、停止、刪除、暫停等 。

容器存儲(chǔ)層的生存周期和容器一樣,容器消亡時(shí),容器存儲(chǔ)層也隨之消亡。因此,任何保存于容器存儲(chǔ)層的信息都會(huì)隨容器刪除而丟失。使用數(shù)據(jù)卷來幫助解決這個(gè)問題。

數(shù)據(jù)卷(Volume)

文件數(shù)據(jù)存儲(chǔ)是數(shù)據(jù)交互的重要組成,在虛擬機(jī)中,通常直接采用虛擬機(jī)的文件系統(tǒng)作為應(yīng)用數(shù)據(jù)等文件的存儲(chǔ)位置,這種方式的問題在于,虛擬機(jī)或者容器出現(xiàn)問題導(dǎo)致文件系統(tǒng)無(wú)法使用時(shí),之前存放的數(shù)據(jù)也就丟失了。

另外一種方式,就是掛載真實(shí)數(shù)據(jù)源的方式,Docker就是采用這種方式,通過底層的Union File System 技術(shù),除了能夠從宿主操作系統(tǒng)中掛載目錄外,還能夠建立獨(dú)立的目錄持久存放數(shù)據(jù),或者在容器間共享。

數(shù)據(jù)卷的生存周期獨(dú)立于容器,容器消亡,數(shù)據(jù)卷不會(huì)消亡。因此, 使用數(shù)據(jù)卷后,容器可以隨意刪除、重新run,數(shù)據(jù)卻不會(huì)丟失。

倉(cāng)庫(kù)( Repository)

鏡像倉(cāng)庫(kù)是Docker用來集中存放鏡像文件的地方,類似于我們之前常用的代碼倉(cāng)庫(kù)。

一個(gè)倉(cāng)庫(kù)會(huì)包含同一個(gè)軟件不同版本的鏡像,而標(biāo)簽就常用于對(duì)應(yīng)該軟件的各個(gè)版本 。我們可以通過<倉(cāng)庫(kù)名>:<標(biāo)簽>的格式來指定具體是這個(gè)軟件哪個(gè)版本的鏡像。如果不給出標(biāo)簽,將以latest作為默認(rèn)標(biāo)簽。

Docker Registry有公服和私服之分,類似于Maven的公共倉(cāng)庫(kù)和私有倉(cāng)庫(kù)。

網(wǎng)絡(luò)(Network)

image.png
  • Bridge方式:默認(rèn)網(wǎng)絡(luò)連接方式,使用一個(gè)虛擬的網(wǎng)絡(luò)接口,橋接到宿主機(jī)上的網(wǎng)絡(luò)接口上。
  • Host方式:host方式可以讓容器無(wú)需創(chuàng)建自己的網(wǎng)絡(luò)協(xié)議棧,而直接訪問宿主機(jī)的網(wǎng)絡(luò)接口,在容器中執(zhí)行ip addr會(huì)發(fā)現(xiàn)與宿主機(jī)的網(wǎng)絡(luò)配置是一樣的,host方式讓容器直接使用宿主機(jī)的網(wǎng)絡(luò)接口,傳輸數(shù)據(jù)的效率會(huì)更加高效,避免bridge方式帶來的額外開銷,但是這種方式也可以讓容器訪問宿主機(jī)的D-bus等網(wǎng)絡(luò)服務(wù),可能會(huì)帶來意想不到的安全問題,應(yīng)謹(jǐn)慎使用host方式
  • Container方式:讓容器共享一個(gè)已經(jīng)存在的網(wǎng)絡(luò)配置
  • None方式:不會(huì)對(duì)容器的網(wǎng)絡(luò)做任務(wù)配置,需要用戶自己去定制。

docker生命周期

image.png

可以看到,容器的生命周期分為五種狀態(tài)

  • Created:容器已經(jīng)被創(chuàng)建,容器所需的相關(guān)資源已經(jīng)準(zhǔn)備就緒,但容器中的程序還未處于運(yùn)行狀態(tài)。
  • Running:容器正在運(yùn)行,也就是容器中的應(yīng)用正在運(yùn)行。
  • Paused:容器已暫停,表示容器中的所有程序都處于暫停 ( 不是停止 ) 狀態(tài)。
  • Stopped:容器處于停止?fàn)顟B(tài),占用的資源和沙盒環(huán)境都依然存在,只是容器中的應(yīng)用程序均已停止。
  • Deleted:容器已刪除,相關(guān)占用的資源及存儲(chǔ)在 Docker 中的管理信息也都已釋放和移除。

此外,這張圖中對(duì)于一些常用的指令也進(jìn)行了標(biāo)注,建議可以結(jié)合這張圖,一方面了解docker容器的生命周期,一方面也了解一些常用的docker操作指令。

DockerFile

作用:定義docker鏡像構(gòu)建步驟,適用于構(gòu)建比較復(fù)雜的docker鏡像。有點(diǎn)類似于makefile之于CPP項(xiàng)目,shell script之于shell指令。

命令 含義
FROM 指定基礎(chǔ)鏡像
RUN 構(gòu)建指令,會(huì)生成新的層。支持 \ 換行,多條之間用 && 連接,減少新層
COPY 將構(gòu)建命令所在的主機(jī)本地的文件或目錄,復(fù)制到鏡像文件系統(tǒng)
ADD 不僅能夠?qū)?gòu)建命令所在的主機(jī)本地的文件或目錄,而且能夠?qū)⑦h(yuǎn)程URL所對(duì)應(yīng)的文件或目錄,作為資源復(fù)制到鏡像文件系統(tǒng)。
ENTRYPOINT 主要用于對(duì)容器進(jìn)行一些初始化
CMD 定義容器中主程序的啟動(dòng)命令,建議使用數(shù)組的方式
EXPOSE 指定暴露的端口
VOLUME 指定掛載持久卷的位置

構(gòu)建鏡像指令:

docker build  -t {目錄} –f {dockerfile文件地址} 

Dockerfile的使用-一個(gè)完整的Demo


image.png

總結(jié)

  • 虛擬化:將計(jì)算機(jī)物理資源進(jìn)行抽象、轉(zhuǎn)換為虛擬的計(jì)算機(jī)資源提供給程序使用的技術(shù)
  • 容器技術(shù):為操作系統(tǒng)自身支持一些接口,能夠讓應(yīng)用程序間可以互不干擾的獨(dú)立運(yùn)行
  • docker:在開發(fā)、部署、運(yùn)維,以及集群化等方面,顯著的提升了工作效率
  • 鏡像:docker中可以運(yùn)行的虛擬環(huán)境,對(duì)比對(duì)象中的類
  • 容器:從鏡像中產(chǎn)生,隔離出來的虛擬環(huán)境,對(duì)比類的實(shí)例
  • 網(wǎng)絡(luò):程序間進(jìn)行數(shù)據(jù)交換,docker中共可以創(chuàng)建虛擬網(wǎng)絡(luò)進(jìn)行環(huán)境隔離
  • 數(shù)據(jù)卷:docker中文件存儲(chǔ),既能掛載,又能建立獨(dú)立的目錄持久存放數(shù)據(jù),還能容器共享
  • docker daemon:實(shí)現(xiàn)docker這套容器化技術(shù)的工具,以服務(wù)的形式運(yùn)行以便靜默的提供功能
  • docker cli:docker engine提供的通過命令行調(diào)用daemon接口的工具
  • dockerfile:定義docker鏡像構(gòu)建步驟

最后來一張圖:

image.png
?著作權(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)容

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