什麼是Docker
Docker
沒有官方中文文件(至少目前為止沒有,2018/1/1),所以只能通過搜尋引擎加上我自己的瞭解來說一下。
Docker
是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後釋出到任何流行的Linux機器上,也可以實現虛擬化,容器是完全使用沙箱機制,相互之間不會有任何介面。
上面內容來自百度百科,但是我印象中,Docker
好像已經支援了Mac和Windows,所以,應該是可以部署在任何機器上了吧。
其實簡而言之,從功能來說的話,Docker
是為了解決開發環境/運維環境不同,釋出以及多平臺移植不方便等問題而推出的一個虛擬化技術。(個人拙見,不一定正確)
那麼Docker
常用於哪些場景呢?
- web應用的自動化打包和釋出;
- 自動化測試和持續整合、釋出;
- 在服務型環境中部署和調整資料庫或其他的後臺應用;
- 從頭編譯或者擴充套件現有的
OpenShift
或Cloud Foundry
平臺來搭建自己的PaaS環境。
So What?
說了一堆,還是不知道什麼是Docker
,暫時先拋開Docker
具體使用了什麼技術,有什麼指令可以使用,先來介紹幾個概念。
Docker
最重要的兩個概念是映象和容器,除此之外呢,連結和資料卷也很重要。
映象
用過虛擬機器的應該都聽說過映象,沒用過虛擬機器,裝系統的話,也應該知道這個詞彙。其實Docker
的映象就和虛擬機器的快照類似,但是更輕量級,非常非常輕量。
建立Dcoker映象有很多方式,最常用的是在一個現有的映象下建立一個新的映象,因為基本上我們需要的東西都有了公共映象。每個映象都有唯一的ID,作為識別符號存在。
容器
說完映象,來說下容器。同樣是虛擬機器的例子,注意,這裡一直是子啊那虛擬機器作類比,為什麼了,因為Docker
並不是真正意義上的虛擬機器。
從映象中建立容器,等同於使用快照建立虛擬機器,而不同的呢?是前者更輕量。相同的呢?應用都是有容器執行的,就像虛擬機器一樣。
For example!你可以下載一個Ubuntu
的映象,公共安裝Django
等應用及其依賴來完成對它的修改,然後從該映象中建立一個容器,在它啟動後執行應用。
容器和虛擬機器一樣,是隔離的,擁有唯一的識別ID和名稱,同時,容器也語序公開特定的埠,以便於對外公開服務。
與虛擬機器相比,容器有個很大的差異,就在於它們被設計用來執行單程式,無法很好的模擬一個完整的環境,雖然可以通過相關的例項來啟動多個程式,但我覺得這樣真的沒有必要。
容器是設計來執行一個應用的,而非一臺機器,這就是它的意義所在。
資料卷
資料卷可以不受容器生命週期影響進行資料持久化。它們在表面上是容器內的空間,但實際上儲存在容器外,從而允許在不影響資料的情況下對容器進行操作。
Docker
執行開發者定義應用部分和資料部分,並提供工具將其分開。使用Docker
時需要做到的思維變化之一是,容器應該是短暫和一次性的。
卷,是針對容器的,可以使用同一個映象創造多個容器並定義不同的卷。卷儲存在執行Docker
的宿主檔案系統中,同時可以用來在容器間共享資料。
連結
容器在啟動時,將分配一個隨機的私有IP,其他的容器可以使用這個IP與其通訊。所以說,一,連結提供了容器間的相互通訊的渠道;二,容器將共享一個本地網路。
可移植性
這一點並不在剛才列舉的幾個概念之中,但也很重要,這是Docker
最重要的特點之一。
說白了,Docker
不允許不可移植的映象。
How ?
Docker
是如何實現這些功能和需求的呢?這裡就要說到兩個名詞:
Cgroups
這是Linux核心功能,它讓兩件事情變成可能:
- 限制Linux程式組的資源佔用(記憶體,CPU)
- 為程式組製作PID,UTS,IPC,網路,使用者及裝載名稱空間
最為關鍵的,是名稱空間。一個PID名稱空間執行它使用隔離的PID,並與主PID名稱空間獨立開來,因此你可以在一個PID的名稱空間裡擁有自己的PID為1的初始化程式。其他的名稱空間於此類似,然後你可以使用Cgroups建立一個環境,程式可以在其中執行,並於作業系統的其他應用隔離開來,但這裡的關鍵點是,這個環境上的程式使用的是已經載入和執行的核心,因此額外支出與執行其他程式是一樣的。
Union檔案系統
在Union檔案系統裡,檔案系統可以被裝載在其他檔案系統之上,其結果就是一個分層的積累變化。每個裝載的檔案系統表示前一個檔案系統之後的變化集合,就像是一個diff
。
所以,當你下載一個映象,修改它,然後儲存成新版本,實際上只是建立了載入在包裹基礎映象的初始層上的一個新的Union檔案系統。這也是Docker
映象輕量級的原因所在,通常來說,你的DB,Nginx和Syslog映象都可以共享同一個Ubuntu基礎,每一個映象儲存的只是它們需要的功能的基礎上的變化。
Just do it!
Fist of all! 安裝Docker
這裡以Ubuntu伺服器為例,記得先更新下apt源*(
apt-get update
)
安裝
檢查curl包有沒有安裝。
$ which curl
複製程式碼
返回 curl路徑,直接執行獲取最新的docker安裝包
如果curl沒有安裝的話,更新apt源之後,安裝curl包。
$ sudo apt-get update $ sudo apt-get install curl
複製程式碼
獲得最新的docker安裝包。
$ sudo curl -sSL https://get.docker.com/ | sh
複製程式碼
安裝時間較長,耐心等待 or drink a cup of coffer!
確認Docker是否安裝成功。
$ sudo docker run hello-world
複製程式碼
這個命令會下載一個測試用的映象並啟動一個容器執行它。
使用命令從公共registery下載一個映象
$ docker pull ubuntu:latest
複製程式碼
這個公共registry中有幾乎所有的映象,ubuntu
,Mysql
,Redis
等等。Docker
開發人員在這個公共registry裡維護者數個映象,也可以獲取使用者釋出的映象。
同樣,也可以建立私有的registry。
列出映象
$ docker images
複製程式碼
從映象建立容器
$ docker run --rm -ti ubuntu /bin/bash
複製程式碼
說明:
--rm
告訴Docker
一旦執行的程式推出就刪除容器,常用於測試時使用,可免除雜亂。-ti
告訴Docker
分配一個偽終端並進入互動模式。ubuntu
容器基於的映象/bin/bash
要執行的命令