深入浅出聊一聊Docker
網(wǎng)易云信IM私有化部分用到Docker技術(shù),今天我們就深入淺出來聊聊Docker
Docker是什么?
Docker是一個(gè)工具,能把應(yīng)用打包部署于container里,這里可以把container看做是一個(gè)簡(jiǎn)易版的 Linux 環(huán)境和運(yùn)行在其中的應(yīng)用程序,每個(gè)container運(yùn)行一個(gè)application。它誕生于 2013 年初,最初是 dotCloud公司內(nèi)部的一個(gè)業(yè)余項(xiàng)目,創(chuàng)始人是Solomon Hykes。
Docker自開源后受到廣泛的關(guān)注和討論,Redhat已經(jīng)在其 RHEL6.5 中明確支持Docker;Google也在其PaaS產(chǎn)品中廣泛應(yīng)用。Docker項(xiàng)目的目標(biāo)是實(shí)現(xiàn)輕量級(jí)的操作系統(tǒng)虛擬化解決方案。 現(xiàn)在Docker已經(jīng)從一個(gè)工具轉(zhuǎn)化成平臺(tái),小生態(tài)圈。
Docker的優(yōu)勢(shì)有哪些?
以前企業(yè)部署軟件會(huì)購(gòu)買真正的服務(wù)器,這種模式的資源利用率很低。后來出現(xiàn)了云端的虛擬服務(wù)器,比如AWS,提高了一定的資源利用率,但是不同階段的應(yīng)用環(huán)境可能不同。
Docker對(duì)這些有很大的優(yōu)化,比如: 1. Docker 容器可以實(shí)現(xiàn)秒級(jí)啟動(dòng) 2. 容器除了運(yùn)行其中應(yīng)用外,基本不消耗額外的系統(tǒng)資源,使得應(yīng)用的性能很高,系統(tǒng)的開銷很小。傳統(tǒng)虛擬機(jī)方式運(yùn)行10個(gè)不同的應(yīng)用就要起10個(gè)虛擬機(jī),而Docker只需要啟動(dòng)10個(gè)隔離的應(yīng)用即可。 下圖是傳統(tǒng)虛擬化方式和Docker的不同。Docker本質(zhì)上是一種虛擬化的技術(shù),不是虛擬機(jī)。Docker是在操作系統(tǒng)層面上實(shí)現(xiàn)虛擬化,直接復(fù)用本地主機(jī)的操作系統(tǒng),而傳統(tǒng)方式則是在硬件層面實(shí)現(xiàn)。在傳統(tǒng)模式下,Guest OS會(huì)占用大量空間,而且不同的應(yīng)用會(huì)需要不同的虛擬機(jī)。在Docker中只有一個(gè)OS,各種application運(yùn)行在一個(gè)OS上。
*Hypervisor是一種虛擬化的技術(shù)
具體來說,Docker的優(yōu)勢(shì)包括:
Play with Docker container
下載安裝完Docker后,可以嘗試使用以下命令來運(yùn)行一個(gè)聊天軟件。
docker run -d -p 3000:3000 unclebarney/chit-chat
這個(gè)命令的含義是啟動(dòng)Docker容器。-d表示在后臺(tái)啟動(dòng)。-p表示做端口的映射,把容器里的3000端口映射到宿主機(jī)上的3000。使用的鏡像為unclebarney/chit-chat。 這個(gè)命令有兩部分操作:
Docker image
Docker image(鏡像)是container的基礎(chǔ)。所有container都是從image構(gòu)建的。 Docker 運(yùn)行容器前需要本地存在對(duì)應(yīng)的鏡像,如果鏡像不存在本地,Docker 會(huì)從鏡像倉(cāng)庫(kù)下載(默認(rèn)是 Docker Hub 公共注冊(cè)服務(wù)器中的倉(cāng)庫(kù))。
Docker每個(gè)運(yùn)行的實(shí)例由最上層的container和下面的多層鏡像構(gòu)成。Docker使用Union FS(union filesystem)將這些不同鏡像整合在一起。通常Union FS有兩個(gè)用途, 一方面可以實(shí)現(xiàn)不借助LVM、RAID將多個(gè)disk掛到同一個(gè)目錄下;另一個(gè)更常用的就是將一個(gè)只讀的分支和一個(gè)可寫的分支聯(lián)合在一起,Live CD正是基于此方法可以允許在鏡像不變的基礎(chǔ)上允許用戶在其上進(jìn)行一些寫操作。 鏡像的每一層都有以下這些信息:
鏡像有兩種構(gòu)建方式:
以下是Dockerfile的例子,是剛才提到的聊天軟件的鏡像的生成方式。
# 引用mhart/alpine-node這個(gè)鏡像 # Dockerfile中第一個(gè)命令必須是FROM命令 FROM mhart/alpine-node:base # 將Dockerfile所在文件夾中的內(nèi)容添加到Docker鏡像中 # 第一個(gè)點(diǎn)指的是Dockerfile所在的目錄 # 第二個(gè)點(diǎn)指的是Docker鏡像中的當(dāng)前目錄 ADD . . # 為這個(gè)鏡像暴露3000端口 EXPOSE 3000 # 運(yùn)行node命令。值得注意的是在構(gòu)建鏡像的時(shí)候這個(gè)命令不會(huì)執(zhí)行 # 而是在真正基于這個(gè)鏡像啟動(dòng)了容器時(shí)才會(huì)執(zhí)行這個(gè)命令 CMD [“node”, “index.js”]
More Explanation
如果傳統(tǒng)方式做一個(gè)聊天軟件。首先底層有個(gè)Linux系統(tǒng),上層有個(gè)node.js,再上面有source code。user通過3000端口連接。假設(shè)Google需要這個(gè)應(yīng)用,那么需要將整個(gè)程序package打包過去。最簡(jiǎn)單的打包方式是從Linux系統(tǒng)到source code都打包。雖然最主要的部分是source code,但是不能只打包它。如果另外有用戶(Google 2)需要這個(gè)應(yīng)用,還是要把整個(gè)系統(tǒng)打包。 如果使用Docker,這兩個(gè)服務(wù)(service 1,service 2)的Linux,node.js是一樣的,但是它們的source code不同。如果將它們分層,比如Linux系統(tǒng)部分叫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是可以復(fù)用的。 如果image 1,2,3里都有file 0。image3會(huì)使得image 1和2里的file 0隱藏(如同覆蓋)。從上層往下層看,如果擁有相同文件名,下層文件隱藏。 Docker中下層的文件都是只讀的,只在最上方有可讀寫層。應(yīng)用可以對(duì)可讀寫層進(jìn)行修改。
Namespace
Docker運(yùn)用Linux系統(tǒng)里的namespace(命名空間)技術(shù)實(shí)現(xiàn)最上層應(yīng)用之間的分離。擁有相同namespace的進(jìn)程擁有相同的資源。擁有不同namespace的進(jìn)程擁有的資源相互獨(dú)立。每個(gè)容器都有自己?jiǎn)为?dú)的名字空間,運(yùn)行在其中的應(yīng)用都像是在獨(dú)立的操作系統(tǒng)中運(yùn)行一樣。名字空間保證了容器之間彼此互不影響。
Cgroups
Docker運(yùn)用Cgroups(控制組)進(jìn)行資源限制。它是 Linux 內(nèi)核的一個(gè)特性,主要用來對(duì)共享資源進(jìn)行隔離、限制、審計(jì)等。只有能控制分配到容器的資源,才能避免多個(gè)容器同時(shí)運(yùn)行時(shí)對(duì)系統(tǒng)資源的競(jìng)爭(zhēng)。控制組技術(shù)最早是由Google的程序員提出。
Docker Components
Docker采用了C/S架構(gòu),包括客戶端和服務(wù)端。 Docker daemon作為服務(wù)端接受來自客戶的請(qǐng)求,并處理這些請(qǐng)求(創(chuàng)建、運(yùn)行、分發(fā)容器)。 客戶端和服務(wù)端既可以運(yùn)行在一個(gè)機(jī)器上,也可通過socket或者RESTful API來進(jìn)行通信。Docker daemon一般在宿主主機(jī)后臺(tái)運(yùn)行,等待接收來自客戶端的消息。 Docker客戶端則為用戶提供一系列可執(zhí)行命令,用戶用這些命令跟 Docker daemon交互。 Docker daemon包括兩部分:
Docker registry是存儲(chǔ)鏡像的一個(gè)倉(cāng)庫(kù)。它與daemon溝通,處理從客戶端發(fā)送來的鏡像相關(guān)的請(qǐng)求。可以使用public的registry或者private的。 Docker在本地安裝時(shí)還有一個(gè)功能是graphdb。graphdb是一個(gè)基于SQLite的一個(gè)小數(shù)據(jù)庫(kù)。能夠管理本地Docker鏡像和它們之間的關(guān)系。當(dāng)創(chuàng)建新的container時(shí),或是下載某個(gè)鏡像時(shí),Docker會(huì)先查找原有的鏡像,復(fù)用可用資源。 Docker driver允許用戶定制Docker運(yùn)行的環(huán)境。它包括三類:
一個(gè)container可以沒有IP。在network driver里一個(gè)選項(xiàng)設(shè)為none,可以實(shí)現(xiàn)。
RunC
runC是一個(gè)抽象層,它介于Docker driver和Linux kernel之間。運(yùn)用它可以調(diào)用很多l(xiāng)inux內(nèi)核的功能,包括namespace,cgroups,capabilities,filessystem access controls。
Open source
Docker不被任何運(yùn)營(yíng)商鎖定,不被任何公司壟斷。Docker項(xiàng)目已經(jīng)加入了Linux基金會(huì),遵從了 Apache 2.0協(xié)議,項(xiàng)目代碼在GitHub上進(jìn)行維護(hù)。
轉(zhuǎn)載來自公眾號(hào)BitTiger
?
想要技術(shù)干貨、行業(yè)洞察,歡迎關(guān)注網(wǎng)易云信博客。
了解網(wǎng)易云信,來自網(wǎng)易核心架構(gòu)的通信與視頻云服務(wù)。
網(wǎng)易云信(NeteaseYunXin)是集網(wǎng)易18年IM以及音視頻技術(shù)打造的PaaS服務(wù)產(chǎn)品,來自網(wǎng)易核心技術(shù)架構(gòu)的通信與視頻云服務(wù),穩(wěn)定易用且功能全面,致力于提供全球領(lǐng)先的技術(shù)能力和場(chǎng)景化解決方案。開發(fā)者通過集成客戶端SDK和云端OPEN API,即可快速實(shí)現(xiàn)包含IM、音視頻通話、直播、點(diǎn)播、互動(dòng)白板、短信等功能。
總結(jié)
以上是生活随笔為你收集整理的深入浅出聊一聊Docker的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 0122互联网新闻 | 知乎短视频“即影
- 下一篇: 0123互联网新闻 | 在线教育机构掌门