從docker介紹及其簡介

  • 2020 年 12 月 3 日
  • 筆記

一、引言

1.我本地代碼運行沒問題啊,但是別人機器運行不了,從而導致環境不一致的問題

2.那個兄弟又寫死循環了,怎麼這麼卡,在多用戶的操作系統下,會相互影響。

  1. 天貓雙十一的情況下,用戶量暴漲,從而導致運維成本過高的問題

image-20201203085054538

二、docker的由來

Docker 是一個開源項目,誕生於 2013 年初,最初是dotCloud 公司內部的一個業餘項目。它基於 Google 公 司推出的 Go 語言實現。2013年3月,dotCloud公司的創始人之一,Docker之父,28歲的Solomon Hykes正式決定,將Docker項目開源。

image-20201203093035368

遵從了 Apache 2.0 協議,項目代碼在 GitHub上進行 維護。Docker 自開源後受到廣泛的關注和討論,以至於 dotCloud公司後來都改名為 Docker Inc。Redhat已經 在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS產品中廣泛應用。Docker 項目的目標是實現輕量級的 操作系統虛擬化解決方案。 Docker 的基礎是 Linux 容器(LXC)等技術。在 LXC 的基礎上 Docker 進行了進一 步的封裝,讓用戶不需要去關心容器的管理,使得操作更為簡便。用戶操作 Docker 的容器就像操作一個快速輕量級的虛擬機一樣簡單。Docker 可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然 後發佈到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口 (類似iPhoneapp),更重要的是容器性能開銷極低。

三、為什麼要有docker?(why?)

先說docker是幹啥用的。因為現在物理服務器是很強大的,我們如果在一台物理機上只跑一個服務就浪費了。而同時跑很多服務他們之間又互相影響,比如一個服務出了內存泄漏把整個服務器的內存都佔滿了,其他服務跟着倒霉。所以要把每個服務都必須隔離起來,讓它們只使用自己那部分有限的CPU、內存、硬盤以及自己所依賴的軟件包。在容器技術之前,這個最早是用的是虛擬機——–業界的網紅。虛擬機技術的代表,是VMWareOpenStack所以,早先每個服務之間是用虛擬機來實現隔離的,但是對資源有點浪費,於是就有了docker,一個機器上可以裝十幾個到幾十個docker,他們共享操作系統核心,佔用資源少,啟動速度快,但又能提供資源(CPU、內存、磁盤等)的一定程度的隔離。

簡單來說就是,不同的應用程序所依賴的環境不一樣,如果把他們依賴的軟件都安裝在一個服務器上,不僅需要調試很久,而且可能會有衝突。

如果想把兩個應用程序隔離起來,可以在服務器上創建不同的虛擬機,不同的虛擬機放不同的應用,但是虛擬機的開銷比較高。docker作為輕量級的虛擬機,是一個很好的工具。

##

四、什麼是docker?(what?)

引入:我們知道,軟件的依賴環境大致包括配置文件、代碼、tomcat(web輕量應用服務器)JDK(軟件開發工具包)、操作系統

  • IT 軟件中所說的 「Docker」 ,是指容器虛擬化技術,docker本身並不是容器,而是用於支持創建和使用 Linux 容器的工具。

  • 在實際應用中是軟件部署的一種解決方案:作為一個軟件集裝箱化平台,可以讓開發者構建應用程序時,將它與其依賴環境一起打包到一個容器中,然後很容易地發佈和應用到任意平台中也可以實現虛擬化,容器是完全使用沙箱機制,相互之間不會有任何接口。同時,也提升計算機硬件資源的利用率。

    補充 說明

    # 沙箱機制(Sandboxie)
    一、沙箱是什麼?
      沙箱是一個虛擬系統程序,沙箱提供的環境相對於每一個運行的程序都是獨立的,而且不會對現有的系統產生影響,即沙箱提供一個限制該應用程序對系統資源的訪問權限。

    二、沙箱的應用
      (1)搭建測試環境。沙箱的應用只能訪問自己的應用訪問目錄,而不能應用之間的資源進行共享,這樣就形成了一個相對安全的機制,由於沙箱具有非常良好的獨立性、隔離性,所以能夠搭建一些具有高風險的軟件進行測試。

      (2)應用容器的利用,如Docker就是應用沙箱機制,這樣使得應用組件經過Docker的封裝,使得在項目的遷移、測試環境到生產環境的部署,保證了應用程序的運行環境保持一致性,同時也減少大量在環境搭建上的工作量。

圍繞Docker引擎進行開發和集成的產品

示例

  1. 首先,鯨魚是操作系統。要交付的應用程序是各種貨物,要將各種形狀和尺寸不同的貨物放到大鯨魚上,得考慮每件貨物怎麼安放(應用程序配套的環境),還得考慮貨物和貨物之間能否重疊起來(應用程序依賴的環境是否會衝突)。

  2. 現在使用了集裝箱(容器)把每件貨物都放到集裝箱里,這樣大鯨魚可以用同樣地方式安放、堆疊集裝了,省事省力。

  3. 即:打包放到鯨魚上,鯨魚放到服務器上。也就是搭建(創建)=》運輸(發送)=》運行:「build——ship——run」,這樣在自己的電腦上怎麼運行,在服務器上也會怎麼運行。

