欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Docker容器鏡像加載及底層基本原理深入解析

 更新時間:2022年03月18日 09:51:29   作者:腳丫先生  
這篇文章主要為大家介紹了Docker容器鏡像加載及底層基本原理深入分析,讓大家能夠有更深入的理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步

前言

回想上學的時候,某老師神采奕奕的講解著操作系統(tǒng)某個知識點原理,可謂是激情澎湃,我環(huán)顧周圍基友們,臉上懵逼兩字清晰可見,毫不含糊,恍然大悟原來是在講天書。為了不讓大家臉上呈現(xiàn)懵逼二字,希望能以人能看懂的語言,讓大家理解。

一、Docker run

這一小節(jié),標題是Docker run ,我想受到過九年義務教育的大家,不難翻譯吧,如果這都翻譯不了,那么你一定要順著網線爬過來找我,我一定把你腦殼打得開竅。
上一章節(jié),最后我們用Docker啟動了一個ningx的容器:

#運行容器
docker run --name nginx-container -p 80:80 -d nginx

瀏覽器輸入虛擬機地址即可訪問 Nginx

在這里插入圖片描述

那么,docker run啟動命令是干了什么,才生成了一個nginx容器的呢?帶著疑問,我們接著說。

首先我們要很明白 運行容器的命令

在這里插入圖片描述

nginx-contarner:nginx容器的名稱(容器相當于java中類生成的對象)
nginx:鏡像(鏡像相當于java中類)

(下圖借鑒一位博主的,如有不合適,請我聯(lián)系我刪除)

在這里插入圖片描述

運行容器命令,做了什么呢?首先Docker會去本機尋找鏡像,如果沒有找到,它會去DockerHub上去下載,如果能夠找到并下載到本地就會使用這個鏡像去執(zhí)行,否則就會返回找不到該鏡像的錯誤。

就好比,你在家里上廁所,需要紙,你就會在廁所里尋找衛(wèi)生紙,如果找到了,就直接可以用了。但是,如果你沒有找到,那就得叫老爸在家里找衛(wèi)生紙,找到了你就可以安心笑了,沒有找到的話,老爸就會告訴你家里沒有衛(wèi)生紙紙。這里的衛(wèi)生紙就是所謂的鏡像.

二、Docker底層原理

1、Docker是怎么工作的

我們知道Docker是一個客戶端-服務端(C/S)架構。根據上節(jié)講述的C/S架構運行模式就不難去理解。

在這里插入圖片描述

Docker客戶端只需要向Docker守護進程發(fā)出請求,Docker守護進程在接收到Docker客戶端的請求后去執(zhí)行針對容器的相應操作,完成所有工作后返回結果。(詳細深入待后續(xù))
守護進程和普通進程區(qū)別是指 : 將后臺程序變成一種服務,比如說,用命令行輸入啟動程序,如果不是守護進程的話,一旦命令行窗口關閉,程序就終止了;而如果啟動守護進程,則退出命令行窗口之后,服務一直處于運行狀態(tài)。

2、為什么Docker比虛擬機快

Docker與虛擬機的對比,第一節(jié)文章就已經闡述過了。通過對比,我們就可以知道為什么Docker比虛擬機快。這里我在總結下:

1、容器由于沒有了虛擬操作系統(tǒng)和虛擬機監(jiān)視器這兩個層次,大幅減少了應用程序運行帶來的額外消耗。

2、Docker利用的是宿主機的內核,那么容器中的應用程序就是完全運行在了宿主操作系統(tǒng)中。因此在docker容器里運行應用程序,與在宿主機中運行應用程序效果是一樣的。

三、Docker鏡像

1、鏡像

鏡像是Docker容器的基石,容器是鏡像的運行實例,有了鏡像才能啟動容器。它包含運行某個軟件所需的所有內容,包括代碼、運行時、庫、環(huán)境變量和配置文件。(這里可以去上一篇文章中,有對Docker鏡像的形象比喻)

2、聯(lián)合文件系統(tǒng)UnionFS

要想理解Docker鏡像的加載原理,那么我們得要知道UnionFS(聯(lián)合文件系統(tǒng))

1、Union文件系統(tǒng)(UnionFS) 是一種分層、輕量級并且高性能的文件系統(tǒng),它支持對文件系統(tǒng)的修改作為一次提交來一層層的疊加,同時可以將不同目錄掛載到同一個虛擬文件系統(tǒng)下。Union文件系統(tǒng)是 Docker 鏡像的基礎。鏡像可以通過分層來進行繼承,基于基礎鏡像(沒有父鏡像),可以制作各種具體的應用鏡像。

