1 什麼是Docker?
Docker是基于Go語言實作的雲開源項目。Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通過對應用元件的封裝、分發、部署、運作等生命周期的管理,使使用者的APP(可以是一個WEB應用或者資料庫應用等等)及其運作環境能夠做到“一次封裝,到處運作”。
Docker引擎的基礎是Linux自帶的容器(Linux Containers,LXC)技術。IBM對于容器技術的準确描述如下:
容器有效的将單個作業系統管理的資源劃分到孤立的組中,以便更好的在孤立的組之間平衡有沖突的資源使用需求。與虛拟化相比,這樣既不需要指令級模拟,也不需要即時編譯。容器可以在核心CPU本地運作指令,而不需要任何專門的解釋機制。此外,也避免了準虛拟化(paravirtualization)和系統調用替換中的複雜性。
我們可以将容器了解為一種沙盒。每個容器内運作一個應用,不同的容器互相隔離,容器之間可以建立通信機制。容器的建立和停止都十分快速(秒級),容器自身對資源的需求十分有限,遠比虛拟機本身占用的資源少。
2 Docker給DevOps帶來的好處
更快速的傳遞和部署:開發人員可以使用鏡像快速的建構标準開發環境;開發完成後,測試和運維人員可以使用開發人員提供的docker鏡像快速部署應用,可以避免開發和測試運維人員之間的環境差異導緻的部署問題。
更高校的資源利用:Docker容器的運作不需要額外的虛拟化管理程式支援,它是核心級的虛拟化,在占用更少資源的情況實作更高的性能。
更友善的遷移和擴充:Docker容器幾乎可以在任意的平台上運作,包括實體機、虛拟機、公有雲、私有雲、伺服器等。這種相容使得使用者可以在不同的平台之間很友善的完成應用遷移。
更簡單的更新管理:使用Dockerfile,隻需要小小的配置修改,就可以替代以往大量的更新工作,并且所有修改都以增量方式進行分發和更新。
3 虛拟化與Docker

虛拟化的核心是對資源進行抽象,目标往往是為了在同一個機器上運作多個系統或應用,進而提高系統資源的使用率。虛拟化分為很多類型,比如常見的硬體輔助虛拟化(VMware workstation、 KVM等)。Docker所代表的容器虛拟化技術屬于作業系統級虛拟化:核心通過建立多個虛拟的作業系統執行個體(核心和庫)來隔離不同的程序。
傳統虛拟化和容器技術結構比較:傳統虛拟化技術是在硬體層面實作虛拟化,增加了系統調用鍊路的環節,有性能損耗;容器虛拟化技術以共享Kernel的方式實作,幾乎沒有性能損耗。
4 Docker怎麼實作的?
Docker是Client/Server的架構,Docker用戶端與Docker daemon進行互動,daemon負責建構、運作和釋出Docker容器。用戶端可以和服務端運作在同一個系統中,也可以連接配接遠端的daemon。Docker的用戶端的daemon通過RESTful API進行socket通信。
如上圖,Docker守護程序(daemon)在主機上運作,使用者不能直接和守護程序打交道,但是可以通過Docker用戶端與其進行互動;Client是Docker的初始使用者界面,它接收使用者的指令并回報,并且與Docker的守護進行互動。
Docker基于Linux容器技術(LXC),Namespace,Cgroup,UnionFS(聯合檔案系統)等技術實作:
namespace(命名空間):命名空間是 Linux 核心一個強大的特性。每個容器都有自己單獨的命名空間,運作在其中的應用都像是在獨立的作業系統中運作一樣。命名空間保證了容器之間彼此互不影響。docker實際上一個程序容器,它通過namespace實作了程序和程序所使用的資源的隔離。使不同的程序之間彼此不可見。
Docker用到的一些命名空間有:
pid命名空間:用于隔離程序,容器都有自己獨立的程序表和1号程序;
net命名空間:用于管理網絡,容器有自己獨立的networkinfo;
ipc命名空間:用于通路IPC資源(IPC:InterProcess Communication);
mnt命名空間:用于管理挂載點,每個容器都有自己唯一的目錄挂載;
uts命名空間:用于隔離核心和版本辨別(UTS:UnixTimeProcess System),每個容器都有獨立的hostname和domain。
cgroup(控制組):是 Linux 核心的一個特性,主要用來對共享資源進行隔離、限制、審計等。隻有能控制配置設定到容器的資源,才能避免當多個容器同時運作時的對系統資源的競争。控制組技術最早是由 Google 的程式員 2006 年起提出,Linux 核心自 2.6.24 開始支援。控制組可以提供對容器的記憶體、CPU、磁盤 IO 等資源的限制和審計管理。
UnionFS(聯合檔案系統):Union檔案系統(UnionFS)是一種分層、輕量級并且高性能的檔案系統,它支援對 檔案系統的修改作為一次送出來一層層的疊加,同時可以将不同目錄挂載到同一個虛拟檔案系統下(unite several directories into a single virtual filesystem)。Union 檔案系統是 Docker 鏡像的基礎。鏡像可以通過分層來進行繼承,基于基礎鏡像(沒有父鏡像),可以制作各種具體的應用鏡像。另外,不同 Docker 容器就可以共享一些基礎的檔案系統層,同時再加上自己獨有的改動層,大大提高了存儲的效率。Docker 中使用的 AUFS(AnotherUnionFS)就是一種 Union FS。 AUFS 支援為每一個成員目錄(類似 Git 的分支)設定隻讀(readonly)、讀寫(readwrite)和寫出(whiteout-able)權限, 同時 AUFS 裡有一個類似分層的概念, 對隻讀權限的分支可以邏輯上進行增量地修改(不影響隻讀部分的)。Docker 目前支援的 Union 檔案系統種類包括 AUFS, btrfs, vfs 和 DeviceMapper。
5 Docker基本概念
5.1 image
Docker鏡像類似于虛拟機鏡像,是一個隻讀模闆,并且包含了檔案系統。一個鏡像可以隻包含一個作業系統環境(比如SUSE鏡像),也可以安裝了使用者程式及其運作環境(比如eBackup鏡像)。鏡像其實就是一個檔案,任何使用者程式都可以成為鏡像的一部分。
鏡像=作業系統+軟體運作環境+使用者程式
如上圖,一個layer就是一個image,多個image又可以打包成一個image。Image類似一個單連結清單系統,每個image包含一個指向parent image的指針,沒有parent image的image是baseimage(image的指針靠sqlite資料庫來儲存)。
最上面的一層(不屬于image)是可寫的,上面的内容依賴于下面的内容,如果要修改下面的内容,先将下面的内容複制到上面再進行修改。
Image是建立container的基礎。
關于image的一些指令:
docker pull //從網絡上下載下傳鏡像
docker images //檢視本地主機已經存在的鏡像
5.2 Container
容器是從鏡像建立的運作執行個體,可以将其啟動、開始。停止、删除,而這些容器都是互相隔離(獨立程序),互不可見的。
5.3 Repository
Repository是image的集合,而Registry是Repository的集合。