1.容器與管理程序虛擬化
? ?? ?容器與管理程序虛擬化(Hypervisor Virtualization, HV)不同,HV通過中間層將一臺(tái)或多臺(tái)獨(dú)立的機(jī)器虛擬運(yùn)行于物理硬件之上,而容器則是直接運(yùn)行在操作系統(tǒng)內(nèi)核之上的用戶空間,因此被稱為"操作系統(tǒng)級虛擬化",可以讓多個(gè)獨(dú)立用戶空間運(yùn)行在同一臺(tái)宿主機(jī)上。
容器技術(shù)的缺點(diǎn):
? ?? ?容器僅能運(yùn)行與底層宿主機(jī)相同或相似的操作系統(tǒng),不夠靈活。
容器技術(shù)的應(yīng)用場景:
? ?? ?容器在超大規(guī)模的多租戶服務(wù)部署、輕量級沙盒以及對安全要求不太高的隔離環(huán)境中得到廣泛應(yīng)用。
2.Docker簡介
? ?? ?Docker能夠把開發(fā)的應(yīng)用程序自動(dòng)部署到容器的開源引擎,是一個(gè)客戶端/服務(wù)器(C/S)架構(gòu)的程序,Docker的核心組件有:
① Docker客戶端和服務(wù)器,即Docker引擎:
? ?? ?Docker客戶端只需要向Docker服務(wù)器或守護(hù)進(jìn)程發(fā)出請求,服務(wù)器或守護(hù)進(jìn)程將完成所有工作并返回結(jié)果。它提供了一個(gè)命令行工具docker以及一整天RESTFUL API來與守護(hù)進(jìn)程交互。

