Docker簡介


一、什么是Docker?

Docker時Docker.Lnc公司開源的一個基於LXC技術之上搭建的Container容器引擎,源代碼托管在Github上,基於Go語言並遵從Apache2.0協議開源。
Docker屬於Linux容器的一種封裝,提供簡單易用的容器使用接口。
Docker將應用程序與該程序的依賴,打包在一個文件里面。運行這個文件,就會生成一個虛擬容器。程序在這個虛擬容器里運行,就好像在真實的物理機上運行一樣。有了Docker,就不用擔心環境問題。
總體來說,Docker的接口相當簡單,用戶可以方便地創建和使用容器,把自己的應用放入容器。容器還可以進行版本管理、復制、分享、修改,就像管理普通的代碼一樣。

 

二、Docker的概念

Docker是開發人員和系統管理員使用容器開發、部署和運行應用程序的平台。使用Linux容器來部署應用程序稱為集裝箱化。使用docker輕松部署應用程序。

集裝箱化的優點:

  • 靈活:即使是復雜的應用程序也可封裝。
  • 輕量級:容器利用並共享主機內核。
  • 便攜式:您可以在本地構建,部署到雲上並在任何地方運行。
  • 可擴展性:您可以增加和自動分發容器副本。
  • 可堆疊:您可以垂直堆疊服務並及時並及時堆疊服務。

三、images和容器

通過運行images啟動容器,一個images是一個可執行的包,其中包括運行應用程序所需要的所有內容-代碼,運行時,庫、環境變量和配置文件。
容器時images運行時示例-當被執行時(即,images狀態,或者用戶進程)在內存中,可以使用命令查看正在運行容器的列表docker ps,就像在Linux中一樣。

四、虛擬機

虛擬機(virtual machine)就是帶環境安裝的一種解決方案。它可以在一種操作系統里面運行另一種操作系統,比如在Windows系統里面運行Linux系統。應用程序對此毫無感知,因為虛擬機看上去跟真絲系統一模一樣,而對於底層系統來說,虛擬機就是一個普通文件,不需要了就刪掉,對其它部分毫無影響。

虛擬機的缺點:

  • 資源占用多:虛擬機會獨占一部分內存和硬盤空間。它運行的時候,其他程序就不能使用這些資源了。哪怕虛擬機里面的應用程序,真正使用的內存只有1M,虛擬機依然需要幾百MB的內容才能運行。
  • 冗余步驟多:虛擬機是完整的操作系統,一些系統級別的操作步驟,往往無法跳過,比如用戶登錄。
  • 啟動慢:啟動操作系統需要多久,啟動虛擬機就需要多久。可能要等幾分鍾,應用陳故鄉才能真正運行。

五、Linux容器

由於虛擬機存在這個缺點,Linux發展出了另一種虛擬化技術:Linux容器(Linux Containers,縮寫為LXC)。
Linux容器不是模擬一個完整的操作系統,而是對進程進行隔離。或者說,在正常進程的外面套了一個保護層。對於容器里面的進程來說,它接觸到的各種資源都是虛擬的,從而實現與底層系統的隔離。
由於容器是進程級別的,相比虛擬機又很多優勢。
  • 啟動快:容器里面的應用,直接就是底層系統的一個進程,而不是虛擬機內部的進程。所以,啟動容器相當於啟動本機的一個進程,而不是啟動一個操作系統,速度就快很多。
  • 資源占用少:容器只占用需要的資源,不占用那些沒有用到的資源;虛擬機由於是完整的操作系統,不可避免要占用所以資源。另外,多個容器可以共享資源,虛擬機都是獨享資源。
  • 體積小:容器只要包含用到的組件即可,而虛擬機是整個操作系統的打包,所以容器文件比虛擬機文件要小很多。總之,容器有點像輕量級的虛擬機,能夠提供虛擬化的環境,但是成本開銷小得多。

六、容器和虛擬機

一個容器中運行原生Linux和共享主機與其它容器的內核,它運行一個獨立的進程,不占用任何其它可執行文件的內存,使其輕量化。

相比之下,虛擬機(VM)運行一個完整的“客戶”操作系統,通過虛擬機管理程序虛擬訪問主機資源。一般來說,虛擬機提供的環境比大多數應用程序需要的資源多。

七、Docker產生的目的就是解決以下問題

  • 環境管理復雜:從各種OS到各個中間件再到各種App,一款產品能夠成功發布,作為開發者需要關心的東西太多,且難於管理,這個問題在軟件興業中普遍存在並需要直接面對。Docker可以簡化部署多種應用實例工作,比如Web應用、后台應用、數據庫應用、大數據應用比如Hadoop集群、消息隊列等等都可以打包成一個image部署。
  • 雲時代的到來:AWS的成功,引到開發者將應用轉移到雲上,解決來硬件管理的問題,然而軟件配置和管理香瓜的問題依然存在。Docker的出現正好能幫助軟件開發着開闊思路,嘗試新的軟件管理的方法解決這個問題。
  • 虛擬化手段的變化:雲時代采用標配硬件來降低成本,采用虛擬化手段來滿足用戶按需分配的資源需求以及保證可用性和隔離性。然而無論是KVM還是Xen,在Docker看來都是在浪費資源,又難於管理,更加輕量級大LXC更加靈活和快速:
  • LXC的便攜性:LXC在Linux 2.6的Kernel里就已經存在了,但是其設計之初並非為雲計算考慮,缺少標准化的描述手段和容器的可便攜性,決定其構建出的環境難於分發和標准化管理(相對於KVM之類的image和sanpshot的概念)。Docker就在這個問題上作出了實質性的創新方法。

