Docker初次見面

楠槡發表於2018-01-07

什麼是Docker

Docker沒有官方中文文件(至少目前為止沒有,2018/1/1),所以只能通過搜尋引擎加上我自己的瞭解來說一下。

Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後釋出到任何流行的Linux機器上,也可以實現虛擬化,容器是完全使用沙箱機制,相互之間不會有任何介面。

上面內容來自百度百科,但是我印象中,Docker好像已經支援了Mac和Windows,所以,應該是可以部署在任何機器上了吧。

其實簡而言之,從功能來說的話,Docker是為了解決開發環境/運維環境不同,釋出以及多平臺移植不方便等問題而推出的一個虛擬化技術。(個人拙見,不一定正確)

那麼Docker常用於哪些場景呢?

  • web應用的自動化打包和釋出;
  • 自動化測試和持續整合、釋出;
  • 在服務型環境中部署和調整資料庫或其他的後臺應用;
  • 從頭編譯或者擴充套件現有的OpenShiftCloud 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
複製程式碼

這個命令會下載一個測試用的映象並啟動一個容器執行它。

hello.png

使用命令從公共registery下載一個映象

$ docker pull ubuntu:latest
複製程式碼

ubuntu

這個公共registry中有幾乎所有的映象,ubuntu,Mysql,Redis等等。Docker開發人員在這個公共registry裡維護者數個映象,也可以獲取使用者釋出的映象。

同樣,也可以建立私有的registry。

列出映象

$ docker images
複製程式碼

images

從映象建立容器

$ docker run --rm -ti ubuntu /bin/bash
複製程式碼

demo

說明:

  • --rm 告訴Docker一旦執行的程式推出就刪除容器,常用於測試時使用,可免除雜亂。
  • -ti 告訴Docker分配一個偽終端並進入互動模式。
  • ubuntu 容器基於的映象
  • /bin/bash 要執行的命令

相關文章