docker開發(fā)技術(shù)棧
Go/Swarm/Compose/Machine/mesos/k8s/CI/DI...
Docker是什么兢仰?
1.Q:為什么會(huì)有Docker出現(xiàn)?
一款產(chǎn)品從開發(fā)到上線,從操作系統(tǒng)鲤妥,到運(yùn)行環(huán)境咸这,再到應(yīng)用配置夷恍。作為開發(fā)+運(yùn)維之間的協(xié)作我們需要關(guān)心很多東西,特別是各種版本的迭代之后媳维,不同版本環(huán)境的兼容酿雪,對(duì)運(yùn)維人員都是考驗(yàn)遏暴。
Docker對(duì)此給出了一個(gè)標(biāo)準(zhǔn)化的解決方案。
環(huán)境配置如此麻煩指黎,換一臺(tái)機(jī)器朋凉,就要重來一次,費(fèi)時(shí)費(fèi)力醋安。很多人想到杂彭,能不能從根本上解決問題,軟件可以帶環(huán)境安裝茬故?也就是說盖灸,安裝的時(shí)候,把原始環(huán)境一摸一樣的復(fù)制過來磺芭。開發(fā)人員利用Docker可以消除協(xié)作編碼時(shí)“在我的機(jī)器上可以正常工作”的問題。
從“僅提交代碼”到“提交代碼和整套環(huán)境”醉箕。
2.Docker的理念
Docker是基于Go語言實(shí)現(xiàn)的云開源項(xiàng)目钾腺。
Docker的主要目標(biāo)是“Build, Ship and Run Any App, Anywhere”,也就是通過對(duì)應(yīng)用組件的封裝讥裤、分發(fā)放棒、部署、運(yùn)行等生命周期的管理己英,使用戶的App(可以是一個(gè)Web應(yīng)用貨數(shù)據(jù)庫(kù)應(yīng)用等等)及其運(yùn)行環(huán)境能夠做到“一次封裝间螟,到處運(yùn)行”。
Linux容器技術(shù)的出現(xiàn)就解決了這樣一個(gè)問題损肛,而Docker就是在它的基礎(chǔ)上發(fā)展過來的厢破。將應(yīng)用運(yùn)行在Docker容器上面,而Docker容器在任何操作系統(tǒng)上都是一致的治拿,這就實(shí)現(xiàn)了跨平臺(tái)摩泪、跨服務(wù)器,只需要一次配置好環(huán)境劫谅,換到別的機(jī)器上就可以一鍵部署好见坑,大大簡(jiǎn)化了操作。
3.Docker是什么捏检?(A:容器)
解決了運(yùn)行環(huán)境和配置問題的軟件容器荞驴,方便做持續(xù)集成并有助于整體發(fā)布的容器虛擬化技術(shù)。
Docker能干什么贯城?
1.虛擬機(jī)
帶環(huán)境(軟件&硬件)安裝的一種解決方案熊楼,它可以在一種操作系統(tǒng)里面運(yùn)行另一種操作系統(tǒng)。對(duì)于底層系統(tǒng)來說冤狡,虛擬機(jī)就是一個(gè)普通文件孙蒙,不需要了就刪掉项棠,對(duì)其他部分毫無影響。
2.虛擬機(jī)的缺點(diǎn)
1.資源占用多挎峦;2.冗余步驟多香追;3.啟動(dòng)慢。
3.Linux容器(Linux Containers坦胶,縮寫為L(zhǎng)XC)
由于虛擬機(jī)存在一些缺點(diǎn)透典,Linux發(fā)展出的另一種虛擬化技術(shù)。
Linux容器不是模擬一個(gè)完整的操作系統(tǒng)顿苇,而是對(duì)進(jìn)程(應(yīng)用)進(jìn)行隔離峭咒。有了容器,就可以將軟件運(yùn)行所需的所有資源打包到一個(gè)隔離的容器中纪岁。容器與虛擬機(jī)不同凑队,不需要捆綁一整套操作系統(tǒng),只需要軟件工作所需的庫(kù)資源和設(shè)置幔翰。
系統(tǒng)因此而變得高效輕量漩氨,并保證部署在任何環(huán)境中的軟件都能始終如一地運(yùn)行。
4.傳統(tǒng)虛擬化方式和Docker的區(qū)別:
1.傳統(tǒng)虛擬機(jī)技術(shù)是虛擬出一套硬件后遗增,在其上運(yùn)行一個(gè)完整操作系統(tǒng)叫惊,在該系統(tǒng)上再運(yùn)行所需應(yīng)用進(jìn)程。
2.容器內(nèi)的應(yīng)用進(jìn)程直接運(yùn)行于宿主的內(nèi)核做修,容器內(nèi)沒有自己的內(nèi)核霍狰,而且也沒有進(jìn)行硬件虛擬。因此容器要比傳統(tǒng)虛擬機(jī)更為輕便饰及。
3.每個(gè)容器之間互相隔離蔗坯,每個(gè)容器有自己的文件系統(tǒng),容器之間進(jìn)程不會(huì)互相影響旋炒,能區(qū)分計(jì)算資源(耦合低)步悠。虛擬機(jī)為minute級(jí)別,Docker為second級(jí)別瘫镇。
5.開發(fā)/運(yùn)維(DevOps)
Development Operations鼎兽,即開發(fā)自己運(yùn)維。一次構(gòu)建铣除,隨處運(yùn)行谚咬。
6.企業(yè)級(jí)
新浪、美團(tuán)尚粘、蘑菇街......
PS:Docker的實(shí)質(zhì)可以看作一個(gè)精簡(jiǎn)版的Linux系統(tǒng)择卦,僅有其內(nèi)核。(eg:CentOS完整鏡像為4GB,基于容器的虛擬化秉继,其基礎(chǔ)鏡像僅170MB左右祈噪。)
- 輕量、秒級(jí)的快速啟動(dòng)速度尚辑。
- 簡(jiǎn)單辑鲤、易用、活躍的社區(qū)杠茬。
- 標(biāo)準(zhǔn)統(tǒng)一的打包/部署/運(yùn)行方案月褥。
- 鏡像支持增量分發(fā)、易于部署瓢喉。
- 易于構(gòu)建宁赤,良好的REST API,也很適合自動(dòng)化測(cè)試和持續(xù)集成栓票。
- 性能决左,尤其是內(nèi)存和IO的開銷。
7.下載&文檔
英文官網(wǎng):https://www.docker.com/
中文官網(wǎng):https://www.docker-cn.com/
Docker倉(cāng)庫(kù)(Docker Hub走贪,即Docker的鏡像倉(cāng)庫(kù)哆窿,類比Github、Maven倉(cāng)庫(kù)):https://hub.docker.com/
Docker的基本組成
1.Docker的架構(gòu)圖
Client: docker build/docker pull/docker run(類比Git Client)
Docker Host:Containers/Images(鏡像)/Docker daemon
Registry(鏡像倉(cāng)庫(kù))
2.Docker三要素
1. 鏡像image
就是一個(gè)只讀的模版厉斟。鏡像可以用來創(chuàng)建Docker容器,一個(gè)鏡像可以創(chuàng)建很多容器强衡。
2.容器container
Docker是利用容器獨(dú)立運(yùn)行的一個(gè)或一組應(yīng)用擦秽。容器是用鏡像創(chuàng)建的運(yùn)行實(shí)例。(類比java漩勤,容器即對(duì)象感挥,鏡像即類。)
它可以被啟動(dòng)越败、開始触幼、停止、刪除究飞。每個(gè)容器都是相互隔離的置谦、保證安全的平臺(tái)。可以把容器看作是一個(gè)簡(jiǎn)易版的Linux環(huán)境(包括root用戶權(quán)限亿傅、進(jìn)程空間媒峡、用戶空間和網(wǎng)絡(luò)空間等)和運(yùn)行在其中的應(yīng)用程序。
容器的定義和鏡像幾乎一摸一樣葵擎,也是一堆層的統(tǒng)一視角谅阿,唯一的區(qū)別在于容器的最上層是可讀可寫的。
3.倉(cāng)庫(kù)repository
集中存放鏡像文件的場(chǎng)所。
倉(cāng)庫(kù)(Repository)和倉(cāng)庫(kù)注冊(cè)服務(wù)器(Registry)是有區(qū)別的签餐。Registry上往往存放著多個(gè)Repository寓涨,每個(gè)Repository中又包含了多個(gè)鏡像,每個(gè)鏡像有不同的標(biāo)簽(Tag氯檐,類似版本號(hào))戒良。
倉(cāng)庫(kù)分為公開倉(cāng)庫(kù)(Public)和私有倉(cāng)庫(kù)(Private)兩種形式。最大的公開倉(cāng)庫(kù)是Docker Hub男摧,存放了數(shù)量龐大的鏡像供用戶下載蔬墩,國(guó)內(nèi)的公開倉(cāng)庫(kù)包括阿里云、網(wǎng)易云等耗拓。
3.小結(jié)
需要正確的理解倉(cāng)庫(kù)/鏡像/容器這幾個(gè)概念拇颅。
Docker本身是一個(gè)容器運(yùn)行載體或稱之為管理引擎。我們把應(yīng)用程序和配置依賴打包好形成一個(gè)可交付的運(yùn)行環(huán)境乔询,這個(gè)打包好的運(yùn)行環(huán)境就似乎image鏡像文件樟插。只有通過這個(gè)鏡像文件才能生成Docker容器。image文件可以看作是容器的模板竿刁。Docker根據(jù)image文件生成容器的實(shí)例黄锤。同一個(gè)image文件,可以生成多個(gè)同時(shí)運(yùn)行的容器實(shí)例食拜。
image文件生成的容器實(shí)例鸵熟,本身也是一個(gè)文件,稱為鏡像文件负甸。
一個(gè)容器運(yùn)行一種服務(wù)流强,當(dāng)我們需要的時(shí)候,就可以通過Docker客戶端創(chuàng)建一個(gè)對(duì)應(yīng)的運(yùn)行實(shí)例呻待,也就是我們的容器打月。
倉(cāng)儲(chǔ),就是放了一堆鏡像的地方蚕捉,我們可以把鏡像發(fā)布到倉(cāng)儲(chǔ)中奏篙,需要的時(shí)候從倉(cāng)儲(chǔ)中拉下來就可以了。