八、Docker的用途

Docker的主要用途,目前又三大類:

  • 提供了一次性的環境:比如,本地測試他人的軟件、持續集成的時候提供單元測試和構建的環境。
  • 提供彈性的雲服務:因為Docker容器可以隨開隨關,很適合動態擴容和所容。
  • 組建微服務架構:通過多個容器,一台機器可以跑多個服務,因此在本機就可以模擬出微服務架構。

九、基本概念

Docker鏡像

操作系統分為內核和用戶空間,對於Linux而言,內核啟動后,會掛載root文件系統為其提供用戶空間支持。而Docker鏡像(Image),就相當於是一個root文件系統。
Docker鏡像是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些為運行時准備的一些配置參數(如匿名卷、環境變量、用戶等)。鏡像不包含任何動態數據,其內容在構建之后也不會被改變。

分層存儲

因為鏡像包含系統完整的root文件系統,其體積往往是龐大的,因此在Docker設計時,就充分利用Union FS技術,將其設計為分層存儲的架構。所以嚴格來說,鏡像並非是像一個ISO那樣的打包文件,鏡像只是一個虛擬的概念,其實際體現並非由一個文件組成,而是由一組文件系統組成,或者說,由多層系統聯合組成。
鏡像構建時會一層層構建,前一層是后一層的基礎。每一層構建完就不會再發生改變,后一層上的任何改變只發生在自己這一層,比如,刪除前一層文件的操作,實際不是真的刪除前一層的文件,而是僅在當前層標記為該文件已刪除。在最終容器運行的時候,雖然不會看到這個文件,但是實際上該文件會一直跟隨鏡像。因此,在構建鏡像的時候,需要額外小心,每一層盡量只包含該層需要添加的東西,任何額外的東西應該在該層構建結束前清理掉。
分層存儲的特征還使得鏡像的復用、定制變的更為容易。甚至可以用之前構建好的鏡像作為基礎層,然后進一步添加新的層,以定制自己所需要的內容,構建新的鏡像。

Docker容器

鏡像(image)和容器(container)的關系,就像是面向對象程序設計中的類和實例一樣,鏡像是靜態的定義,容器是鏡像運行時的實體。容器可以被創建、啟動、停止、刪除、暫停等。
容器的實質是進程,但與直接在宿主執行的進程不同,容器進程運行於屬於自己的獨立的命名空間。因此容器可以擁有自己的root文件系統、自己的網絡配置、自己的進程空間,甚至自己的用戶ID空間。容器內的進程是運行在一個隔離的環境里,使用起來,就好像是在一個獨立宿主的系統下操作一樣。這種特性使容器封裝的應用比直接在宿主運行更加安全。
前面講過鏡像使用的是分層儲存,容器也是如此。每一個容器運行時,是以鏡像為基礎層,在其上創建一個當前容器的存儲層,可以稱這個味容器運行時讀寫而准備的存儲層為容器存儲層。
容器存儲層的生存周期和容器一樣,容器消亡時,容器存儲層也隨之消亡。因此,任何保存於容器存儲層的信息都會隨容器刪除而丟失。
按照Docker最佳實踐的要求,容器不應該向其存儲層寫入任何數據,容器存儲層要保持無狀態化。所有的文件寫入操作,都應該使用數據卷(volume)、或者綁定宿主目錄,在這些位置的讀寫會跳過存儲層,直接對宿主(或網絡存儲)發生讀寫,其性能和穩定性更高。
數據卷的生存周期獨立於容器,容器消亡,數據卷不會消亡。因此,使用數據卷后,容器刪除或者重新運行之后,數據卻不會丟失。

倉庫

Docker Registry

鏡像構建完成后,可以很容易的在當前宿主機上運行,但是,如果需要在其它服務器上使用這個鏡像,我們就需要一個集中的存儲、分發鏡像的服務,Docker Registry就是這樣的服務。
一個Docker Registry中可以包含多個倉庫(Repository);每個倉庫可以包含多個標簽(tag);每個標簽對應一個鏡像。
通常,一個倉庫會包含一個軟件不同版本的鏡像,而標簽就常用於對應該軟件的各個版本。我們可以通過<倉庫名>:<標簽>的格式來指定具體是這個軟件那個版本的鏡像。如果不給出標簽,將以laest作為默認標簽。
以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的鏡像使用的就是這個服務。
在國內訪問這些服務可能會比較慢,郭恩ID餓一些雲服務商題提供了針對Docker Hub的鏡像服務(Registry Mirror),這些鏡像服務被稱為加速器。常見的有阿里雲加速器、DaoCloud加速器等。使用加速器會直接從國內的地址下載Docker Hub的鏡像,比直接從Docker Hub下載速度會提高很多。

 

 

 

 
 
 
 
 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM