Docker基本概念和底層原理解析
Docker架構(gòu)圖:
我們依照Docker架構(gòu)圖進(jìn)行Docker基礎(chǔ)概念的說明。
1、Docker的底層原理
Docker是一個(gè)Client-Server
結(jié)構(gòu)的系統(tǒng),Docker守護(hù)進(jìn)程運(yùn)行在主機(jī)上,然后通過Socket
連接從客戶端訪問,守護(hù)進(jìn)程從客戶端接受命令并管理運(yùn)行在主機(jī)上的容器。容器是一個(gè)運(yùn)行時(shí)環(huán)境,就好比是我們前面說到的集裝箱。
例如架構(gòu)圖中的客戶端(Client
)和服務(wù)端(DOCKER_HOST
):
發(fā)送命令docker run hello-world
- Docker客戶端轉(zhuǎn)發(fā)命令給宿主機(jī)上的Docker守護(hù)進(jìn)程(
Docker daemon
), - Docker守護(hù)進(jìn)程接收?qǐng)?zhí)行命令,返回命令執(zhí)行結(jié)果,
- Docker服務(wù)端(守護(hù)進(jìn)程)負(fù)責(zé)管理宿主機(jī)上的各個(gè)容器。
如下圖所示:
Docker客戶端和守護(hù)進(jìn)程通過Socket
連接,可以遠(yuǎn)程或本地連接。
Socket
說明:
網(wǎng)絡(luò)上的兩個(gè)程序通過一個(gè)雙向的通信連接實(shí)現(xiàn)數(shù)據(jù)的交換,這個(gè)連接的一端稱為一個(gè)Socket
。建立網(wǎng)絡(luò)通信連接至少要一對(duì)端口號(hào)(Socket
)。Socket
是應(yīng)用層與TCP/IP
協(xié)議族通信的中間軟件抽象層,它是用來組織數(shù)據(jù)的一組接口。
2、Docker中常用的基本概念
- 鏡像(
image
):Docker鏡像類似于虛擬機(jī)的鏡像,就好比是一個(gè)模板,一個(gè)面向Docker引擎的只讀模板,包含了文件系統(tǒng),可以通過這個(gè)模板來創(chuàng)建容器服務(wù)。
例如:一個(gè)鏡像可以完全包含了Ubuntu
操作系統(tǒng)環(huán)境,可以把它稱作一個(gè)Ubuntu
鏡像。鏡像也可以安裝了Apache
應(yīng)用程序(或其他軟件),可以把它稱為一個(gè)Apache
鏡像。通過這個(gè)鏡像可以創(chuàng)建多個(gè)容器(最終服務(wù)的運(yùn)行或者項(xiàng)目的運(yùn)行就是在容器中)。
鏡像是創(chuàng)建Docker容器的基礎(chǔ),通過版本管理和增量的文件系統(tǒng),Docker提供了一套十分簡(jiǎn)單的機(jī)制來創(chuàng)建和更新現(xiàn)有的鏡像。用戶可以從網(wǎng)上下載一個(gè)已經(jīng)做好的應(yīng)用鏡像,并通過命令直接使用??傊瑧?yīng)用運(yùn)行是需要環(huán)境的,而鏡像就是來提供這種環(huán)境。
(不同的類可以創(chuàng)建不同的對(duì)象,同一個(gè)類也可以創(chuàng)建多個(gè)相同類型的對(duì)象)
(不同的鏡像可以創(chuàng)建不同的容器,同一個(gè)鏡像也可以創(chuàng)建多個(gè)相同類型的容器)
- 容器(
Container
):Docker利用容器技術(shù),獨(dú)立運(yùn)行一個(gè)或者一組應(yīng)用,通過鏡像來創(chuàng)建的。
Docker容器類似于一個(gè)輕量級(jí)的沙箱子(因?yàn)镈ocker是基于Linux內(nèi)核的虛擬技術(shù),所以消耗資源十分少),Docker利用容器來運(yùn)行和隔離應(yīng)用。
容器是從鏡像創(chuàng)建運(yùn)行實(shí)例,可以將其啟動(dòng)、開始、停止、刪除,而這些容器都是相互隔離、互不可見的。
鏡像自身是只讀的,容器從鏡像啟動(dòng)的時(shí)候,Docker會(huì)在鏡像的最上層創(chuàng)建一個(gè)可寫層,鏡像本身將保持不變。
(目前就可以把這容器解為就是一個(gè)簡(jiǎn)易的Linuх系統(tǒng))
- 倉(cāng)庫(kù)(
Repository
):倉(cāng)庫(kù)就是存放鏡像的地方。
Docker倉(cāng)庫(kù)類似與代碼倉(cāng)庫(kù),就是Docker集中存放鏡像文件的場(chǎng)所。
根據(jù)存儲(chǔ)的鏡像公開與否,Docker倉(cāng)庫(kù)分為公開倉(cāng)庫(kù)(Public
)和私有倉(cāng)庫(kù)(Private
)兩種形式。
目前最大的公開倉(cāng)庫(kù)是Docker Hub
(Docker官方鏡像倉(cāng)庫(kù)),存放了數(shù)量龐大的鏡像供用戶下載。國(guó)內(nèi)的公開倉(cāng)庫(kù)包括阿里云,網(wǎng)易云等鏡像倉(cāng)庫(kù),可以提供穩(wěn)定的國(guó)內(nèi)訪問(鏡像加速)。
Docker也支持用戶在本地網(wǎng)絡(luò)內(nèi)創(chuàng)建一個(gè)只能自己訪問的私有倉(cāng)庫(kù)。
當(dāng)用戶創(chuàng)建了自己的鏡像之后,就可以使用push
命令,將它上傳到指定的公有或則私有倉(cāng)庫(kù)。這樣用戶下次在另一臺(tái)機(jī)器上使用該鏡像時(shí),只需將該鏡像從倉(cāng)庫(kù)pull
(拉?。┫聛砭涂梢粤?。
鏡像和容器的關(guān)系:
3、run命令的運(yùn)行流程
我們以之前運(yùn)行hello-world
鏡像為例進(jìn)行說明。
執(zhí)行docker run hello-world
命令,運(yùn)行結(jié)果如下:
$ sudo docker run hello-world # 出現(xiàn)下面顯示,證明運(yùn)行鏡像成功 Unable to find image 'hello-world:latest' locally #(本地沒有找到hello-world鏡像) latest: Pulling(拉?。?from library/hello-world #(去遠(yuǎn)程拉取library/hello-world鏡像) 1b930d010525: Pull complete #(拉取完成) Digest: sha256:d1668a9a1f5b42ed3f46b70b9cb7c88fd8bdc8a2d73509bb0041cf436018fbf5 Status: Downloaded newer image for hello-world:latest #(上面三行是拉取鏡像的簽名信息) # 總結(jié):由于本地沒有hello-world這個(gè)鏡像,所以會(huì)從遠(yuǎn)程倉(cāng)庫(kù)下載一個(gè)hello-world的鏡像到本地,并創(chuàng)建容器運(yùn)行。 Hello from Docker!#(鏡像運(yùn)行起來了) This message shows that your installation appears to be working correctly. #(此消息表明您的安裝似乎可以正常工作。為了生成此消息,Docker采取了以下步驟:) To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/get-started/
提示:輸出這段提示以后,hello-world
鏡像就會(huì)停止運(yùn)行,容器自動(dòng)終止。
run
命令的執(zhí)行的流程圖:
4、為什么Docker比VM快
- (1)Docker有著比虛擬機(jī)更少的抽象層。
由于Docker不需要Hypervisor實(shí)現(xiàn)硬件資源虛擬化(就相當(dāng)于使用VMware創(chuàng)建一個(gè)虛擬機(jī)的操作),運(yùn)行在Docker容器上的程序,直接使用的都是實(shí)際物理機(jī)的硬件資源。因此在CPU、內(nèi)存利用率上,Docker將會(huì)在效率上有明顯優(yōu)勢(shì)。
- (2)Docker利用的是宿主機(jī)的內(nèi)核,而不需要Guest OS。
因此當(dāng)新建一個(gè)容器時(shí),Docker不需要和虛擬機(jī)一樣重新加載一個(gè)操作系統(tǒng)內(nèi)核。從而避免引尋、加載操作系統(tǒng)內(nèi)核等,這些比較費(fèi)時(shí)費(fèi)資源的操作過程。
當(dāng)新建一個(gè)虛擬機(jī)時(shí),虛擬機(jī)軟件需要加載Guest OS,這個(gè)新建過程是分鐘級(jí)別的。而Docker由于直接利用宿主機(jī)的操作系統(tǒng),則省略了這個(gè)過程,因此新建一個(gè)Docker容器只需要幾秒鐘。
如下圖所示:
Docker與VM對(duì)比表:
到此這篇關(guān)于Docker中的基本概念和底層原理的文章就介紹到這了,更多相關(guān)docker概念底層原理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
idea連接docker實(shí)現(xiàn)一鍵部署的方法
這篇文章主要介紹了idea連接docker實(shí)現(xiàn)一鍵部署的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10一文教會(huì)你在Docker容器中實(shí)現(xiàn)Mysql主從復(fù)制
MySQL的主從復(fù)制之前也沒做過,剛百度了下發(fā)現(xiàn)并不算難,所以下面這篇文章主要給大家介紹了關(guān)于在Docker容器中實(shí)現(xiàn)Mysql主從復(fù)制的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11docker部署crownblog項(xiàng)目到阿里云的方法步驟
這篇文章主要介紹了docker部署crownblog項(xiàng)目到阿里云的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05Linux上使用docker啟動(dòng)redis并遠(yuǎn)程訪問的實(shí)現(xiàn)
這篇文章主要介紹了Linux上使用docker啟動(dòng)redis并遠(yuǎn)程訪問的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04Jenkins Docker靜態(tài)agent節(jié)點(diǎn)的構(gòu)建過程
這篇文章主要介紹了Jenkins Docker靜態(tài)agent節(jié)點(diǎn)的構(gòu)建,靜態(tài)節(jié)點(diǎn)就是通過java -jar這條命令去啟動(dòng)起來就可以了,本文通過圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-10-10