② Docker鏡像:
? ?? ?鏡像是構(gòu)建Docker世界的基石,用戶基于鏡像來運(yùn)行自己的容器,是Docker生命周期中的構(gòu)建和打包階段。鏡像體積很小,非?!北銛y“,易于分享、存儲(chǔ)和更新。
③ Registry:
? ?? ?Docker用Registry來保存用戶構(gòu)建的鏡像,其分為公有和私有兩種。公共Registry由Docker公司運(yùn)營,叫做DockerHub,用戶可注冊賬號并在其上分享并保存自己的鏡像,同時(shí)支持保存自己的私有鏡像。
④ Docker容器:
? ?? ?Docker可以幫用戶構(gòu)建和部署容器,其基于鏡像啟動(dòng),用戶只需要把應(yīng)用程序或服務(wù)打包放進(jìn)容器即可。容器是Docker生命周期中的啟動(dòng)或執(zhí)行階段,總的來說,Docker容器就是:一個(gè)鏡像格式、一系列標(biāo)準(zhǔn)操作、一個(gè)執(zhí)行環(huán)境。
3. Docker基礎(chǔ)指令
① docker run [options] ubuntu16.04 bin/bash :通過Docker二進(jìn)制執(zhí)行文件docker和run指令結(jié)合創(chuàng)建并啟動(dòng)一個(gè)容器,指定鏡像為ubuntu16.04,同時(shí)在容器內(nèi)執(zhí)行bin/bash指令啟動(dòng)shell。可通過下述兩個(gè)命令行參數(shù)新容器才能提供一個(gè)交互式shell:
-
-i:允許你對容器內(nèi)的標(biāo)準(zhǔn)輸入(STDIN)進(jìn)行交互; -
-t:在新容器內(nèi)指定一個(gè)偽終端或終端; -
-d:后臺(tái)運(yùn)行容器,創(chuàng)建守護(hù)式容器,并返回容器ID; -
--name:容器命名,如docker run --name container ubuntu16.04 bin/bash:創(chuàng)建一個(gè)名為container的容器,合法容器名稱只能包含以下字符:大小寫字母a-z and A-Z、數(shù)字0-9、下劃線、原點(diǎn)、橫線([a-zA-Z0-9_.-]); -
-p:指定容器運(yùn)行時(shí)公開的網(wǎng)絡(luò)端口號,可以通過主機(jī)端口:宿主端口指定將主機(jī)某端口映射到容器中; -
--restart:若容器因某種錯(cuò)誤而停止運(yùn)行,可以通過此標(biāo)準(zhǔn)讓Docker自動(dòng)重啟該容器。它會(huì)檢查容器的退出代碼,以此判斷是否重啟容器:-
--restart=always:總是自動(dòng)重啟該容器; -
--restart=on-failure:僅當(dāng)容器退出代碼非0時(shí)自動(dòng)重啟,同時(shí)支持設(shè)置重啟次數(shù)--restart=on-failure:5;
-
注意: 若本地不存在ubuntu16.04鏡像,將會(huì)連接官方的Docker Hub Registry并查看是否有該鏡像,若有則下載到本地。
② 啟停操作
docker stop container:停止名為container的容器(也可用容器ID) ;
docker start container:啟動(dòng)已被停止的容器container;
docker restart container:重新啟動(dòng)容器container;
③ docker ps [options]:列出正在運(yùn)行的容器;
-
-a:顯示所有的容器,包括未運(yùn)行的; -
-l:顯示最近一個(gè)創(chuàng)建的容器; -
-n:列出最近創(chuàng)建的n個(gè)容器;
④docker attach container:容器附著,根據(jù)容器名或容器ID重新附著到此容器會(huì)話上;
⑤docker logs [options]:獲取容器日志;
-
-f:跟蹤日志輸出; -
--since:顯示從某時(shí)刻開始的所有日志; -
-t:顯示時(shí)間戳; -
-tail:僅列出最新N條容器數(shù)據(jù);
⑥性能監(jiān)控
docker top container [ps options]:查看容器container中運(yùn)行的進(jìn)程信息,同時(shí)支持ps參數(shù);
docker stats container:查看容器container的資源消耗,如CPU、內(nèi)存、網(wǎng)絡(luò)I/O及磁盤存儲(chǔ)I/O等性能指標(biāo);
⑦docker exec [options] container command:在運(yùn)行中的容器container上執(zhí)行特定的command命令;
-
-d:運(yùn)行一個(gè)后臺(tái)進(jìn)程; -
-i:即使沒有附加也保持STDIN 打開; -
-t:分配一個(gè)偽終端;
⑧docker inspect container:獲取容器/鏡像container的配置信息,包括名稱、命令、網(wǎng)絡(luò)配置等;
⑨刪除容器和鏡像
docker rm:刪除容器;
docker rmi:刪除本地鏡像;
⑩構(gòu)建鏡像
docker build:使用Dockerfile創(chuàng)建鏡像;
4.Docker鏡像
? ?? ?Docker鏡像是由文件系統(tǒng)疊加而成,最底端是引導(dǎo)文件系統(tǒng)bootfs,當(dāng)容器啟動(dòng)后將被移到內(nèi)存中,而bootfs則被卸載。Docker鏡像的第二層就是root文件系統(tǒng)rootfs,它位于bootfs之上,由一個(gè)or多個(gè)操作系統(tǒng)組成。
? ?? ?在傳統(tǒng)的Linux引導(dǎo)過程中,root文件系統(tǒng)先以只讀方式加載,當(dāng)引導(dǎo)結(jié)束并完成完整性檢查后,被切換成讀寫模式。但是在Docker中,root文件系統(tǒng)永遠(yuǎn)處于只讀狀態(tài),且Docker使用聯(lián)合加載技術(shù)(一次加載多個(gè)文件系統(tǒng),而對外僅可見到一個(gè)文件系統(tǒng))在root文件系統(tǒng)層上加載更多的只讀文件系統(tǒng)。聯(lián)合加載將各文件系統(tǒng)疊加,形成一個(gè)包含所有底層文件和目錄的終極文件系統(tǒng)。

? ?? ?Docker將上述只讀文件系統(tǒng)稱為鏡像,一個(gè)鏡像可疊放在另一個(gè)鏡像的頂部,位于下面的鏡像稱為父鏡像,最下面的稱為基礎(chǔ)鏡像。最后,當(dāng)從一個(gè)鏡像啟動(dòng)容器時(shí),Docker會(huì)在該鏡像的最頂層加載一個(gè)讀寫文件系統(tǒng),在此執(zhí)行程序。
寫時(shí)復(fù)制(copy on write)機(jī)制
? ?? ?當(dāng)Docker第一次啟動(dòng)一個(gè)容器時(shí),初始的讀寫層為空,當(dāng)文件系統(tǒng)發(fā)生變化時(shí),這些變化都會(huì)被應(yīng)用到這一層。比如,若修改一個(gè)文件,首先是將其從只讀層復(fù)制到讀寫層,在保留只讀版本的情況下完成修改。
構(gòu)建緩存
? ?? ?Docker在構(gòu)建過程中會(huì)將每一步結(jié)果提交為鏡像,并把構(gòu)建所創(chuàng)建的鏡像作為緩存,若構(gòu)建過程中某一步發(fā)生了錯(cuò)誤,新的構(gòu)建將以當(dāng)前緩存的鏡像作為開始點(diǎn)??梢酝ㄟ^使用docker build的--no-cache標(biāo)志在構(gòu)建過程中不使用緩存,同時(shí)修改構(gòu)建指令也將放棄使用緩存鏡像