架構雜談《八》

Docker 架構

一、Docker 引擎的三大組件

1)Docker 後臺服務(Docker Daemon):是長時間運行在後臺的守護進程,是Docker的核心服務,可以通過命令dockerd與它進行交互通信。

2)REST 接口(REST API):程序可以通過REST的接口來訪問後臺服務或向它發送操作指令。

3)交互式命令行界面(Docker CLI):我們大多數時間都在使用命令行界面與Docker進行交互(以docker為開頭的所有命令的操作)而命令行界面又是通過調用REST的接口來控制和操作Docker後臺服務的。

架構雜談《八》

Docker 是C/S結構的架構,客戶端通過與後臺服務交互來編譯、運行和發佈容器。Docker的客戶端可以連接到本機的Docker服務上也可以連接到遠程的Docker服務上。Docker客戶端是使用REST接口來和後臺服務通信的,它通過使用UNIX Socket連接或者網絡接口實現。

架構雜談《八》

(1)Docker 後臺服務監聽REST接口的請求,管理Docker的對象(如:Docker的鏡像、容器、網絡和磁盤卷)。一個Docker後臺服務可以和其他Docker後臺服務進行通信。從而對它們進行管理。

(2)Docker客戶端(Docker Client)是我們和Docker後臺服務交互的主要工具,在使用docker run 命令時,客戶端把命令發送到Docker後臺服務,再由後臺服務執行該命令。Docker客戶端可以連接多個後臺服務並與它們通信。

(3)Docker倉庫(Docker Registry)是用來存儲Docker鏡像的,Docker Hub和Docker Cloud是所有人都能夠使用的公共的Docker倉庫。Docker默認從Docker Hub下載鏡像,當然我們也可以自己搭建私有倉庫。當我們使用 docker pull 或 docker run 命令時,就會從我們配置的 Docker 倉庫下載鏡像,當使用 docker push 命令時,我們的鏡像會被推送到Docker倉庫中。

(4)Docker對象(Docker Object)包括鏡像、容器、網絡、磁盤卷和插件等。我們在使用Docker時,就會創建和使用Docker對象。

a)鏡像(image)是隻讀的指令模板,用於創建Docker容器(container)通常一個鏡像會繼承另一個鏡像,然後擴展自定義的指令,如,我們可以創建一個繼承自Ubuntu的鏡像,再安裝一個 Apache Tomcat服務和自己的應用程序,同時修改些配置使我們的程序能夠運行起來。為了創建自己的鏡像,我們可以創建一個Dockerfile文件,通過一些簡單的指令來定義如何創建和運行鏡像,Dockerfile中的每個指令在鏡像中都會創建為一個層(layer),當我們修改Dockerfile文件然後重新編譯它時,僅有那些被修改的層(layer)才會被重新編譯,這就是Docker鏡像是輕量級的、體積非常小、速度非常塊的原因。

b)容器(container)是鏡像運行的一個實例,我們可以使用Docker的API或CLI來創建、運行、停止、移動或者刪除容器。我們可以為容器綁定一個或多個網絡(network)或掛載一個磁盤卷(volume),也可以通過繼承它來創建一個新的鏡像。通常一個容器與另一個容器或它的宿主機都是相對獨立和隔離的。在容器停止運行後,它其中的所有改變的狀態如果沒有保存則都會消失。

c)Docker服務(server)允許我們在多個Docker後臺服務中伸縮擴展容器,這些容器組成一個擁有多主多從模式的集群。集群中的每個成員都是一個Docker後臺服務,它們之間通過Docker接口通信。我們可以通過Docker服務來定義集群的參數,如:集群中容器的副本個數。在默認情況下,集群的負載是面向所有容器節點的。而對於使用者來說,Docker集群就像一個大實例。

(5)命名空間(Namespace),Docker使用命名空間為容器提供了很好的隔離性,當我們運行容器時,Docker會為容器創建一組命名空間,每個容器都是一個獨立的命名空間,容器僅僅限制於在自己的命名空間中訪問權限。Docker使用了Linux的如下命名空間:

a)pid 命名空間(pid namespace):用來隔離進程的ID空間,使得不同的pid命名空間裡的進程ID可以重複且相互之間不受影響。

b)net 命名空間(net namespace):用於管理網絡協議棧的多個實例。

c)ipc 命名空間(ipc namespace):用於管理和訪問IPC資源。

d)mnt 命名空間(mnt namespace):用於管理 文件系統的掛載點。

e)uts 命名空間(uts namespace):用於隔離內核和版本信息。

(6)cgroups(control groups),Docker 採用了一種被稱為 cgroups 的技術,實現了不同應用之間的隔離性。讓每個應用只能訪問屬於自己的資源。cgroups 可以確保將可用的硬件資源共享給所有容器,並且可以對容器限制硬件資源,如:可以限制每個容器訪問的內存大小。

(7)UnionFS(Union File Systems),是Docker在創建層時採用的文件系統。這種文件系統使Docker變得很輕量級並且執行速度非常快。Docker可以使用多種類型的UnionFS,如:AUFS、vfs、btrfs和DeviceMapper。

(8)容器格式(container format),Docker 將namespace、contor groups 和 UnionFS 封裝成 container format,我們將其稱為容器,默認的容器類型是libcontainer。

二、Docker的安裝

(1):Ubuntu Docker 安裝:https://www.runoob.com/docker/ubuntu-docker-install.html

(2):Centos Docker 安裝:https://www.runoob.com/docker/centos-docker-install.html

