架構雜談《八》

来源:https://www.cnblogs.com/haoxiaozhang/archive/2019/07/29/11265096.html
-Advertisement-
Play Games

架構雜談《八》 Docker 架構 一、Docker 引擎的三大組件 1)Docker 後臺服務(Docker Daemon):是長時間運行在後臺的守護進程,是Docker的核心服務,可以通過命令dockerd與它進行交互通信。 2)REST 介面(REST API):程式可以通過REST的介面來訪 ...


架構雜談《八》

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/

  

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 第一種:瀏覽器支持的轉換方式(Firefox,chrome,opera,safari,ie)等瀏覽器: JSON.parse(jsonstr); //可以將json字元串轉換成json對象 JSON.stringify(jsonobj); //可以將json對象轉換成json對符串   第 ...
  • 比如上面這個頁面, 分為三層:divOne是第外層,divTwo中間層,hr_three是最裡層; 他們都有各自的click事件,最裡層a標簽還有href屬性。 運行頁面,點擊“點擊我”,會依次彈出:我是最裡層 >我是中間層 >我是最外層 >然後再鏈接到百度. 這就是事件冒泡,本來我只點擊ID為hr ...
  • 前言 最近在做後臺管理項目,採用的 "vue element admin" ,上傳圖片是一個很常用的功能,也遇到了很多問題,剛好趁此機會做一些總結。 初步總結下會提到的問題,目錄如下: 1. el upload 自定義上傳方法 2. 圖片上傳到七牛雲 3. 圖片壓縮後再上傳(壓縮使用 "lrz" ) ...
  • transition組件可以給任何元素和組件添加進入/離開過渡,但只能給單個組件實行過渡效果(多個元素可以用transition-group組件,下一節再講),調用該內置組件時,可以傳入如下特性: name 用於自動生成CSS過渡類名 例如:name:'fade'將自動拓展為.fade-enter, ...
  • 摘要: 體驗神奇的GraphQL! 原文: "GraphQL 入門詳解" 作者:MudOnTire "Fundebug" 經授權轉載,版權歸原作者所有。 GraphQL簡介 定義 一種用於API調用的數據查詢語言 核心思想 傳統的api調用一般獲取到的是後端組裝好的一個完整對象,而前端可能只需要用其 ...
  • upitem() { console.log("1 :", 1); let user = this.username; let pwd = this.password; if (user == "" || pwd == "") { this.$toast("賬號或密碼不能為空!!"); } else... ...
  • 費話不多說,直接上問題: 1.開始時,頁面只有兩個DIV的嵌套(見圖) 運行結果是: 現在看運行的是正常的,但是當我設置讓 class="box2" 的DIV浮動時 運行結果是這樣的: 圖中可以看出,box1中已經沒有了任何高度,這是由於box2設置了浮動屬性,box2脫離了文檔流(也可以理解為bo ...
  • 這道題,是集數組,for迴圈和if語句一體的一道水題,首先用數組及for迴圈輸入10個蘋果的高度,然後………… ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...