Docker for .Net Developers(part1:Docker基本概念介紹)

 

1、什麼是Docker

目前,.Net 社區中極可能會用到的兩個詞是「微服務」和「Docker」。 這兩個主題都很是引人注目,併爲開發人員和架構師帶來興奮之情。 在這個新系列的博客文章中,我把本身最近學習Docker的總結分享出來,但願對你有幫助。nginx

(一)在聊什麼是Docker時,咱們先看看在虛擬化技術沒有出現以前,咱們是怎麼部署應用的。git

  • 傳統的應用部署:

  1)購買物理機,成本很是高。github

  2)安裝操做系統,配置環境,部署很是慢。
  3)資源浪費,難於遷移和擴展。
  4)可能會被限定硬件廠商。docker

  • 虛擬化技術出現之後:

  1)一個物理機能夠部署多個App。ubuntu

  2)每一個App獨立運行在一個VM裏。安全

  • 虛擬化的優勢:

  1)一個物理機的資源分配到了不一樣的虛擬機裏
  2)很容易擴展,加物理機器或加虛擬機
  3)很容易雲化,好比亞馬遜AWS ,阿里雲等服務器

  •  虛擬化的侷限性:

  1)每一個虛擬機都是一個完整的操做系統,要給其分配資源,當虛擬機數量增多時,操做系統自己消耗的資源勢必增多,因此就引出了容器技術。網絡

 

(2)下面正式介紹一下什麼是Docker:

歸納來講:架構

1)容器是對軟件和其依賴的標準化打包運維

2)應用之間相互隔離【並不是徹底隔離】

3)共享同一個OS Kernel

4)能夠運行在不少主流的操做系統上

詳細來講:

  Docker 使用 Google 公司推出的 Go 語言 進行開發實現,基於 Linux 內核的 cgroup,namespace,以及 AUFS 類的 Union FS 等技術,對進程進行封裝隔離,屬於 操做系統層面的虛擬化技術。因爲隔離的進程獨立於宿主和其它的隔離的進程,所以也稱其爲容器。最初實現是基於 LXC,從 0.7 版本之後開始去除 LXC,轉而使用自行開發的 libcontainer,從 1.11 開始,則進一步演進爲使用 runC 和 containerd。

Docker 在容器的基礎上,進行了進一步的封裝,從文件系統、網絡互聯到進程隔離等等,極大的簡化了容器的建立和維護。使得 Docker 技術比虛擬機技術更爲輕便、快捷。

下面的圖片比較了 Docker 和傳統虛擬化方式的不一樣之處。傳統虛擬機技術是虛擬出一套硬件後,在其上運行一個完整操做系統,在該系統上再運行所需應用進程;而容器內的應用進程直接運行於宿主的內核,容器內沒有本身的內核,並且也沒有進行硬件虛擬。所以容器要比傳統虛擬機更爲輕便。

 (3)爲何要使用Docker

  1)高效的利用系統資源:


  因爲容器不須要進行硬件虛擬以及運行完整操做系統等額外開銷,Docker 對系統資源的利用率更高。不管是應用執行速度、內存損耗或者文件存儲速度,都要比傳統虛擬機技術更高效。所以,相比虛擬機技術,一個相同配置的主機,每每能夠運行更多數量的應用。


  2)更快速的啓動時間:


  傳統的虛擬機技術啓動應用服務每每須要數分鐘,而 Docker 容器應用,因爲直接運行於宿主內核,無需啓動完整的操做系統,所以能夠作到秒級、甚至毫秒級的啓動時間。大大的節約了開發、測試、部署的時間。


  3)一致的運行環境:


  開發過程當中一個常見的問題是環境一致性問題。因爲開發環境、測試環境、生產環境不一致,致使有些 bug 並未在開發過程當中被發現。而 Docker 的鏡像提供了除內核外完整的運行時環境,確保了應用運行環境一致性,從而不會再出現 「這段代碼在我機器上沒問題啊」 這類問題。


  4)持續交付和部署:


  對開發和運維(DevOps)人員來講,最但願的就是一次建立或配置,能夠在任意地方正常運行。