看這文縐縐的Union文件系統(tǒng)的描述,難免呈現(xiàn)懵逼二字,過于抽象。看著都沒耐心繼續(xù)往下看…理解不了

UnionFS 最主要的功能簡單理解為把不同的目錄合并成一個目錄,原來目錄下的內容路徑都不會改變。比如,我現(xiàn)在有兩個目錄 A 和 B,它們分別有兩個文件:

$ tree
.
├── A
│  ├── a
│  └── x
└── B
  ├── b
  └── x

然后,使用聯(lián)合掛載的方式,將這兩個目錄掛載到一個公共的目錄 C 上:

$ mkdir C
$ mount -t aufs -o dirs=./A:./B none ./C

這時,再查看目錄 C 的內容,就能看到目錄 A 和 B 下的文件被合并到了一起:

$ tree ./C
./C
├── a
├── b
└── x

可以看到,在這個合并后的目錄 C 里,有 a、b、x 三個文件,并且 x 文件只有一份,同時合并后的目錄對于原來的目錄里文件的路徑是不會改變的。這,就是“合并”的含義。

但是,大家應該會有個疑問,就是x文件到底是原先哪個目錄下的。答案是誰先被掛載就顯示成誰的,也就是說如果目錄A先被掛載,那優(yōu)先顯示目錄A里的x文件。(具體詳細深入后面講解)

3、Docker鏡像的加載原理

Docker設計時,就充分利用Union FS的技術,將其設計為分層存儲的架構。 鏡像實際是由多層文件系統(tǒng)聯(lián)合組成,這種層級的文件系統(tǒng)UnionFS,在內部又分為2部分:

1) bootfs(boot file system):docker鏡像的最底層是bootfs,主要包含bootloader(加載器)和kernel(內核)。bootloader主要是引導加載kernel,linux剛啟動時會加載bootfs文件系統(tǒng)。當bootfs加載完成后,整個內核就在內存中了,此時內存的使用權已由bootfs轉交給了內核,此時系統(tǒng)也會卸載bootfs。
這里的加載,可以理解為,我們windows電腦開機時候,從黑屏到進入操作系統(tǒng)的過程。

2)rootfs(root file system):在bootfs之上,包含的就是典型linux系統(tǒng)中的/dev、/proc、/bin、/etc等標準目錄和文件。不同的 Linux 發(fā)行版, boots 基本是一致的, rootfs 會有差別。

在這里插入圖片描述

舉個例子:如下圖所示

在這里插入圖片描述

以圖為例,從左到右,分為3個過程:
1、docker鏡像的最底層是bootfs,然后是一個Base Image的基礎鏡像,這個基礎鏡像是Centos。

2、執(zhí)行安裝mysql操作,那么Docker會在Centos基礎鏡像之上又加了一層mysql鏡像。

3、執(zhí)行安裝tomcat,那么在之前的mysql鏡像上在繼續(xù)加一層tomcat鏡像。
就像疊積目一樣,一層一層往上。也說明了docker的鏡像實際上是由層一層的文件系統(tǒng)組成的。對于不同的的linux發(fā)行版本,bootfs基本是一致的,rootfs會有差別,所以不同的發(fā)行版可以共用bootfs。

另外,平時我們安裝進虛擬機的CentOS都是好幾個G,為什么Docker這里才200M?

在這里插入圖片描述

因為底層直接用主機的內核,自己只需要提供rootfs就行了,所以rootfs可以很小,只需要包含最基本的命令、工具和程序庫即可。這樣一來,啟動速度也快了,因為最浪費時間的引導加載過程沒了。

4、Docker鏡像分層理解

知道了鏡像的加載原理,我們在來看看Docker鏡像的分層理解。

首先可以去下載一個reids 鏡像,注意觀察下載的日志輸出,可以看到是一層層的在下載。

在這里插入圖片描述

當下載的層文件與我們之前層文件有沖突,也就是下載過的文件就會顯示Already exists不會再去下載,它只會去下載一些跟 redis 相關的新的東西。
那么:為什么Docker鏡像要采用這種分層的結構呢?

這種方式最大的好處就在于資源共享。比如有多個鏡像都從相同的BASE鏡像構建來的,那么宿主機只需要在磁盤上保留1分BASE鏡像,同時內存中也只需要加載一份BASE鏡像,這樣所有的容器都可以使用。另外,鏡像的每一層都是可以共享的。

如何查看鏡像分層?

可以通過docker image inspect來查看鏡像的分層,比如查看剛才下載的redis鏡像:

docker image inspect redis:latest

