Docker核心概念 映象 容器 倉庫

2022-07-10 19:45:14 字數 2985 閱讀 9080

映象是什麼呢?通俗地講,它是乙個唯讀的檔案和資料夾組合。它包含了容器執行時所需要的所有基礎檔案和配置資訊,是容器啟動的基礎。所以你想啟動乙個容器,那首先必須要有乙個映象。映象是 docker 容器啟動的先決條件。

簡單來講,映象是乙個特殊的檔案系統,它提供了容器執行時所需的程式、軟體庫、資源、配置等靜態資料。即映象不包含任何動態資料,映象內容在構建後不會被改變。

如果你想要使用乙個映象,你可以用這兩種方式:

自己建立映象。通常情況下,乙個映象是基於乙個基礎映象構建的,你可以在基礎映象上新增一些使用者自定義的內容。例如你可以基於centos映象製作你自己的業務映象,首先安裝nginx服務,然後部署你的應用程式,最後做一些自定義配置,這樣乙個業務映象就做好了。

映象是由一系列的映象層(layer )組成,每一層代表了映象構建過程中的一次提交,當我們需要修改映象內的某個檔案時,只需要在當前映象層的基礎上新建乙個映象層,並且只存放修改過的檔案內容。分層結構使得映象間共享映象層變得非常簡單和方便。

更具體的講解見:docker映象實現原理

映象和容器的關係,就像是物件導向程式設計中的例項一樣,映象是靜態的定義,容器是映象執行時的實體。容器可以被建立、啟動、停止、刪除、暫停等。

容器的本質是乙個程序,但與直接在宿主執行的程序不同,容器程序有自己獨立的命名空間隔離和資源限制。因此容器可以擁有自己的root檔案系統、自己的網路配置、自己的程序空間,甚至自己的使用者 id 空間。在容器內部,無法看到主機上的程序、環境變數、網路等資訊,這是容器與直接執行在主機上程序的本質區別。

容器內的程序是執行在乙個隔離的環境裡,使用起來,就好像是在乙個獨立於宿主的系統下操作一樣。

通俗地講,容器是映象的執行實體。

容器是基於映象建立的可執行例項,並且單獨存在,乙個映象可以建立出多個容器。執行容器化環境時,實際上是在容器內部建立該檔案系統的讀寫副本。 這將新增乙個容器層,該層允許修改映象的整個副本。

容器檔案系統的本質是在映象層上面建立的讀寫層,執行中的容器對任何檔案的修改都存在於該讀寫層,當容器被刪除時,容器中的讀寫層也會隨之消失。

容器的檔案系統設計成寫時複製,而不是每乙個容器都單獨拷貝乙份映象檔案,寫時複製是指在容器中,只有需要修改某個檔案時,才會把檔案從映象層複製到容器層,寫時複製的操作將會複製整個檔案,如果檔案過大,將會大大降低檔案系統的效能,因此當我們有大量檔案需要被修改時,可能會出現明顯的延遲。好在,寫時複製操作只在第一次修改檔案時觸發,對日常使用沒有太大影響。當檔案或目錄被刪除時,並不會真正從映象中刪除它,因為映象層是唯讀的,會建立乙個特殊的檔案或資料夾,這種特殊的檔案或資料夾會阻止容器的訪問。

這裡不理解的話可以檢視docker聯合檔案系統的內容:docker底層:聯合檔案系統 。

如圖 1 所示。

每個容器單獨拷貝乙份映象檔案會占用較多的磁碟空間。假設我有3個程式都用到了jdk映象,那該jdk映象就得複製3份。如果改成寫時複製的話,只需要乙份jdk映象,新的內容寫在頂層即可。比如用docker images檢視映象的時候,把所有映象的size加起來可能有十幾個g,但是到目錄下檢視,實際上只有幾個g,這是因為很多映象復用了同乙個底層的映象,起到了節省磁碟空間的作用。

一方面保護映象檔案,另一方面可以共享相同的映象層。

容器的生命週期是容器可能處於的狀態,容器的生命週期分為 5 種。

created:初建狀態

running:執行狀態

stopped:停止狀態

paused:暫停狀態

deleted:刪除狀態

各生命週期之前的轉換關係如圖所示:

倉庫(repository)是儲存和分發 docker 映象的地方。通常,乙個倉庫會包含同乙個軟體不同版本的映象,而標籤就常用於對應該軟體的各個版本。我們可以通過 《倉庫名》:《標籤》 的格式來指定具體是這個軟體哪個版本的映象。如果不給出標籤,將以 latest 作為預設標籤。以 ubuntu 映象 為例,ubuntu 是倉庫的名字,其內包含有不同的版本標籤,如,16.04, 18.04。我們可以通過 ubuntu:16.04,或者 ubuntu:18.04 來具體指定所需哪個版本的映象。如果忽略了標籤,比如 ubuntu,那將視為 ubuntu:latest。倉庫名經常以 兩段式路徑 形式出現,比如 jwilder/nginx-proxy,前者往往意味著 docker registry 多使用者環境下的使用者名稱,後者則往往是對應的軟體名。但這並非絕對,取決於所使用的具體 docker registry 的軟體或服務。

映象倉庫分為公共映象倉庫和私有映象倉庫。

除了公開映象倉庫,你也可以構建自己的私有映象倉庫,搭建教程:搭建私有映象倉庫教程

註冊伺服器是存放倉庫的實際伺服器,而倉庫則可以被理解為乙個具體的專案或者目錄;註冊伺服器可以包含很多個倉庫,每個倉庫又可以包含多個映象。例如我的映象位址為 docker.io/centos,docker.io 是註冊伺服器,centos 是倉庫名。 它們之間的關係如圖 1 所示。最常使用的 registry 公開服務是官方的 docker hub,這也是預設的 registry,並擁有大量的高質量的官方映象。註冊伺服器的位址(映象源)可以在 /etc/docker/daemon.json 檔案中檢視與修改。

從圖中可以看到,映象是容器的基石,容器是由映象建立的。乙個映象可以建立多個容器,容器是映象執行的實體。倉庫就非常好理解了,就是用來存放和分發映象的。

參考文章:k8s|docker的基本概念(映象,容器,倉庫)

Docker 映象,容器,倉庫概念(筆記)

記錄一下什麼是docker,以及映象,容器,倉庫概念的學習筆記 官網的一張圖 docker 是乙個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到乙個可移植的容器中,然後發布到任何流行的 linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面 docker 使...

docker 映象 容器

windows下使用 everything 軟體 查詢 daemon.json 修改為如下 docker imagesdocker search 映象名稱docker search centosdocker pull tutum centosdocker rmi 映象iddocker rmi doc...

docker映象與docker容器

映象與容器的關係 映象 例如系統安裝映象 已經裝好環境的虛擬機器 執行一次 就是乙個容器 新的作業系統 當作是容器的 源 如同物件導向中的類 容器 裝好的系統 乙個乙個的作業系統,或者是已經裝好東西的系統 如同物件導向的物件 docker search 包名 搜尋包 一般都是去hub.docker....