使用 Docker 能夠經過定製應用鏡像來實現持續集成、持續交付、部署。開發人員能夠經過 Dockerfile 來進行鏡像構建,並結合 持續集成(Continuous Integration) 系統進行集成測試,而運維人員則能夠直接在生產環境中快速部署該鏡像,甚至結合 持續部署(Continuous Delivery/Deployment) 系統進行自動部署。
並且使用 Dockerfile 使鏡像構建透明化,不只僅開發團隊能夠理解應用運行環境,也方便運維團隊理解應用運行所需條件,幫助更好的生產環境中部署該鏡像。


  5)更輕鬆的遷移:


  因爲 Docker 確保了執行環境的一致性,使得應用的遷移更加容易。Docker 能夠在不少平臺上運行,不管是物理機、虛擬機、公有云、私有云,甚至是筆記本,其運行結果是一致的。所以用戶能夠很輕易的將在一個平臺上運行的應用,遷移到另外一個平臺上,而不用擔憂運行環境的變化致使應用沒法正常運行的狀況。


  6)更輕鬆的維護和擴展:


  Docker 使用的分層存儲以及鏡像的技術,使得應用重複部分的複用更爲容易,也使得應用的維護更新更加簡單,基於基礎鏡像進一步擴展鏡像也變得很是簡單。此外,Docker 團隊同各個開源項目團隊一塊兒維護了一大批高質量的 官方鏡像,既能夠直接在生產環境使用,又能夠做爲基礎進一步定製,大大的下降了應用服務的鏡像製做成本。

 

不想看文字描述,能夠看下面的對比總結:

(4)Docker解決了什麼問題:

  1)解決了開發和運維之間的矛盾。

  2)在開發和運維之間搭建了一個橋樑,是實現Devops的最佳解決方案。

(5)容器和虛擬機之間的區別:

  虛擬化:是物理資源層面的隔離

  容器:是APP層面的隔離

 

2、什麼是Docker image 【鏡像】

  咱們都知道,操做系統分爲內核和用戶空間。對於 Linux 而言,內核啓動後,會掛載 root 文件系統爲其提供用戶空間支持。而 Docker 鏡像(Image),就至關因而一個 root 文件系統。好比官方鏡像 ubuntu:16.04 就包含了完整的一套 Ubuntu 16.04 最小系統的 root 文件系統。
Docker 鏡像是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些爲運行時準備的一些配置參數(如匿名卷、環境變量、用戶等)。鏡像不包含任何動態數據,其內容在構建以後也不會被改變。
分層存儲
由於鏡像包含操做系統完整的 root 文件系統,其體積每每是龐大的,所以在 Docker 設計時,就充分利用 Union FS 的技術,將其設計爲分層存儲的架構。因此嚴格來講,鏡像並不是是像一個 ISO 那樣的打包文件,鏡像只是一個虛擬的概念,其實際體現並不是由一個文件組成,而是由一組文件系統組成,或者說,由多層文件系統聯合組成。
鏡像構建時,會一層層構建,前一層是後一層的基礎。每一層構建完就不會再發生改變,後一層上的任何改變只發生在本身這一層。好比,刪除前一層文件的操做,實際不是真的刪除前一層的文件,而是僅在當前層標記爲該文件已刪除。在最終容器運行的時候,雖然不會看到這個文件,可是實際上該文件會一直跟隨鏡像。所以,在構建鏡像的時候,須要額外當心,每一層儘可能只包含該層須要添加的東西,任何額外的東西應該在該層構建結束前清理掉。
分層存儲的特徵還使得鏡像的複用、定製變的更爲容易。甚至能夠用以前構建好的鏡像做爲基礎層,而後進一步添加新的層,以定製本身所需的內容,構建新的鏡像。

3、什麼是Docker container

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

容器的實質是進程,但與直接在宿主執行的進程不一樣,容器進程運行於屬於本身的獨立的 命名空間。所以容器能夠擁有本身的 root 文件系統、本身的網絡配置、本身的進程空間,甚至本身的用戶 ID 空間。容器內的進程是運行在一個隔離的環境裏,使用起來,就好像是在一個獨立於宿主的系統下操做同樣。這種特性使得容器封裝的應用比直接在宿主運行更加安全。也由於這種隔離的特性,不少人初學 Docker 時經常會混淆容器和虛擬機。
前面講過鏡像使用的是分層存儲,容器也是如此。每個容器運行時,是以鏡像爲基礎層,在其上建立一個當前容器的存儲層,咱們能夠稱這個爲容器運行時讀寫而準備的存儲層爲容器存儲層。
容器存儲層的生存週期和容器同樣,容器消亡時,容器存儲層也隨之消亡。所以,任何保存於容器存儲層的信息都會隨容器刪除而丟失。
按照 Docker 最佳實踐的要求,容器不該該向其存儲層內寫入任何數據,容器存儲層要保持無狀態化。全部的文件寫入操做,都應該使用 數據卷(Volume)、或者綁定宿主目錄,在這些位置的讀寫會跳過容器存儲層,直接對宿主(或網絡存儲)發生讀寫,其性能和穩定性更高。
數據卷的生存週期獨立於容器,容器消亡,數據卷不會消亡。所以,使用數據卷後,容器刪除或者從新運行以後,數據卻不會丟失。