(3):Windows Docker 安裝:https://www.runoob.com/docker/windows-docker-install.html

(4):MacOS Docker 安裝:https://www.runoob.com/docker/macos-docker-install.html

三、Docker 的簡單使用

https://www.runoob.com/docker/docker-hello-world.html

四、容器化項目

Docker 為應用程序的打包和運行提供了一種便捷的方式,使用Docker容器進行構建、運行、停止、啟動、修改、更新等操作都非常簡單,容器化技術也可以讓應用程序像雲環境的部署變得更為高效,再加上容器本身已經包含應用程序運行所需的大部分依賴,所以運行容器的操作系統也能很好的瘦身,從而運行更快,佔用資源更少。

1)傳統的應用部署

傳統的應用程序部署為直接將應用程序安裝到宿主計算機的文件系統上,然後編寫命令腳本來運行它。從應用程序的視角來看,其環境包括宿主機上的操作系統、運行環境、文件系統、網絡配置、端口及各種依賴等。

要讓應用程序運行起來,通常需要安裝與應用程序搭配的額外軟件包,一般來說,這不是問題。但在某些情況下,可能想在同一個系統上運行相同軟件包的不同版本,這可能會引起衝突。應用程序與應用程序之間也會以某種方式發生衝突。如果應用程序是服務,則它可能會默認綁定特定的網絡端口。在服務啟動時,它可能還會讀取公共配置文件,這會導致無法在同一宿主機上運行該服務的多個實例,或者非常棘手,這還讓那些想要綁定到同一端口的其他服務難以運行。直接在宿主機上運行應用程序還有一個缺點,那就是難以遷移應用程序。如果宿主機需要關機或者應用程序需要更多的計算能力,那麼從宿主計算機上獲取所有依賴並將其遷移到另一臺宿主機上也相當困難。

2)將應用程序部署到虛擬機上

使用虛擬機來運行應用程序,能夠避免直接在宿主機操作系統上運行應用程序所帶來的麻煩。虛擬機是位於宿主機之上的,它作為獨立的系統運行,同時包含了自己的內核、文件系統、網絡系統等。這樣可以很好地將應用程序和宿主機的操作系統隔離開來,減少了資源、網絡、端口等的衝突,因此不會出現那種直接在宿主機上運行應用程序而產生的弊端 。

比如,可以在宿主機上啟動 5 個不同的虛擬機來運行 5 個相同的應用程序,雖然每個虛擬機上的服務監昕了同一個端口號,但是因為每個虛擬機擁有不同的 IP 地址 , 所以並不會引起衝突 。

又比如,由於各種原因,如果需要關閉宿主計算機,可以將虛擬機遷移到其他宿主機上或者直接關閉虛擬機並在新宿主機上再次啟動它。

然而, 一個虛擬機運行一個應用程序的缺點是耗費資源。我們的應用程序可能只需要幾十兆的磁盤空間來運行,但是整個虛擬機要耗費 GB 級別的空間 。更嚴重的是虛擬機的啟動時間和 CPU 的使用肯定會比應用程序自身消耗得多很多。

容器提供了一種在宿主機上或虛擬機內直接運行應用程序的方式,這種方式能使應用程序運行更快、可移植性更好,更具有擴展性。

3)容器化部署

容器化部署應用具有靈活、高效的使用資源,容器可以包含其所需的全部文件,如同在虛擬機上部署應用程序一樣,可以擁有自己的配置文件和依賴庫,還可以擁有自己的網絡接口。 因此,與在虛擬機上運行應用程序一樣,容器化應用比直接安裝的應用程序更容易遷移,而且因為應用程序所運行的每個容器均擁有獨立的網絡接口,所以也不會出現爭用同一端口的問題 。

容器在啟動時間、磁盤空間佔用和 CPU 處理能力方面更具有優勢,因為它既沒有運行獨立的操作系統,也沒有包含運行整個操作系統所需的大量軟件。它只包含了應用程序運行所需的軟件,以及其他想隨容器一起運行的工具和少量描述容器的元數據。容器的管理工具也比較完善,目前比較主流的管理工具有 : Swarm、 Kubernetes 和 Apache Mesos 。

(1) Swarm 是 Docker 的原生集群工具,它使用標準的 Docker API,這意味著容器能夠使用 docker run 命令啟動, Swarm 會選擇合適的主機來運行容器,這也意味著其他使用 Docker API的工具比如 Compose 也能在 Swarm 上使用,從而利用其進行集群而不是在單個主機上運行 。

(2) Kubemetes (經常被縮寫成 K8s )是 Google 開源的一套自動化容器管理平臺,前身是 Borg ,用於容器的部署、自動化調度和集群管理。目前 Kubemetes 有以下特性:容器的自動化部署、自動化擴展或者縮容、自動化應用及服務升級、容器成組,對外提供服務,支持負載均衡 、 服務的健康檢查、自動重啟。

(3)Apache Mesos 是由加州大學伯克利分校的 A島。Lab 首先開發的一款開源集群管理軟件,支持 Hadoop 、Elasticsearch、 Spark、 Storm 和 Kafka 等應用架構 。

說明:

1、參考書籍:《分佈式服務架構:原理、設計與實戰》

2、如有不合適的地方請反饋。綜合後更改。

3、https://www.runoob.com/docker/docker-tutorial.html(Docker 入門教程)

4、Docker:https://www.docker.com/


分享到:


相關文章: