深刻淺出聊一聊Docker

網易雲信IM私有化部分用到Docker技術,今天咱們就深刻淺出來聊聊Docker。node

Docker是什麼?
Docker是一個工具,能把應用打包部署於container裏,這裏能夠把container看作是一個簡易版的 Linux 環境和運行在其中的應用程序,每一個container運行一個application。它誕生於 2013 年初,最初是 dotCloud公司內部的一個業餘項目,創始人是Solomon Hykes。
Docker自開源後受到普遍的關注和討論,Redhat已經在其 RHEL6.5 中明確支持Docker;Google也在其PaaS產品中普遍應用。Docker項目的目標是實現輕量級的操做系統虛擬化解決方案。 如今Docker已經從一個工具轉化成平臺,小生態圈。 linux

Docker的優點有哪些?
clipboard.png
之前企業部署軟件會購買真正的服務器,這種模式的資源利用率很低。後來出現了雲端的虛擬服務器,好比AWS,提升了必定的資源利用率,可是不一樣階段的應用環境可能不一樣。git

Docker對這些有很大的優化,好比: 1. Docker 容器能夠實現秒級啓動 2. 容器除了運行其中應用外,基本不消耗額外的系統資源,使得應用的性能很高,系統的開銷很小。傳統虛擬機方式運行10個不一樣的應用就要起10個虛擬機,而Docker只須要啓動10個隔離的應用便可。 下圖是傳統虛擬化方式和Docker的不一樣。Docker本質上是一種虛擬化的技術,不是虛擬機。Docker是在操做系統層面上實現虛擬化,直接複用本地主機的操做系統,而傳統方式則是在硬件層面實現。在傳統模式下,Guest OS會佔用大量空間,並且不一樣的應用會須要不一樣的虛擬機。在Docker中只有一個OS,各類application運行在一個OS上。
clipboard.png程序員

*Hypervisor是一種虛擬化的技術
具體來講,Docker的優點包括:docker

  1. Faster developer onboarding
  2. No vendor lockin
  3. Eliminate environment inconsistencies
  4. Ship applications faster
  5. Scale quickly
  6. Easily remediate issues

Play with Docker container
下載安裝完Docker後,能夠嘗試使用如下命令來運行一個聊天軟件。
docker run -d -p 3000:3000 unclebarney/chit-chat
這個命令的含義是啓動Docker容器。-d表示在後臺啓動。-p表示作端口的映射,把容器裏的3000端口映射到宿主機上的3000。使用的鏡像爲unclebarney/chit-chat。 這個命令有兩部分操做:
1.從Dockerhub(全部鏡像存儲的地方)下載此鏡像,大概5到30秒(取決於帶寬)
2.根據鏡像啓動container,並運行node server數據庫

Docker image
Docker image(鏡像)是container的基礎。全部container都是從image構建的。 Docker 運行容器前須要本地存在對應的鏡像,若是鏡像不存在本地,Docker 會從鏡像倉庫下載(默認是 Docker Hub 公共註冊服務器中的倉庫)。
Docker每一個運行的實例由最上層的container和下面的多層鏡像構成。Docker使用Union FS(union filesystem)將這些不一樣鏡像整合在一塊兒。一般Union FS有兩個用途, 一方面能夠實現不借助LVM、RAID將多個disk掛到同一個目錄下;另外一個更經常使用的就是將一個只讀的分支和一個可寫的分支聯合在一塊兒,Live CD正是基於此方法能夠容許在鏡像不變的基礎上容許用戶在其上進行一些寫操做。 鏡像的每一層都有如下這些信息:
1.這一層的meta data,以JSON的形式存儲
2.image filessystem changeset
3.image ID,好比:74fe38d11401
鏡像有兩種構建方式:
1.啓動一個最基礎的容器,在裏面運行一些命令,像git同樣把這些命令commit,造成本身的鏡像。
2.引用一個base image,再加上一些須要的指令。這些指令存在一個文件中,叫Dockerfile。
如下是Dockerfile的例子,是剛纔提到的聊天軟件的鏡像的生成方式。
# 引用mhart/alpine-node這個鏡像 # Dockerfile中第一個命令必須是FROM命令 FROM mhart/alpine-node:base # 將Dockerfile所在文件夾中的內容添加到Docker鏡像中 # 第一個點指的是Dockerfile所在的目錄 # 第二個點指的是Docker鏡像中的當前目錄 ADD . . # 爲這個鏡像暴露3000端口 EXPOSE 3000 # 運行node命令。值得注意的是在構建鏡像的時候這個命令不會執行 # 而是在真正基於這個鏡像啓動了容器時纔會執行這個命令 CMD [「node」, 「index.js」]segmentfault

More Explanation
若是傳統方式作一個聊天軟件。首先底層有個Linux系統,上層有個node.js,再上面有source code。user經過3000端口鏈接。假設Google須要這個應用,那麼須要將整個程序package打包過去。最簡單的打包方式是從Linux系統到source code都打包。雖然最主要的部分是source code,可是不能只打包它。若是另外有用戶(Google 2)須要這個應用,仍是要把整個系統打包。 若是使用Docker,這兩個服務(service 1,service 2)的Linux,node.js是同樣的,可是它們的source code不一樣。若是將它們分層,好比Linux系統部分叫image 1, Node.js部分叫image 2,Service 1的source code叫image 3,Service 2的source code叫image 4。這樣能夠把image 1,2,3給Google1,而把image1,2,4給Google 2。image 1,2是能夠複用的。 若是image 1,2,3裏都有file 0。image3會使得image 1和2裏的file 0隱藏(如同覆蓋)。從上層往下層看,若是擁有相同文件名,下層文件隱藏。 Docker中下層的文件都是隻讀的,只在最上方有可讀寫層。應用能夠對可讀寫層進行修改。服務器

Namespace
Docker運用Linux系統裏的namespace(命名空間)技術實現最上層應用之間的分離。擁有相同namespace的進程擁有相同的資源。擁有不一樣namespace的進程擁有的資源相互獨立。每一個容器都有本身單獨的名字空間,運行在其中的應用都像是在獨立的操做系統中運行同樣。名字空間保證了容器之間彼此互不影響。網絡

Cgroups
Docker運用Cgroups(控制組)進行資源限制。它是 Linux 內核的一個特性,主要用來對共享資源進行隔離、限制、審計等。只有能控制分配到容器的資源,才能避免多個容器同時運行時對系統資源的競爭。控制組技術最先是由Google的程序員提出。架構

Docker Components
Docker採用了C/S架構,包括客戶端和服務端。 Docker daemon做爲服務端接受來自客戶的請求,並處理這些請求(建立、運行、分發容器)。 客戶端和服務端既能夠運行在一個機器上,也可經過socket或者RESTful API來進行通訊。Docker daemon通常在宿主主機後臺運行,等待接收來自客戶端的消息。 Docker客戶端則爲用戶提供一系列可執行命令,用戶用這些命令跟 Docker daemon交互。 Docker daemon包括兩部分:

  1. 一個輕量級服務器,接收來自客戶端的消息,爲用戶提供一系列可執行命令
  2. 一個engine,負責調度請求,是一個總入口,管理容器的生存週期

Docker registry是存儲鏡像的一個倉庫。它與daemon溝通,處理從客戶端發送來的鏡像相關的請求。可使用public的registry或者private的。 Docker在本地安裝時還有一個功能是graphdb。graphdb是一個基於SQLite的一個小數據庫。可以管理本地Docker鏡像和它們之間的關係。當建立新的container時,或是下載某個鏡像時,Docker會先查找原有的鏡像,複用可用資源。 Docker driver容許用戶定製Docker運行的環境。它包括三類:

  1. graph driver:存儲相關
  2. network driver:網絡相關
  3. exec driver:運行環境相關

一個container能夠沒有IP。在network driver裏一個選項設爲none,能夠實現。

RunC
runC是一個抽象層,它介於Docker driver和Linux kernel之間。運用它能夠調用不少linux內核的功能,包括namespace,cgroups,capabilities,filessystem access controls。

Open source
Docker不被任何運營商鎖定,不被任何公司壟斷。Docker項目已經加入了Linux基金會,聽從了 Apache 2.0協議,項目代碼在GitHub上進行維護。
轉載來自公衆號BitTiger

想要閱讀更多技術乾貨、行業洞察,歡迎關注網易雲信博客
瞭解網易雲信,來自網易核心架構的通訊與視頻雲服務。


網易雲信(NeteaseYunXin)是集網易18年IM以及音視頻技術打造的PaaS服務產品,來自網易核心技術架構的通訊與視頻雲服務,穩定易用且功能全面,致力於提供全球領先的技術能力和場景化解決方案。開發者經過集成客戶端SDK和雲端OPEN API,便可快速實現包含IM、音視頻通話、直播、點播、互動白板、短信等功能。

相關文章
相關標籤/搜索