用docker運行一個程序的過程:

去倉庫把鏡像拉到本地,然後用一條命令把鏡像運行起來,變成容器。

image-20201202120626320

五、docker的思想

集裝箱:

  • 會將所有需要的內容放到不同的集裝箱中,誰需要這些環境就直接拿到這個集裝箱就可以

標準化

  • 運輸的標準化:docker有一個碼頭所有上傳的集裝箱都放在了這個碼頭上,當誰需要某一個環境,就直接指派大鯨魚去搬運這個集裝箱就可以了

  • 命令的標準化:docker提供了一系列的命令,幫助我們去獲取集裝箱等等操作,當然,也可以上傳等操作

  • 提供了RESTAPI:衍生出了很多的圖形化界面,Rancher等

    • PS:REST API是一組關於如何構建Web應用程序API的架構規則、標準或指導,REST API遵循API原則的架構風格。REST是專門針對Web應用程序而設計的,其目的在於降低開發的複雜度,提高系統的可伸縮性。

隔離

  • docker在運行集裝箱內的內容時,會在linux的內核中單獨的開闢一片空間,這片空間不會影響到其他程序

 

六、docker的核心

docker三大核心:鏡像、容器、倉庫

鏡像:(Image)=>複製的程序

定義:Docker 鏡像可以看作是一個特殊的文件系統(模板),除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些為運行時準備的一些配置參數(如匿名卷、環境變量、用戶等)

作用:類似於虛擬機的快照,用來創建新的容器

特點:鏡像不包含任何動態數據,其內容在構建之後也不會被改變。

image-20201203091105075

容器:(Container)=>集裝箱

  • 鏡像(Image)和容器(Container)的關係,就像是面向對象程序設計中的類和實例一樣,鏡像是靜態 的定義,容器是鏡像運行時的實體。容器可以被創建、啟動、停止、刪除、暫停等。

倉庫: (Repository)=存放鏡像的地方

用來保存鏡像的倉庫,控制版本,類似於git。當我們構建好自己的鏡像之後,需要存放在倉庫中,當我們需要啟動一個鏡像時,可以在倉庫中下載下來。

七、docker的作用

  • 解決運行環境不一致所導致的問題。這樣就不會產生「本地運行沒問題,可一到服務器上就不行了」的情況。

  • 限定最大的cpu使用內存硬盤,這樣就起到了隔離的作用,避免產生「一塊代碼產生死循環,把磁盤佔滿了,其它程序也掛了」的情況。

  • 雙11時擴展機器用,降低運維人員的成本。

image-20201203092656526

總結:

docker的標準化讓快速擴展,彈性伸縮變得簡單

使用之前:

每次發佈一個程序,都要走一遍以下的流程:

image-20201203092021035

使用之後:

遷移的時候,只需要在新的服務器上啟動需要的容器就可以了,

無論新舊服務器是否是同一類別的平台。這無疑幫助我們節約了大量的寶貴時間,並降低部署過程出現問題的風險。

image-20201203092109569

 

八、docker與虛擬機的比較

作為一個作為一種輕量級的虛擬化方式,Docker 在運行應用上跟傳統的虛擬機的方式相比具有如下顯著優勢:

  • Docker 容器啟動很快,啟動和停止可以實現秒級,相比傳統的虛擬機方式(分鐘級)要快速很多。

  • Docker 容器對系統資源需求很少,一台主機上可以同時運行數千個 Docker 容器。

  • Docker 通過類似 git 設計理念的操作來方便用戶獲取、分發和更新應用鏡像,存儲復用,增量更新。

  • Docker 通過Dockerfile支持靈活的自動化創建和部署機制,可以提高工作效率,並標準化流程。

 

特性 容器 虛擬機
啟動速度 秒級 分鐘級
隔離級別 進程級 操作系統級別
隔離策略 CGroups Hypervisor
性能 接近原生 較好
內存 MB級 GB級
系統資源 0~5% 5~15%
鏡像儲存 KB-MB GB-TB
硬盤適應 MB級 GB級
集群規模 上萬 上百
運行密度 單台主機支持上千個 單台主機支持幾個
隔離性 安全隔離 完全隔離
遷移 優秀 一般
高可用策略 彈性、負載、動態 備份、容災、遷移

dockerVM快的原因:

  1. docker有着比虛擬機更少的抽象層

    • 由於docker不需要Hypervisor實現硬件資源虛擬化,運行在docker容器上的程序直接使用的都是實際物理機的硬件資源 因此在CPU、內存利用率上docker將會在效率上有明顯優勢

  2. docker利用的是宿主機的內核,而不需要Centos

    • 因此當新建一個容器時,docker不需要和虛擬機一樣重新加載這個操作系統內核 進而避免尋找、加載操作系統內核比較費時費資源的過程

  3. 當新建個虛擬機時,虛擬機軟件需要加載Centos這個新建過程是”分鐘級別的”

    • docker由於直接利用宿主機的操作系統,則省略了這個個過程因此新建一個docker容器只需要”幾秒鐘”

