docker 不包含依赖 打包_从零开始学K8s: 4.Docker是什么
“Docker”可以指代的對象可以有如下幾個:
- Docker 容器技術:可以創建和使用Linux容器
- Docker 社區:開源Docker社區致力于改進這些技術,使所有用戶受益(https://forums.docker.com/)
- Docker 公司:以Docker社區的工作為基礎,使其更加安全,并將這些進步回饋給更大的社區。為企業客戶提供經過增強的技術。
本文要介紹的是Docker容器技術。
Docker是一種容器技術,正是因為它,容器技術才變得廣為人知。Docker是第一個使容器能更加容易地在不同機器之間移植的容器系統。它簡化了應用程序及其相關依賴的打包流程,甚至整個操作系統的文件。Docker將它們都打包進一個簡單的、可移植的包,這樣,一個應用程序就可以以docker包(即鏡像)的形式分發到任何安裝了docker軟件的機器上,然后快速地啟動。
當我們使用docker運行被打包的應用程序時,它能看到其附帶的文件系統內容。不管我們是在開發環境還是生產環境運行這個應用程序,docker看到的文件都是一致的,即使生產服務器是一個完全不同體系的Linux操作系統。應用程序接觸不到所在服務器上的任何東西,因此即使生產服務器與開發服務器安裝的庫完全不一樣也無關緊要。
舉個例子,如果我們使用了整個紅帽子Linux系統(RHEL)的文件對應用程序打包,然后讓其運行在裝有Fedora或者Debian等其它Linux發行版系統的服務器,應用程序都會認為它運行在RHEL系統中。只是內核有可能不同。
與通過在VM中安裝一個操作系統得到一個鏡像,再將應用程序打包到鏡像里,最后再將整個鏡像分發到主機并運行起來類似,Docker也能夠達到同樣的效果,但不是使用VM來隔離應用程序,而是使用Linux容器技術來實現與VM幾乎同級別的隔離機制。容器不會使用大的單體VM鏡像,而是使用通常來說更小的容器鏡像。
使用Docker,我們可以將容器視為非常輕量級的、模塊化的虛擬機。這些容器還提供了靈活性——可以在不同環境中創建、部署、復制和移動它們,這有助于為云平臺優化應用程序。
基于Docker的容器鏡像與VM鏡像最大的一個不同之處在于容器鏡像是由多層組成的,這些層可以在多個鏡像之間共享和復用。這就意味著,如果一個鏡像和另外某個或某些鏡像具有相同的層,那么當下載這個鏡像的時候,這些相同的層就會被提前下載下來,后面的鏡像運行的時候就無需再重復下載這些公共層了,只需要下載其他層即可。
Docker相關概念
Docker 是一個打包、分發和運行應用程序的平臺。它是我們能夠將應用程序及其所依賴的整個環境合在一起打包。這個依賴的環境可以是一些應用程序需要的庫,甚至也可以是一個安裝好的操作系統通常情況下所有可用的文件。通過使用Docker,我們可用將這個包上傳到一個中央倉庫,然后這個包就可以被分發到任何安裝了Docker的機器上去執行。
這里就要提到三個概念:
- 鏡像(Images):Docker容器鏡像里包含了打包的應用程序和其所依賴的環境。這個鏡像包含了應用程序可用的文件系統和其他元素據,比如鏡像運行時需要執行的可執行文件的路徑。
- 鏡像倉庫(Registry):Docker鏡像倉庫存儲Docker鏡像,有利于在不同的人群和電腦之間共享鏡像。當構建好鏡像后,我們既可以在構建鏡像的電腦上運行它,也可以將其推送(push)到鏡像倉庫,然后在另外一臺電腦上拉取(pull)它并運行。這一點其實與通過git推送和拉取代碼類似。Git也有自己的倉庫,只是這個倉庫存儲的是代碼文件而已。鏡像倉庫也可以做權限控制,比如某些鏡像倉庫是公開的,任何人都可以從這個倉庫拉取鏡像;有些鏡像是私有的,只有某一部分人或機器可訪問。
- 容器(Container):Docker容器是一個常規的Linux容器,它基于Docker鏡像創建。一個運行中的容器就是一個運行在裝有Docker的主機上的進程,但這個進程是完全與主機以及運行在主機上的所有進程隔離的。這個進程也是資源受限的,意味著它只能訪問和使用分配給它的一定量的資源(CPU、內存等等)。
構建、分發和運行Docker鏡像
開發人員首先構建好鏡像,然后將其推送到倉庫。到這一步,鏡像就能被任何能訪問鏡像倉庫的人獲取到。可以拉取這個鏡像到任何其他運行了Docker的機器上,然后運行該鏡像。Docker基于鏡像創建一個隔離的容器,然后執行二進制可執行文件,該文件被指定為鏡像的一部分。從下圖可以看出鏡像、倉庫和容器三者之間的關系:
虛擬機 VS Docker容器
如下圖所示,相同的6個應用A、B、C、D、E、F分別運行在虛擬機上(3個VM)和容器中(6個Docker 容器):
我們注意到,不管是在一個VM中運行還是在兩個分離的容器中運行,A和B能夠訪問相同的二進制文件和庫。在VM中這是很顯然的,因為兩個應用程序看到都是同一個VM中的相同文件系統。但我們知道,每個容器有它主機的隔離的文件系統,那么應用程序A和B又是如何共享文件的呢?
什么是鏡像層
Dockers鏡像由多層構成。不同的鏡像可以包含完全相同的層,因為每個Docker鏡像都是在另一個鏡像的基礎上構建的,而且兩個不同的鏡像都可以使用相同的父鏡像作為基礎鏡像。這就提升了鏡像在網絡上的分發速度,因為當傳輸某個鏡像時,如果相同的層已被之前的鏡像傳輸, 那么這些層就不需要再被傳輸了。
鏡像層(Layer)不只使分發效率變得更高,而且也有助于減少鏡像的存儲空間。每一層僅被存儲一次。因此,由基于相同基礎層的兩個鏡像創建的兩個容器都可以讀取相同的文件,但是如果其中一個容器寫入某些文件,另一個是無法看見文件變更的。因此,即使它們共享文件,但仍然是彼此隔離的。這是因為容器鏡像層是只讀的。
當運行一個容器的時候,一個新的可寫層在鏡像的頂層上被創建。當容器中的進程寫入位于底層的一個文件時,此文件的一個拷貝在最頂層被創建,進程寫入的是此拷貝。
如果覺得本文對您有幫助,還請點贊+關注,您的支持是我持續創作的最大動力[可愛]
總結
以上是生活随笔為你收集整理的docker 不包含依赖 打包_从零开始学K8s: 4.Docker是什么的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: aspose.word在某个字后面自动换
- 下一篇: 炒饭什么意思 探索炒饭的起源和制作方法?