深入淺出聊一聊Docker

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

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

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

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

*Hypervisor是一種虛擬化的技術
具體來說,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”]

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、音視頻通話、直播、點播、互動白板、短信等功能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章