4、什麼是Docker registry

  鏡像構建完成後,能夠很容易的在當前宿主機上運行,可是,若是須要在其它服務器上使用這個鏡像,咱們就須要一個集中的存儲、分發鏡像的服務,Docker Registry 就是這樣的服務。
一個 Docker Registry 中能夠包含多個倉庫(Repository);每一個倉庫能夠包含多個標籤(Tag);每一個標籤對應一個鏡像。
一般,一個倉庫會包含同一個軟件不一樣版本的鏡像,而標籤就經常使用於對應該軟件的各個版本。咱們能夠經過 <倉庫名>:<標籤>的格式來指定具體是這個軟件哪一個版本的鏡像。若是不給出標籤,將以 latest 做爲默認標籤。
以 Ubuntu 鏡像 爲例,ubuntu 是倉庫的名字,其內包含有不一樣的版本標籤,如,14.04, 16.04。咱們能夠經過 ubuntu:14.04,或者 ubuntu:16.04 來具體指定所需哪一個版本的鏡像。若是忽略了標籤,好比 ubuntu,那將視爲 ubuntu:latest。
倉庫名常常以 兩段式路徑 形式出現,好比 jwilder/nginx-proxy,前者每每意味着 Docker Registry 多用戶環境下的用戶名,後者則每每是對應的軟件名。但這並不是絕對,取決於所使用的具體 Docker Registry 的軟件或服務。
Docker Registry 公開服務
Docker Registry 公開服務是開放給用戶使用、容許用戶管理鏡像的 Registry 服務。通常這類公開服務容許用戶免費上傳、下載公開的鏡像,並可能提供收費服務供用戶管理私有鏡像。

最常使用的 Registry 公開服務是官方的 Docker Hub,這也是默認的 Registry,並擁有大量的高質量的官方鏡像。除此之外,還有 CoreOS 的 Quay.io,CoreOS 相關的鏡像存儲在這裏;Google 的 Google Container Registry,Kubernetes 的鏡像使用的就是這個服務。
因爲某些緣由,在國內訪問這些服務可能會比較慢。國內的一些雲服務商提供了針對 Docker Hub 的鏡像服務(Registry Mirror),這些鏡像服務被稱爲加速器。常見的有 阿里雲加速器、DaoCloud 加速器 等。使用加速器會直接從國內的地址下載 Docker Hub 的鏡像,比直接從 Docker Hub 下載速度會提升不少。在 安裝 Docker 一節中有詳細的配置方法。
國內也有一些雲服務商提供相似於 Docker Hub 的公開服務。好比 時速雲鏡像倉庫、網易雲鏡像服務、DaoCloud 鏡像市場、阿里雲鏡像庫 等。
私有 Docker Registry
除了使用公開服務外,用戶還能夠在本地搭建私有 Docker Registry。Docker 官方提供了 Docker Registry 鏡像,能夠直接使用作爲私有 Registry 服務。在 私有倉庫 一節中,會有進一步的搭建私有 Registry 服務的講解。

 5、什麼是Dockerfile

  dockerfile是Docker鏡像和應用程序部署的描述。 這是一個基本的文件,你可能只須要幾行就能夠開始使用本身的鏡像。 Docker鏡像是分層構建的。 您選擇一個包含您須要的元素的基礎鏡像,而後將其複製到您本身的應用程序頂部。 Microsoft提供了許多用於處理.NET Core應用程序的鏡像,後面的文章我一點一點的介紹。

 

 

注:本博客參考了github上關於docker的文章

 

 

 

做者:郭崢

出處:http://www.cnblogs.com/runningsmallguo/

本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文連接。

相關文章
相關標籤/搜索