不能不知道的Docker知识
1.Docker是什么?
我們?cè)诶斫?Docker 之前,首先得先區(qū)分清楚兩個(gè)概念,容器和虛擬機(jī)。
可能很多朋友都用過(guò)虛擬機(jī),而對(duì)容器這個(gè)概念比較的陌生。我們用的傳統(tǒng)虛擬機(jī)如 VMware , VisualBox 之類的需要模擬整臺(tái)機(jī)器包括硬件。每臺(tái)虛擬機(jī)都需要有自己的操作系統(tǒng),虛擬機(jī)一旦被開(kāi)啟,預(yù)分配給它的資源將全部被占用。每一臺(tái)虛擬機(jī)包括應(yīng)用,必要的二進(jìn)制和庫(kù),以及一個(gè)完整的用戶操作系統(tǒng)。而容器技術(shù)是和我們的宿主機(jī)共享硬件資源及操作系統(tǒng),可以實(shí)現(xiàn)資源的動(dòng)態(tài)分配。
容器包含應(yīng)用和其所有的依賴包,但是與其他容器共享內(nèi)核。容器在宿主機(jī)操作系統(tǒng)中,在用戶空間以分離的進(jìn)程運(yùn)行。容器技術(shù)是實(shí)現(xiàn)操作系統(tǒng)虛擬化的一種途徑,可以讓您在資源受到隔離的進(jìn)程中運(yùn)行應(yīng)用程序及其依賴關(guān)系。通過(guò)使用容器,我們可以輕松打包應(yīng)用程序的代碼、配置和依賴關(guān)系,將其變成容易使用的構(gòu)建塊,從而實(shí)現(xiàn)環(huán)境一致性、運(yùn)營(yíng)效率、開(kāi)發(fā)人員生產(chǎn)力和版本控制等諸多目標(biāo)。容器可以幫助保證應(yīng)用程序快速、可靠、一致地部署,其間不受部署環(huán)境的影響。容器還賦予我們對(duì)資源更多的精細(xì)化控制能力,讓我們的基礎(chǔ)設(shè)施效率更高。
通過(guò)下面這幅圖,我們可以很直觀的看出這兩者的區(qū)別所在:
Docker 屬于 Linux 容器的一種封裝,提供簡(jiǎn)單易用的容器使用接口。它是目前最流行的 Linux 容器解決方案。而 Linux 容器是 Linux 發(fā)展出的另一種虛擬化技術(shù),簡(jiǎn)單來(lái)講, Linux 容器不是模擬一個(gè)完整的操作系統(tǒng),而是對(duì)進(jìn)程進(jìn)行隔離,相當(dāng)于是在正常進(jìn)程的外面套了一個(gè)保護(hù)層。對(duì)于容器里面的進(jìn)程來(lái)說(shuō),它接觸到的各種資源都是虛擬的,從而實(shí)現(xiàn)與底層系統(tǒng)的隔離。Docker 將應(yīng)用程序與該程序的依賴,打包在一個(gè)文件里面。運(yùn)行這個(gè)文件,就會(huì)生成一個(gè)虛擬容器。程序在這個(gè)虛擬容器里運(yùn)行,就好像在真實(shí)的物理機(jī)上運(yùn)行一樣。有了 Docker ,就不用擔(dān)心環(huán)境問(wèn)題。
總體來(lái)說(shuō),Docker 的接口相當(dāng)簡(jiǎn)單,用戶可以方便地創(chuàng)建和使用容器,把自己的應(yīng)用放入容器。容器還可以進(jìn)行版本管理、復(fù)制、分享、修改,就像管理普通的代碼一樣。
2.Docker 的優(yōu)勢(shì):
3.Docker 中三個(gè)基本的概念:
- Image(鏡像)
- Container(容器)
- Repository(倉(cāng)庫(kù))
3.1Image(鏡像)
那么鏡像到底是什么呢?Docker 鏡像可以看作是一個(gè)特殊的文件系統(tǒng),除了提供容器運(yùn)行時(shí)所需的程序、庫(kù)、資源、配置等文件外,還包含了一些為運(yùn)行時(shí)準(zhǔn)備的一些配置參數(shù)(如匿名卷、環(huán)境變量、用戶等)。鏡像不包含任何動(dòng)態(tài)數(shù)據(jù),其內(nèi)容在構(gòu)建之后也不會(huì)被改變,鏡像(Image)就是一堆只讀層(read-only layer)的統(tǒng)一視角。
從左邊我們看到了多個(gè)只讀層,它們重疊在一起。除了最下面一層,其他層都會(huì)有一個(gè)指針指向下一層。這些層是 Docker 內(nèi)部的實(shí)現(xiàn)細(xì)節(jié),并且能夠在主機(jī)的文件系統(tǒng)上訪問(wèn)到。統(tǒng)一文件系統(tǒng)(Union File System)技術(shù)能夠?qū)⒉煌膶诱铣梢粋€(gè)文件系統(tǒng),為這些層提供了一個(gè)統(tǒng)一的視角。這樣就隱藏了多層的存在,在用戶的角度看來(lái),只存在一個(gè)文件系統(tǒng)。我們可以在圖片的右邊看到這個(gè)視角的形式。
3.2Container(容器)
容器(Container)的定義和鏡像(Image)幾乎一模一樣,也是一堆層的統(tǒng)一視角,唯一區(qū)別在于容器的最上面那一層是可讀可寫的。
由于容器的定義并沒(méi)有提及是否要運(yùn)行容器,所以實(shí)際上,容器 = 鏡像 + 讀寫層。
3.3Repository(倉(cāng)庫(kù))
Docker 倉(cāng)庫(kù)是集中存放鏡像文件的場(chǎng)所。鏡像構(gòu)建完成后,可以很容易的在當(dāng)前宿主上運(yùn)行。但是, 如果需要在其他服務(wù)器上使用這個(gè)鏡像,我們就需要一個(gè)集中的存儲(chǔ)、分發(fā)鏡像的服務(wù),Docker Registry(倉(cāng)庫(kù)注冊(cè)服務(wù)器)就是這樣的服務(wù)。有時(shí)候會(huì)把倉(cāng)庫(kù)(Repository)和倉(cāng)庫(kù)注冊(cè)服務(wù)器(Registry)混為一談,并不嚴(yán)格區(qū)分。
Docker 倉(cāng)庫(kù)的概念跟 Git 類似,注冊(cè)服務(wù)器可以理解為 GitHub 這樣的托管服務(wù)。實(shí)際上,一個(gè) Docker Registry 中可以包含多個(gè)倉(cāng)庫(kù)(Repository),每個(gè)倉(cāng)庫(kù)可以包含多個(gè)標(biāo)簽(Tag),每個(gè)標(biāo)簽對(duì)應(yīng)著一個(gè)鏡像。所以說(shuō),鏡像倉(cāng)庫(kù)是 Docker 用來(lái)集中存放鏡像文件的地方,類似于我們之前常用的代碼倉(cāng)庫(kù)。
通常,一個(gè)倉(cāng)庫(kù)會(huì)包含同一個(gè)軟件不同版本的鏡像,而標(biāo)簽就常用于對(duì)應(yīng)該軟件的各個(gè)版本 。我們可以通過(guò)<倉(cāng)庫(kù)名>:<標(biāo)簽>的格式來(lái)指定具體是這個(gè)軟件哪個(gè)版本的鏡像。如果不給出標(biāo)簽,將以 Latest 作為默認(rèn)標(biāo)簽。
倉(cāng)庫(kù)又可以分為兩種形式:
- Public(公有倉(cāng)庫(kù))
- Private(私有倉(cāng)庫(kù))
Docker Registry 公有倉(cāng)庫(kù)是開(kāi)放給用戶使用、允許用戶管理鏡像的 Registry 服務(wù)。一般這類公開(kāi)服務(wù)允許用戶免費(fèi)上傳、下載公開(kāi)的鏡像,并可能提供收費(fèi)服務(wù)供用戶管理私有鏡像。除了使用公開(kāi)服務(wù)外,用戶還可以在本地搭建私有 Docker Registry。Docker 官方提供了 Docker Registry 鏡像,可以直接使用做為私有 Registry 服務(wù)。當(dāng)用戶創(chuàng)建了自己的鏡像之后就可以使用 Push 命令將它上傳到公有或者私有倉(cāng)庫(kù),這樣下次在另外一臺(tái)機(jī)器上使用這個(gè)鏡像時(shí)候,只需要從倉(cāng)庫(kù)上 Pull 下來(lái)就可以了。
4.Docker 的架構(gòu):
我們從下圖可以直觀地看到 Docker 的架構(gòu):
Docker 使用 C/S 結(jié)構(gòu),即客戶端/服務(wù)器體系結(jié)構(gòu)。Docker 客戶端與 Docker 服務(wù)器進(jìn)行交互,Docker服務(wù)端負(fù)責(zé)構(gòu)建、運(yùn)行和分發(fā) Docker 鏡像。
5.Docker 常用命令:
?
?
總結(jié)
以上是生活随笔為你收集整理的不能不知道的Docker知识的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 有关架构图你需要了解的基础知识
- 下一篇: 对kubernetes的认识