docker tag 删除images_深入浅出 Docker (二) —— Docker的基本概念和架构原理
1. Docker 的基本概念
Docker 有三個基本概念:
- 鏡像(Image)
- 容器(Container)
- 倉庫(Repository)
1.1 鏡像(Image)
操作系統分為內核和用戶空間。對于 Linux 而言,kernel 啟動之后, 就會去掛載 root 文件系統為其提供用戶空間支持。
而我們的 Docker Immage 就是相當于一個 root 文件系統。 Docker Immage 是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源以及配置等等文件之后,還包含了一些運行時需要的諸如匿名卷、環境變量、用戶等等配置參數。
鏡像構建時,會一層層構建,前一層是后一層的基礎。每一層構建完就不會再發生改變,后一層上的任何改變只發生在自己這一層。比如,刪除前一層文件的操作,實際不是真的刪除前一層的文件,而是僅在當前層標記為該文件已刪除。在最終容器運行的時候,雖然不會看到這個文件,但是實際上該文件會一直跟隨鏡像。因此,在構建鏡像的時候,需要額外小心,每一層盡量只包含該層需要添加的東西,任何額外的東西應該在該層構建結束前清理掉。
Docker Immage 本身不包含任何動態數據,其內容在構建之后也不會被改變。 其次后面我會講到 Docker 鏡像構建, 鏡像構建時,會一層層構建,前一層是后一層的基礎。每一倉在構建完成之后就不會在改變。A 層的任何改變只會發生在 A 層自己這一層。
怎么理解呢?比如刪除前一層文件的操作,實際上并不是真正的去刪除前一層的文件,而是在當前層中標記為該文件已刪除。最終容器運行的時候,雖然不會看到這個文件,但是實際上這個文件一直存在鏡像當中。
因此,在構建鏡像的時候,需要格外小心,分層要明確,并且每層盡量只包含這一層真正要添加的,其他的應該在構建結束之前全部清理掉。
這里你只要記住, Docker Image 是由多個只讀層組成的,Unioning Read-only File System.
1.2 容器(Container)
容器的定義和鏡像幾乎可以理解為一模一樣。 鏡像和容器的關系,我們可以理解為面向對程序設計中的類和實例。
容器是鏡像運行時的實體,就相當于類的實例化。
容器的實質是進程,這個進程運行在一個隔離的環境中,也就是運行在自己獨立的命名空間,這一點與直接在宿主執行的進程不同。
所以,容器可以擁有自己的 root 系統、自己的網絡配置、 自己的進程空間、自己的用戶 ID 空間。容器可以被創建、啟動、停止、暫停、刪除等操作。
鏡像使用的是分層存儲,容器也是, 每個容器運行時,都是以鏡像為基礎層(鏡像本身保持不變),在其上面再創建一個當前容器的存儲層,這個存儲層我們可以稱之為容器存儲層,用來為容器運行時讀寫準備的。
所以講的再簡單點,可以這么理解,容器等于鏡像加讀寫層。
1.3 倉庫(Repository)
如果你用過 Git,那么理解這個就很簡單了。
鏡像構建完成后,可以很容易的在當前宿主機上運行,集中存放在Docker Repository。
但是,如果需要在其它主機上使用這個鏡像,我們就需要一個集中的存儲、分發鏡像的服務,Docker Registry(倉庫服務器) 就是這樣的服務。
Docker Registry 可以有多個 Repository (倉庫),每個倉庫又可以包含多個 tag(tag),每個 tag 可以對應一個鏡像。這樣的好處就是,如果倉庫包含了同一個應用程序的不同版本的鏡像,而 tag 的作用就可以用在此處充分利用。
所以說 Docker Repository 的概念有點類似 Git Repository , Docker Registry 有點類似 GitHub 這類的角色。
Docker Registry 分為兩種形式:
- Public(公有)
- Private(私有)
1.3.1 Docker Registry 公開服務
Docker Registry 公開服務是開放給用戶使用、允許用戶管理鏡像的 Registry 服務。一般這類公開服務允許用戶免費上傳、下載公開的鏡像,并可能提供收費服務供用戶管理私有鏡像。
最常使用的 Registry 公開服務是官方的 Docker Hub,這也是默認的 Registry,并擁有大量的高質量的官方鏡像。除此以外,還有 Red Hat 的 Quay.io、Google 的 Google Container Registry。Kubernetes 的鏡像使用的就是這個服務。
當用戶創建了自己的鏡像之后就可以使用 Push 命令將它上傳到公有或者私有倉庫,這樣下次在另外一臺機器上使用這個鏡像時候,只需要從倉庫上 Pull 下來就可以了。
但是由于某些原因,在國內訪問這些服務可能會比較慢。國內的一些云服務商提供了針對 Docker Hub 的鏡像服務(Registry Mirror),會直接從國內的地址下載,這些鏡像服務被稱為加速器。后續在安裝 Docker 的時候我會詳細說明。
當然了,你也可以使用國內云服務商提供的類似 Docker Hub 的公開服務。比如 網易云鏡像服務、DaoCloud 鏡像市場、阿里云鏡像庫 等。
1.3.2 Docker Registry 私有服務
除了使用 Docker Registry 公開服務外,用戶還可以在本地搭建私有 Docker Registry。Docker 官方提供了 Docker Registry 鏡像,可以直接使用做為 Registry 私有服務。在后續章節中我也會詳細展開講解。
但是需要說明的是, 開源的 Docker Registry 鏡像只提供了 Docker Registry API 的服務端實現,足以支持 docker 命令,不影響使用。但不包含圖形界面,以及鏡像維護、用戶管理、訪問控制等高級功能。在官方的商業化版本 Docker Trusted Registry 中,提供了這些高級功能。
或者使用第三方軟件。比如,Harbor 和 Sonatype Nexus。
2. Docker 的架構原理
2.1 Docker Engine
Docker Engine 是一個 C/S (客戶端-服務器) 的應用,主要有這幾個部分。
- 守護進程(dockerd 命令)。
- Dockerd 交互的 REST API Server
- 命令行 CLI 接口( docker 命令),通過和 REST API 進行交互
CLI 使用 Docker REST API 通過腳本或直接 CLI 命令來控制或與 Docker 守護進程交互。許多其他的 Docker 應用都使用底層 API 和 CLI。
守護進程創建和管理Docker對象,如 images, containers, networks, 以及 volumes。
注:Docker 采用開源的Apache 2.0 許可證。
2.2 Docker architecture
Docker 使用客戶端-服務器架構。Docker 客戶端與Docker 守護進程對話,后者負責構建、運行和分發 Docker容器的重任。Docker 客戶端和守護進程可以運行在同一個系統上,或者你可以將 Docker 客戶端連接到遠程 Docker 守護進程。Docker 客戶端和守護進程使用 REST API,通過 UNIX 套接字或網絡接口進行通信。
2.2.1 Docker daemon
Docker 守護進程(dockerd)監聽 Docker API 請求,并管理 Docker 對象,如鏡像、容器、網絡和卷。守護進程還可以與其他守護進程通信,管理 Docker服務。
2.2.2 Docker client
Docker 客戶端(docker)是許多 Docker 用戶與 Docker 交互的主要方式。當你使用docker run 等命令時,客戶端將這些命令發送給 dockerd ,由 dockerd 執行。docker 命令使用的是 Docker API 。Docker 客戶端可以與多個守護進程通信。
2.2.3 Docker registries
Docker 注冊表可以存儲 Docker 鏡像。Docker Hub 是一個公共注冊表,任何人都可以使用,Docker 默認配置為在 Docker Hub 上尋找鏡像。你甚至可以運行自己的私有注冊表。
當你使用 docker pull 或 docker run 命令時,所需的鏡像就會從你配置的 Docker registry 中拉出來。當你使用docker push 命令時,你的鏡像會被推送到你配置的Docker registry中。
2.2.4 Docker objects
當您使用 Docker 時,您正在創建和使用圖像、容器、網絡、卷、插件和其他對象。這里是對其中一些對象的簡要概述。
- Image (鏡像)
- Image是一個只讀的模板,包含創建 Docker容器的說明。通常情況下,一個映像是基于另一個映像,并進行了一些額外的定制。例如,你可以建立一個基于 Ubuntu鏡像的鏡像,但安裝了 Apache 網絡服務器和你的應用程序,以及使你的應用程序運行所需的配置細節。
- 你可以創建自己的鏡像,也可以只使用別人創建并發布在注冊表中的鏡像。要創建自己的映像,你需要創建一個 Dockerfile,其中有一個簡單的語法,用于定義創建映像和運行映像所需的步驟。Dockerfile 中的每條指令都會在鏡像中創建一個層。當你改變 Dockerfile 并重建鏡像時,只有那些發生變化的層才會被重建。與其他虛擬化技術相比,這也是鏡像如此輕量級、小而快的部分原因。
- CONTAINERS(容器)
- CONTAINERS是一個映像的可運行實例。您可以使用 Docker API 或 CLI 創建、啟動、停止、移動或刪除容器。您可以將容器連接到一個或多個網絡,將存儲連接到它,甚至根據它的當前狀態創建一個新的鏡像。
- Cli
- 交互式地連接到你的本地命令行會話
- Service 服務
- 服務允許你擴展在多個碼頭工人守護進程的容器,這是所有工作一起作為一個群有多個管理人員和工人。群的每個成員都是 Docker 守護程序,所有守護程序都使用 Docker API 進行通信。服務允許您定義所需的狀態,例如在任何給定時間必須可用的服務副本數。默認情況下,該服務在所有工作節點之間是負載平衡的。對于消費者而言,Docker 服務似乎是一個單獨的應用程序。Docker Engine 在 Docker 1.12 及更高版本中支持集群模式。
- END -
總結
以上是生活随笔為你收集整理的docker tag 删除images_深入浅出 Docker (二) —— Docker的基本概念和架构原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python函数修饰器_Python函数
- 下一篇: python数据储存_五种使用pytho