九、docker與虛擬化

Docker 以及其他容器技術,都屬於操作系統虛擬化範疇,操作系統細膩化最大的特點就是不需要額外的 supervisor 支持。Docker 虛擬化方式之所以有眾多優勢,跟操作系統虛擬化技術自身的設計和實現分不開。

image-20201203110242073

傳統方式是在硬件層面實現虛擬化,需要有額外的虛擬機管理應用和虛擬機操作系統層。Docker 容器時在操作系統層面實現虛擬化,直接復用本地主機的操作系統,因此更加輕量級。

虛擬機技術:

  • 在一個操作系統之上運行 / 安裝另一種操作系統

  • 應用程序, 操作系統和硬件三者之間的關係不變

缺點:

  1. 資源佔用多

  2. 冗餘步驟多

  3. 啟動慢(分鐘級)

容器虛擬化技術:

💪虛擬化技術詳解,在下一篇文章中介紹猛👉👉👉戳我

  • 不是模擬一個完整的操作系統, 他是將軟件運行所需要的所有資源打包到一個隔離的容器

  • 只需要軟件工作所需要的庫資源和設置

  • 因此系統變得高效輕量, 且能保證任何環境中軟件都能始終如一的運行

容器虛擬化技術

十、docker的運行原理

docker的基本架構圖:

image-20201203095037568

低層原理

原理解析

  • docker pull的時候,Docker damemon先在本地倉庫中找,如果沒有,再去中央倉庫中拉取,拉取到本地倉庫就好了。

  • docker run的時候,也是先在本地倉庫中找,如果有,直接放到容器里用。否則,去中央倉庫中拉取。

docker的工作方式:

  • Docker是一個Client-Server結構的系統

  • Docker守護進程運行在主機上,然後通過Socket連接從客戶端訪問, 守護進程從客戶端接受命令並管理運行在主機上的容器,而容器,就是一個運行時的環境

img

 

十一、docker理念(在開發和運維之間的優勢):

docker的理念:一次構建處處運行

對於開發和運維人員來說,最夢寐以求的效果可能就是一次創建和配置,之後可以在任意地方、任意時間讓應用正常運行,而 Docker 恰恰可以實現這一中級目標。具體來說,在開發和運維過程中,Docker 具有以下幾個方面的優勢:

  • 更快的應用交付和部署

    • 傳統的應用開發完成後,需要提供一堆安裝程序和配置說明文檔,安裝部署後需根據配置文檔進行繁雜的配置才能正常運行

    • 使用Docker之後只需要交付少量容器鏡像文件,在正式生產環境加載鏡像並運行即可,應用安裝配置在鏡像里已經內置好,大大節省部署配置和測試驗證時間

  • 更便捷的升級和擴縮容

    • 隨着微服務架構和Docker的發展,大量的應用會通過微服務方式架構,應用的開發構建將變成搭樂高積木一樣,每個”Docker容”器將變成一塊”積木”,”應用的升級將變得非常容易”

    • 當現有的容器不足以支撐業務處理時,可通過鏡像運行”新的容器進行快速擴容”,使應用系統的擴容從原先的天級變成分鐘級甚至秒級

  • 更簡單的運維繫統

    • 應用容器化運行後,生產環境運行的應用可與開發、測試環境的應用”高度一致”,容器會將應用程序相關的環境和狀態完全封裝起來,不會因為底層基礎架構和操作系統的不一致性給應用帶來影響,產生新的BUG

    • 當出現程序異常時,也可以通過測試環境的相同容器進行快速定位和修復

  • 更高效的計算資源被利用

    • Docker是內核級虛擬化,其不像傳統的虛擬化技術一樣需要額外的Hypervisor支持,所以在一台物理機上”可以運行很多個容器實例”,可大大”提升物理服務器的CPU和內存的利用率”

十二、docker總結:

  • Docker本身並不是容器,它是創建容器的工具,是應用容器引擎。

  • Docker 是一個容器運行載體或稱之為管理引擎

  • image 文件生成的容器實例,本身也是一個文件,稱為鏡像文件

  • 同一個 image 文件,可以生成多個同時運行的容器實例

  • 一個容器運行一種服務,當我們需要的時候,就可以通過docker客戶端創建一個對應的運行實例,也就是我們的容器

  • 至於倉庫,就是放了一堆鏡像的地方,我們可以把鏡像發佈到倉庫中,需要的時候從倉庫中拉下來就可以了

 

附贈寶典秘籍

以下是一些關於docker的參考資料,有興趣的可以看看:

//www.zhihu.com/question/28300645

//blog.51cto.com/ganbing/2085769?from=timeline&isappinstalled=0

//c.biancheng.net/view/3118.html

//www.cnblogs.com/mrhelloworld/p/docker1.html