Docker基礎(chǔ)(1)—— Docker基本概念
Docker基礎(chǔ)(2)—— Docker安裝及基礎(chǔ)操作
關(guān)于docker是什么以及docker的教程網(wǎng)上有很多資料豺妓,GitBook上的Docker教程是比較官方和全面的。以下我結(jié)合手冊的學(xué)習(xí)及在慕課網(wǎng)上的課程鞏固總結(jié)出的學(xué)習(xí)手冊。旨在清晰梳理整個上手流程驶沼。
一辣苏、前言
1成洗、什么是Docker
- Docker是世界領(lǐng)先的軟件容器化平臺
- Docker公司開發(fā)暗膜,開源,托管在github
- 跨平臺矢腻,支持Windows门驾、MacOS、Linux
Docker 使用 Google 公司推出的Go語言進(jìn)行開發(fā)實現(xiàn)多柑,基于 Linux 內(nèi)核的cgroup奶是,namespace,以及AUFS類的Union FS等技術(shù)竣灌,對進(jìn)程進(jìn)行封裝隔離聂沙,屬于操作系統(tǒng)層面的虛擬化技術(shù)。由于隔離的進(jìn)程獨立于宿主和其它的隔離的進(jìn)程初嘹,因此也稱其為容器及汉。
Docker 在容器的基礎(chǔ)上,進(jìn)行了進(jìn)一步的封裝屯烦,從文件系統(tǒng)坷随、網(wǎng)絡(luò)互聯(lián)到進(jìn)程隔離等等房铭,極大的簡化了容器的創(chuàng)建和維護(hù)。使得 Docker 技術(shù)比虛擬機技術(shù)更為輕便温眉、快捷缸匪。
下面的圖片比較了 Docker 和傳統(tǒng)虛擬化方式的不同之處。傳統(tǒng)虛擬機技術(shù)是虛擬出一套硬件后类溢,在其上運行一個完整操作系統(tǒng)凌蔬,在該系統(tǒng)上再運行所需應(yīng)用進(jìn)程;而容器內(nèi)的應(yīng)用進(jìn)程直接運行于宿主的內(nèi)核豌骏,容器內(nèi)沒有自己的內(nèi)核龟梦,而且也沒有進(jìn)行硬件虛擬。因此容器要比傳統(tǒng)虛擬機更為輕便窃躲。
通俗理解:
Docker是容器技術(shù)的代表,容器技術(shù)從本質(zhì)上講是將程序隔離钦睡、打包的技術(shù)蒂窒。Docker解決了軟件包裝的問題,理順了開發(fā)和運維的環(huán)境的差異荞怒,使得開發(fā)和運維能用同種語言來溝通洒琢。
什么是Docker?官方的解釋:Docker是一個開源的項目褐桌,可以用來將任何應(yīng)用以輕量級容器的形式來打包衰抑、發(fā)布和運行。
類比:可以粗糙地理解為輕量級的虛擬機荧嵌。它和虛擬機某種程度上完成同樣的任務(wù):就是把一個應(yīng)用程序放在一個獨立的環(huán)境里來運行呛踊。
Docker不是虛擬機!
Host_OS:宿主機
Hypervisor:虛擬層啦撮,虛擬出硬件
VM在虛擬層上安裝完全獨立的Guest OS谭网,在里面運行各種個樣的程序。每個虛擬化應(yīng)用程序不僅包括應(yīng)用程序(可能只有10 MB)赃春、必要的二進(jìn)制文件和庫愉择,還包括整個客戶操作系統(tǒng)(可能有10 GB)。
Docker在Docker Engine層上面運行各種程序织中,利用了Host OS里的NameSpace锥涕,ControlGroup等來做到將應(yīng)用程序分離。Docker Engine容器僅包含應(yīng)用程序及其依賴項狭吼。它在主機操作系統(tǒng)的用戶空間中作為獨立進(jìn)程運行层坠,與其他容器共享內(nèi)核。因此搏嗡,它享受了VM的資源隔離和分配好處窿春,但是更加便攜和高效拉一。
2、為什么要用Docker
3旧乞、基本概念
- 鏡像(Image)
- 容器(Container)
- 倉庫(Repository)
理解了這三個概念蔚润,就理解了 Docker 的整個生命周期。
3.1 鏡像
Docker 鏡像是一個特殊的文件系統(tǒng)尺栖,除了提供容器運行時所需的程序嫡纠、庫、資源延赌、配置等文件外除盏,還包含了一些為運行時準(zhǔn)備的一些配置參數(shù)(如匿名卷、環(huán)境變量挫以、用戶等)者蠕。鏡像不包含任何動態(tài)數(shù)據(jù),其內(nèi)容在構(gòu)建之后也不會被改變掐松。
分層存儲
鏡像只是一個虛擬的概念踱侣,其實際體現(xiàn)并非由一個文件組成,而是由一組文件系統(tǒng)組成大磺,或者說抡句,由多層文件系統(tǒng)聯(lián)合組成。
Union FS
聯(lián)合文件系統(tǒng)是(Union FS)是linux的存儲技術(shù)杠愧,也是Docker鏡像的存儲方式待榔。 它是分層的文件系統(tǒng),將不同目錄拉到同一個虛擬目錄下流济。下圖展示了Docker用Union FS 搭建的分層鏡像:(比如最下層是操作系統(tǒng)的引導(dǎo)锐锣,上一層是Linux操作系統(tǒng),再上一層是Tomcat袭灯,jdk刺下,再上一層是應(yīng)用代碼)
這些層是只讀的,加載完后這些文件會被看成是同一個目錄稽荧,相當(dāng)于只有一個文件系統(tǒng)橘茉。
我們可以通過docker info查看鏡像的一些信息,可以看到存儲驅(qū)動用的并不是Union FS 而是overlay2姨丈,overlay也是一個聯(lián)合文件系統(tǒng)畅卓,所以上述主要介紹聯(lián)合文件系統(tǒng)的概念,至于這些存儲驅(qū)動的演變過程和優(yōu)缺點蟋恬,可以閱讀http://dockone.io/article/1765翁潘。
鏡像構(gòu)建時,會一層層構(gòu)建歼争,前一層是后一層的基礎(chǔ)拜马。每一層構(gòu)建完就不會再發(fā)生改變渗勘,后一層上的任何改變只發(fā)生在自己這一層。(比如俩莽,刪除前一層文件的操作旺坠,實際不是真的刪除前一層的文件,而是僅在當(dāng)前層標(biāo)記為該文件已刪除扮超。在最終容器運行的時候取刃,雖然不會看到這個文件,但是實際上該文件會一直跟隨鏡像出刷。因此璧疗,在構(gòu)建鏡像的時候,需要額外小心馁龟,每一層盡量只包含該層需要添加的東西崩侠,任何額外的東西應(yīng)該在該層構(gòu)建結(jié)束前清理掉。)
分層存儲的特征還使得鏡像的復(fù)用屁柏、定制變的更為容易啦膜。甚至可以用之前構(gòu)建好的鏡像作為基礎(chǔ)層,然后進(jìn)一步添加新的層淌喻,以定制自己所需的內(nèi)容,構(gòu)建新的鏡像雀摘。
3.2 容器
鏡像(Image)和容器(Container)的關(guān)系裸删,就像是面向?qū)ο蟪绦蛟O(shè)計中的 類 和 實例 一樣,鏡像是靜態(tài)的定義阵赠,容器是鏡像運行時的實體涯塔。容器可以被創(chuàng)建、啟動清蚀、停止匕荸、刪除、暫停等枷邪。
容器的實質(zhì)是進(jìn)程榛搔,但與直接在宿主執(zhí)行的進(jìn)程不同,容器進(jìn)程運行于屬于自己的獨立的命名空間东揣。因此容器可以擁有自己的root文件系統(tǒng)践惑、自己的網(wǎng)絡(luò)配置、自己的進(jìn)程空間嘶卧,甚至自己的用戶 ID 空間尔觉。容器內(nèi)的進(jìn)程是運行在一個隔離的環(huán)境里,使用起來芥吟,就好像是在一個獨立于宿主的系統(tǒng)下操作一樣侦铜。這種特性使得容器封裝的應(yīng)用比直接在宿主運行更加安全专甩。也因為這種隔離的特性,很多人初學(xué) Docker 時常常會混淆容器和虛擬機钉稍。
前面講過鏡像使用的是分層存儲涤躲,容器也是如此。每一個容器運行時嫁盲,是以鏡像為基礎(chǔ)層篓叶,在其上創(chuàng)建一個當(dāng)前容器的存儲層,我們可以稱這個為容器運行時讀寫而準(zhǔn)備的存儲層為容器存儲層羞秤。
容器存儲層的生存周期和容器一樣缸托,容器消亡時,容器存儲層也隨之消亡瘾蛋。因此俐镐,任何保存于容器存儲層的信息都會隨容器刪除而丟失。
3.3 倉庫
鏡像構(gòu)建完成后哺哼,可以很容易的在當(dāng)前宿主機上運行佩抹,但是,如果需要在其它服務(wù)器上使用這個鏡像取董,我們就需要一個集中的存儲棍苹、分發(fā)鏡像的服務(wù),Docker Registry 就是這樣的服務(wù)茵汰。
一個 Docker Registry 中可以包含多個倉庫(Repository)枢里;每個倉庫可以包含多個標(biāo)簽(Tag);每個標(biāo)簽對應(yīng)一個鏡像蹂午。
通常栏豺,一個倉庫會包含同一個軟件不同版本的鏡像,而標(biāo)簽就常用于對應(yīng)該軟件的各個版本豆胸。我們可以通過<倉庫名>:<標(biāo)簽>的格式來指定具體是這個軟件哪個版本的鏡像奥洼。如果不給出標(biāo)簽,將以latest作為默認(rèn)標(biāo)簽晚胡。(以 Ubuntu 鏡像為例灵奖,ubuntu是倉庫的名字,其內(nèi)包含有不同的版本標(biāo)簽搬泥,如桑寨,14.04,16.04。我們可以通過ubuntu:14.04忿檩,或者ubuntu:16.04來具體指定所需哪個版本的鏡像尉尾。如果忽略了標(biāo)簽,比如ubuntu燥透,那將視為ubuntu:latest沙咏。)
倉庫名經(jīng)常以兩段式路徑形式出現(xiàn)辨图,比如huangbaoling/nginx-proxy,前者往往意味著 Docker Registry 多用戶環(huán)境下的用戶名肢藐,后者則往往是對應(yīng)的軟件名故河。但這并非絕對,取決于所使用的具體 Docker Registry 的軟件或服務(wù)吆豹。