Docker是一個開放源代碼軟件項目,讓應(yīng)用程序布署在軟件容器下的工作可以自動化進(jìn)行,借此在Linux操作系統(tǒng)上郊楣,提供一個額外的軟件抽象層,以及操作系統(tǒng)層虛擬化的自動管理機(jī)制瓤荔。 Docker利用Linux核心中的資源分脫機(jī)制净蚤,例如
cgroups
,以及Linux核心名字空間输硝,來創(chuàng)建獨立的軟件容器今瀑。 維基百科
1.什么是Docker?
Docker 是世界領(lǐng)先的軟件容器平臺点把。開發(fā)人員利用 Docker 可以消除協(xié)作編碼時“在我的機(jī)器上可正常工作”的問題橘荠。運維人員利用 Docker 可以在隔離容器中并行運行和管理應(yīng)用,獲得更好的計算密度郎逃。企業(yè)利用 Docker 可以構(gòu)建敏捷的軟件交付管道哥童,以更快的速度、更高的安全性和可靠的信譽為 Linux 和 Windows Server 應(yīng)用發(fā)布新功能褒翰。
Docker 屬于 Linux 容器的一種封裝贮懈,提供簡單易用的容器使用接口。它是目前最流行的 Linux 容器解決方案优训。Docker 將應(yīng)用程序與該程序的依賴错邦,打包在一個文件里面。運行這個文件型宙,就會生成一個虛擬容器撬呢。程序在這個虛擬容器里運行,就好像在真實的物理機(jī)上運行一樣妆兑。有了 Docker魂拦,就不用擔(dān)心環(huán)境問題。
總體來說搁嗓,Docker 的接口相當(dāng)簡單芯勘,用戶可以方便地創(chuàng)建和使用容器,把自己的應(yīng)用放入容器腺逛。容器還可以進(jìn)行版本管理荷愕、復(fù)制、分享、修改安疗,就像管理普通的代碼一樣抛杨。
Docker 最初是 dotCloud 公司創(chuàng)始人 Solomon Hykes 在法國期間發(fā)起的一個公司內(nèi)部項目,它是基于 dotCloud 公司多年云服務(wù)技術(shù)的一次革新荐类,并于 2013 年 3 月以 Apache 2.0 授權(quán)協(xié)議開源怖现,主要項目代碼在 GitHub 上進(jìn)行維護(hù)。Docker 項目后來還加入了 Linux 基金會玉罐,并成立推動 開放容器聯(lián)盟(OCI)屈嗤。
2.為什么要使用Docker?
Docker極大的解決了環(huán)境配置問題吊输,真正實現(xiàn)了“一次配置饶号,到處運行”的效果。之前我在做服務(wù)器的集群的時候季蚂,通常是手動的在每臺機(jī)器上配置環(huán)境茫船,但是這個過程中容易出錯,很難發(fā)現(xiàn)錯誤的來源癣蟋,又需要一步步檢驗錯誤的來源透硝,這樣浪費了很多時間。現(xiàn)在有了Docker才算真正解決了這個問題疯搅。
3.Docker的優(yōu)點
Docker在開發(fā)和運維過程中濒生,具有如下幾個方面的優(yōu)勢:
- 1、更快速的交付和部署幔欧。使用Docker罪治,開發(fā)人員可以使用鏡像來快速構(gòu)建一套標(biāo)準(zhǔn)的開發(fā)環(huán)境;開發(fā)完成之后礁蔗,測試人員和運維人員可以直接使用完全相同的環(huán)境來部署代碼觉义。
- 2、更高效的資源利用浴井。Docker容器不需要額外的虛擬化管理程序(
Virtual Machine Manager晒骇,VMM
,以及Hypervisor
)支持磺浙,它是內(nèi)核級的虛擬化洪囤,可以實現(xiàn)更高的性能,同時對資源的額外需求很低撕氧。 - 3瘤缩、更輕松的遷移和擴(kuò)展。Docker容器幾乎可以在任意平臺上運行伦泥,包括物理機(jī)剥啤、虛擬機(jī)锦溪、公有云、私有云府怯、個人電腦刻诊、服務(wù)器等,同時支持主流的操作系統(tǒng)發(fā)行版富腊。
- 4坏逢、更簡單的更新管理域帐。使用
Dockerfile
赘被,只需要小小的配置修改,就可以替代以往大量的更新工作肖揣。并且所有修改都以增量的方式被分發(fā)和更新民假,從而實現(xiàn)自動化并且高效的同期管理。
4.Docker vs VM
作為一種輕量級的虛擬化方式龙优,Docker在運行應(yīng)用上與傳統(tǒng)的虛擬機(jī)方式相比具有顯著的優(yōu)勢:
- 1羊异、Docker容器很快,啟動和停止可以在秒級實現(xiàn)彤断,而傳統(tǒng)的虛擬機(jī)方式需要數(shù)分鐘野舶;
- 2、Docker容器對系統(tǒng)資源需求很少宰衙,一臺主機(jī)上可以同時運行數(shù)千個Docker容器平道;
- 3、Docker通過類似Git設(shè)計理念的操作方便用戶獲取供炼、分發(fā)和更新應(yīng)用鏡像一屋,存儲復(fù)用,增量更新袋哼;
- 4冀墨、Docker通過
Dockerfile
支持靈活的自動化創(chuàng)建和部署機(jī)制,提供工作效率涛贯,使流程標(biāo)準(zhǔn)化诽嘉。
5.Docker的工作機(jī)制
Docker Engine
一個是CS架構(gòu),主要有兩個概念:
- 1弟翘、
Docker daemon
:運行在宿主機(jī)上虫腋,Docker守護(hù)進(jìn)程,用戶通過Docker Client
(Docker命令)與Docker daemon
交互衅胀。 - 2岔乔、
Docker Client
:Docker命令行工具,是用戶使用Docker的主要方式滚躯,Docker Client
與Docker daemon
通信并將結(jié)果返回給用戶雏门,Docker Client
也可以通過socket
或者RESTful API
訪問遠(yuǎn)程的Docker daemon
嘿歌。
了解了Docker的基本組成,在來了解一下Docker的三大核心概念:
- 1茁影、
Docker Image
:Docker鏡像類似于虛擬機(jī)鏡像宙帝,可以將它理解為一個只讀的模板。例如募闲,一個鏡像可以包含一個基本的操作系統(tǒng)環(huán)境步脓,里面僅安裝了Apache應(yīng)用程序。鏡像用來創(chuàng)建Container
浩螺,一個鏡像可以運行多個Container
靴患;鏡像可以通過Dockerfile
創(chuàng)建,也可以從Docker Hub/Registry
上下載要出。 - 2鸳君、
Docker Container
:Docker類似于一個輕量級的沙箱,Docker利用容器來運行和隔離應(yīng)用患蹂。容器是從鏡像創(chuàng)建的應(yīng)用運行實例或颊,容器時一個隔離的環(huán)境,多個容器之間不會相互影響传于,保證容器中的程序運行在一個相對安全的環(huán)境中囱挑。(可以把容器看做是一個簡易版的Linux系統(tǒng)環(huán)境,包括root用戶權(quán)限沼溜、進(jìn)程空間平挑、用戶空間和網(wǎng)絡(luò)空間等,以及運行在其中的應(yīng)用程序打包而成的盒子) - 3盛末、
Docker Hub/Registry
:共享和管理Docker鏡像弹惦,用戶可以上傳或者下載上面的鏡像。
鏡像自身是只讀的悄但。容器從鏡像啟動的時候棠隐,會在鏡像的最上層創(chuàng)建一個可寫層。
6.Docker底層的技術(shù)依賴
Docker使用Go編寫的檐嚣,它利用了Linux內(nèi)核的幾個核心技術(shù)來提供其功能助泽。
1.Namespaces
Docker使用一種稱為namespaces
提供隔離工作空間的技術(shù),這種技術(shù)稱為容器嚎京,當(dāng)您運行容器時嗡贺,Docker會為該容器創(chuàng)建一組namespaces
。這些命名空間提供了一層隔離鞍帝。容器的每個方面都在單獨的命名空間中運行诫睬,其訪問權(quán)限僅僅限于該命名空間。
2.Control groups
Linux上的Docker Engine
還依賴于另一種稱為控制組 (cgroups
)的技術(shù)帕涌。cgroup
將應(yīng)用程序限制為特定的一組資源摄凡⌒眨控制組允許Docker Engine
將可用的硬件資源共享給容器,并可選擇強(qiáng)制執(zhí)行限制和約束亲澡。例如钦扭,您可以限制特定容器的可用內(nèi)存。(用來分配資源床绪,資源分配客情、優(yōu)先級設(shè)定、資源計量癞己、資源控制)膀斋。
3.Union file systems
聯(lián)合文件系統(tǒng)或UnionFS
是通過創(chuàng)建層來操作的文件系統(tǒng),使它們非常輕量和快速末秃。Docker Engine
使用UnionFS
為容器提供構(gòu)建塊概页。Docker Engine
可以使用多種UnionFS
變體籽御,包括AUFS
练慕,btrfs
,vfs
和DeviceMapper
技掏。
4.Container format
Docker Engine
將命名空間铃将,控制組和UnionFS
組合到一個稱為容器格式的包裝器中。默認(rèn)的容器格式是libcontainer
哑梳。將來劲阎,Docker可以通過與BSD Jails
或Solaris Zones
等技術(shù)集成來支持其他容器格式。
參考資料
http://www.ityouknow.com/docker/2018/03/07/docker-introduction.html
http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html
https://docs.docker.com/engine/docker-overview/#the-underlying-technology