您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Docker基本概念和底層原理的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
Docker架構圖:
我們依照Docker架構圖進行Docker基礎概念的說明。
Docker是一個Client-Server
結構的系統,Docker守護進程運行在主機上,然后通過Socket
連接從客戶端訪問,守護進程從客戶端接受命令并管理運行在主機上的容器。容器是一個運行時環境,就好比是我們前面說到的集裝箱。
例如架構圖中的客戶端(Client
)和服務端(DOCKER_HOST
):
發送命令docker run hello-world
Docker客戶端轉發命令給宿主機上的Docker守護進程(Docker daemon
),
Docker守護進程接收執行命令,返回命令執行結果,
Docker服務端(守護進程)負責管理宿主機上的各個容器。
如下圖所示:
Docker客戶端和守護進程通過Socket
連接,可以遠程或本地連接。
Socket
說明:
網絡上的兩個程序通過一個雙向的通信連接實現數據的交換,這個連接的一端稱為一個Socket
。建立網絡通信連接至少要一對端口號(Socket
)。Socket
是應用層與TCP/IP
協議族通信的中間軟件抽象層,它是用來組織數據的一組接口。
鏡像(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
(拉取)下來就可以了。
鏡像和容器的關系:
我們以之前運行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
命令的執行的流程圖:
(1)Docker有著比虛擬機更少的抽象層。
由于Docker不需要Hypervisor實現硬件資源虛擬化(就相當于使用VMware創建一個虛擬機的操作),運行在Docker容器上的程序,直接使用的都是實際物理機的硬件資源。因此在CPU、內存利用率上,Docker將會在效率上有明顯優勢。
(2)Docker利用的是宿主機的內核,而不需要Guest OS。
因此當新建一個容器時,Docker不需要和虛擬機一樣重新加載一個操作系統內核。從而避免引尋、加載操作系統內核等,這些比較費時費資源的操作過程。
當新建一個虛擬機時,虛擬機軟件需要加載Guest OS,這個新建過程是分鐘級別的。而Docker由于直接利用宿主機的操作系統,則省略了這個過程,因此新建一個Docker容器只需要幾秒鐘。
如下圖所示:
Docker與VM對比表:
關于“Docker基本概念和底層原理的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。