在這里插入圖片描述

所有的docker鏡像都起始于一個基礎鏡像層,當進行修改或者增加新的內容時,就會在當前鏡像層之上,創(chuàng)建新的鏡像層。

就好比:修房子,首先有了地基,然后蓋了第一層后并裝修,開始蓋第二層,你發(fā)現(xiàn)想要的東西,第一層已經有了,那么就不會重復去修建了,只會修不一樣,新的裝飾。

四、Docker容器

鏡像(Image)和容器(Container)的關系,就像是面向對象程序設計中的類和實例一樣,鏡像是靜態(tài)的定義,容器是鏡像運行時的實體。容器可以被創(chuàng)建、啟動、停止、刪除、暫停等 。

Docker面向對象
容器對象
鏡像

容器的實質是進程,但與直接在宿主執(zhí)行的進程是不同,容器進程運行于屬于自己的獨立的命名空間。因此容器可以擁有自己的 root 文件系統(tǒng)、自己的網絡配置、自己的進程空間,甚至自己的用戶 ID 空間。

五、Docker鏡像與容器的形象比喻

請看上一章節(jié):大白話帶你快速安裝Docker,不懂你捶我

以上就是Docker容器鏡像加載及底層基本原理深入解析的詳細內容,更多關于Docker容器鏡像加載底層原理的資料請關注腳本之家其它相關文章!

相關文章

  • Docker安裝部署Mysql8的過程(以作數(shù)據持久化)

    Docker安裝部署Mysql8的過程(以作數(shù)據持久化)

    這篇文章主要介紹了Docker安裝部署Mysql8(以作數(shù)據持久化),首先創(chuàng)建容器并進行持久化處理,接著配置遠程連接并嘗試,本文結合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • Docker 實現(xiàn)瀏覽器里開發(fā)Android應用的功能

    Docker 實現(xiàn)瀏覽器里開發(fā)Android應用的功能

    這篇文章主要介紹了Docker 實現(xiàn)瀏覽器里開發(fā)Android應用的功能的相關資料,這里對布置環(huán)境做了詳細的步驟,也許你能用到這樣的功能,需要的朋友可以參考下
    2016-11-11
  • 基于Docker搭建Redis主從集群的實現(xiàn)

    基于Docker搭建Redis主從集群的實現(xiàn)

    本文基于Docker+Redis5.0.5版本,通過cluster方式創(chuàng)建一個6個redis實例的主從集群,需要的朋友們下面隨著小編來一起學習學習吧
    2021-05-05
  • 在Docker容器中部署Django的時區(qū)問題

    在Docker容器中部署Django的時區(qū)問題

    本文主要介紹了在Docker容器中部署Django的時區(qū)問題,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • 使用docker-compose搭建mysql主從詳細過程

    使用docker-compose搭建mysql主從詳細過程

    這篇文章主要給大家介紹了關于使用docker-compose搭建mysql主從的相關資料,Docker-Compose項目是Docker官方的開源項目,負責實現(xiàn)對Docker容器集群的快速編排,需要的朋友可以參考下
    2024-01-01
  • CentOS7上安裝Docker的詳細步驟

    CentOS7上安裝Docker的詳細步驟

    Docker?是一個開源工具,它可以讓創(chuàng)建和管理?Linux?容器變得簡單,容器就像是輕量級的虛擬機,并且可以以毫秒級的速度來啟動或停止,下面這篇文章主要給大家介紹了關于CentOS7上安裝Docker的詳細步驟,需要的朋友可以參考下
    2022-01-01
  • Docker網絡配置(橋接網絡和自定義網絡)自定義網絡設置ip方式

    Docker網絡配置(橋接網絡和自定義網絡)自定義網絡設置ip方式

    這篇文章主要介紹了Docker網絡配置(橋接網絡和自定義網絡)自定義網絡設置ip方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 基于Docker的Mysql主備搭建的實現(xiàn)步驟

    基于Docker的Mysql主備搭建的實現(xiàn)步驟

    本文主要介紹了基于Docker的Mysql主備搭建的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • docker和docker-compose一鍵安裝教程(支持在線和離線)

    docker和docker-compose一鍵安裝教程(支持在線和離線)

    這篇文章主要介紹了docker和docker-compose一鍵安裝(支持在線和離線),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • 解決vscode docker插件docker.socket權限問題

    解決vscode docker插件docker.socket權限問題

    本文給大家分享關于vscode docker插件docker.socket權限問題,文末給大家提到vscode中docker插件無法連接的問題及解決方案,需要的朋友參考下吧
    2021-06-06

最新評論