『現學現忘』Docker基礎 — 16、Docker中的基本概念和底層原理

繁華似錦Fighting發表於2022-03-11

Docker架構圖:

我們依照Docker架構圖進行Docker基礎概念的說明。

image

1、Docker的底層原理

Docker是一個Client-Server結構的系統,Docker守護程式執行在主機上,然後通過Socket連線從客戶端訪問,守護程式從客戶端接受命令並管理執行在主機上的容器。容器是一個執行時環境,就好比是我們前面說到的集裝箱。

例如架構圖中的客戶端(Client)和服務端(DOCKER_HOST):

傳送命令docker run hello-world

  • Docker客戶端轉發命令給宿主機上的Docker守護程式(Docker daemon),
  • Docker守護程式接收執行命令,返回命令執行結果,
  • Docker服務端(守護程式)負責管理宿主機上的各個容器。

如下圖所示:

image

Docker客戶端和守護程式通過Socket連線,可以遠端或本地連線

Socket說明:

網路上的兩個程式通過一個雙向的通訊連線實現資料的交換,這個連線的一端稱為一個Socket。建立網路通訊連線至少要一對埠號(Socket)。Socket是應用層與TCP/IP協議族通訊的中間軟體抽象層,它是用來組織資料的一組介面。

2、Docker中常用的基本概念

  • 映象(image:Docker映象類似於虛擬機器的映象,就好比是一個模板,一個面向Docker引擎的只讀模板,包含了檔案系統,可以通過這個模板來建立容器服務。
    例如:一個映象可以完全包含了Ubuntu作業系統環境,可以把它稱作一個Ubuntu映象。映象也可以安裝了Apache應用程式(或其他軟體),可以把它稱為一個Apache映象。通過這個映象可以建立多個容器(最終服務的執行或者專案的執行就是在容器中)。
    映象是建立Docker容器的基礎,通過版本管理和增量的檔案系統,Docker提供了一套十分簡單的機制來建立和更新現有的映象。使用者可以從網上下載一個已經做好的應用映象,並通過命令直接使用。總之,應用執行是需要環境的,而映象就是來提供這種環境。
    (不同的類可以建立不同的物件,同一個類也可以建立多個相同型別的物件)
    (不同的映象可以建立不同的容器,同一個映象也可以建立多個相同型別的容器)
  • 容器(Container:Docker利用容器技術,獨立執行一個或者一組應用,通過映象來建立的。
    Docker容器類似於一個輕量級的沙箱子(因為Docker是基於Linux核心的虛擬技術,所以消耗資源十分少),Docker利用容器來執行和隔離應用。
    容器是從映象建立執行例項,可以將其啟動、開始、停止、刪除,而這些容器都是相互隔離、互不可見的。
    映象自身是隻讀的,容器從映象啟動的時候,Docker會在映象的最上層建立一個可寫層,映象本身將保持不變。
    (目前就可以把這容器解為就是一個簡易的Linuх系統)
  • 倉庫(Repository:倉庫就是存放映象的地方。
    Docker倉庫類似與程式碼倉庫,就是Docker集中存放映象檔案的場所。
    根據儲存的映象公開與否,Docker倉庫分為公開倉庫(Public)和私有倉庫(Private)兩種形式。
    目前最大的公開倉庫是Docker Hub(Docker官方映象倉庫),存放了數量龐大的映象供使用者下載。國內的公開倉庫包括阿里雲,網易雲等映象倉庫,可以提供穩定的國內訪問(映象加速)。
    Docker也支援使用者在本地網路內建立一個只能自己訪問的私有倉庫。
    當使用者建立了自己的映象之後,就可以使用push命令,將它上傳到指定的公有或則私有倉庫。這樣使用者下次在另一臺機器上使用該映象時,只需將該映象從倉庫pull(拉取)下來就可以了。

映象和容器的關係:

image

3、run命令的執行流程

我們以之前執行hello-world映象為例進行說明。

執行docker run hello-world命令,執行結果如下:

$ sudo docker run hello-world

# 出現下面顯示,證明執行映象成功

Unable to find image 'hello-world:latest' locally #(本地沒有找到hello-world映象)
latest: Pulling(拉取) from library/hello-world #(去遠端拉取library/hello-world映象)
1b930d010525: Pull complete #(拉取完成) 
Digest: sha256:d1668a9a1f5b42ed3f46b70b9cb7c88fd8bdc8a2d73509bb0041cf436018fbf5
Status: Downloaded newer image for hello-world:latest
#(上面三行是拉取映象的簽名資訊)
# 總結:由於本地沒有hello-world這個映象,所以會從遠端倉庫下載一個hello-world的映象到本地,並建立容器執行。

Hello from Docker!#(映象執行起來了)
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映象就會停止執行,容器自動終止。

run命令的執行的流程圖

image

4、為什麼Docker比VM快

  • (1)Docker有著比虛擬機器更少的抽象層。
    由於Docker不需要Hypervisor實現硬體資源虛擬化(就相當於使用VMware建立一個虛擬機器的操作),執行在Docker容器上的程式,直接使用的都是實際物理機的硬體資源。因此在CPU、記憶體利用率上,Docker將會在效率上有明顯優勢。
  • (2)Docker利用的是宿主機的核心,而不需要Guest OS
    因此當新建一個容器時,Docker不需要和虛擬機器一樣重新載入一個作業系統核心。從而避免引尋、載入作業系統核心等,這些比較費時費資源的操作過程。
    當新建一個虛擬機器時,虛擬機器軟體需要載入Guest OS,這個新建過程是分鐘級別的。而Docker由於直接利用宿主機的作業系統,則省略了這個過程,因此新建一個Docker容器只需要幾秒鐘。

如下圖所示:

image

Docker與VM對比表:

image

相關文章