Docker初次見面

什麼是Docker

Docker沒有官方中文文檔(至少目前爲止沒有,2018/1/1),因此只能經過搜索引擎加上我本身的瞭解來講一下。web

Docker 是一個開源的應用容器引擎,讓開發者能夠打包他們的應用以及依賴包到一個可移植的容器中,而後發佈到任何流行的Linux機器上,也能夠實現虛擬化,容器是徹底使用沙箱機制,相互之間不會有任何接口。sql

上面內容來自百度百科,可是我印象中,Docker好像已經支持了Mac和Windows,因此,應該是能夠部署在任何機器上了吧。docker

其實簡而言之,從功能來講的話,Docker是爲了解決開發環境/運維環境不一樣,發佈以及多平臺移植不方便等問題而推出的一個虛擬化技術。(我的拙見,不必定正確)數據庫

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

  • web應用的自動化打包和發佈;
  • 自動化測試和持續集成、發佈;
  • 在服務型環境中部署和調整數據庫或其餘的後臺應用;
  • 從頭編譯或者擴展示有的OpenShiftCloud Foundry平臺來搭建本身的PaaS環境。

So What?

說了一堆,仍是不知道什麼是Docker,暫時先拋開Docker具體使用了什麼技術,有什麼指令可使用,先來介紹幾個概念。bash

Docker最重要的兩個概念是鏡像容器,除此以外呢,連接數據卷也很重要。服務器

鏡像

用過虛擬機的應該都據說過鏡像,沒用過虛擬機,裝系統的話,也應該知道這個詞彙。其實Docker的鏡像就和虛擬機的快照相似,可是更輕量級,很是很是輕量。網絡

建立Dcoker鏡像有不少方式,最經常使用的是在一個現有的鏡像下建立一個新的鏡像,由於基本上咱們須要的東西都有了公共鏡像。每一個鏡像都有惟一的ID,做爲標識符存在。運維

容器

說完鏡像,來講下容器。一樣是虛擬機的例子,注意,這裏一直是子啊那虛擬機做類比,爲何了,由於Docker並非真正意義上的虛擬機。curl

從鏡像中建立容器,等同於使用快照建立虛擬機,而不一樣的呢?是前者更輕量。相同的呢?應用都是有容器運行的,就像虛擬機同樣。

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 要運行的命令
相關文章
相關標籤/搜索