1. Docker簡(jiǎn)介
Docker即通過(guò)對(duì)應(yīng)用組件的封裝(packaging),分發(fā)(Distribution),部署(Deployment),運(yùn)行(Runtime)等生命周期的管理,達(dá)到應(yīng)用組件級(jí)別的“一次封裝,到處運(yùn)行”。Docker引擎的基礎(chǔ)是Linux容器(LinuxContainers,LXC)技術(shù)。Docker采用標(biāo)準(zhǔn)的C/S 架構(gòu),包括客戶(hù)端和服務(wù)端兩部分,客戶(hù)端和服務(wù)端既可以運(yùn)行在一個(gè)機(jī)器上,也可通過(guò)socket或者RESTful API來(lái)進(jìn)行通信,如下圖所示:

1.1 命名空間
????????命名空間(Namespace)是Linux內(nèi)核針對(duì)實(shí)現(xiàn)容器虛擬化而引入的一個(gè)強(qiáng)大特性;每個(gè)容器都可以擁有自己?jiǎn)为?dú)命名空間,運(yùn)行在其中的應(yīng)用都像是在獨(dú)立的操作系統(tǒng)運(yùn)行一樣,命名空間保證來(lái)容器之間彼此互不影響。Docker網(wǎng)絡(luò)命名空間如下圖所示:

1.2 控制組
????????控制組(CGroups)是Linux內(nèi)核的一個(gè)特性,主要用來(lái)對(duì)共享資源進(jìn)行隔離,限制,審計(jì)等;只有能控制分配到容器的資源,docker才能避免多個(gè)容器同時(shí)運(yùn)行時(shí)的系統(tǒng)資源競(jìng)爭(zhēng)。
1.3 聯(lián)合文件系統(tǒng)
????????聯(lián)合文件系統(tǒng)(UnionFS)是一種輕量級(jí)的高性能分層文件系統(tǒng),它支持將文件系統(tǒng)的修改信息作為一次提交,并層層疊加,同時(shí)可以將不同目錄掛載到同一個(gè)虛擬文件系統(tǒng)下;聯(lián)合文件系統(tǒng)是實(shí)現(xiàn)Docker鏡像的技術(shù)基礎(chǔ),鏡像可以通過(guò)分層來(lái)進(jìn)行繼承。當(dāng)Docker利用鏡像啟動(dòng)一個(gè)容器時(shí),將利用鏡像分配文件系統(tǒng)并且掛載一個(gè)新的可讀寫(xiě)的層給容器,容器會(huì)在這個(gè)文件系統(tǒng)中創(chuàng)建,并且這個(gè)可讀寫(xiě)層被添加到鏡像中,如下圖所示:

1.4 容器定義
????????容器有效地將有單個(gè)操作系統(tǒng)管理的資源劃分到孤立的組中,以便更好地在孤立的組之間平衡有沖突的資源使用需求。與虛擬化相比,這樣既不需要指令級(jí)模擬,也不需要即時(shí)編譯。容器可以在核心CPU本地運(yùn)行指令,而不需要任何專(zhuān)門(mén)的解釋機(jī)制。此外,也避免了準(zhǔn)虛擬化和系統(tǒng)調(diào)用替換中的復(fù)雜行。
1.5 虛擬化定義
????????在計(jì)算技術(shù)中,虛擬化(Virtualization)是一種資源管理技術(shù),是將計(jì)算機(jī)的各種實(shí)體資源,如服務(wù)器,網(wǎng)絡(luò),內(nèi)存及存儲(chǔ)等,予以抽象,轉(zhuǎn)換后呈現(xiàn)出來(lái),打破實(shí)體結(jié)構(gòu)間的不可切割的障礙,是用戶(hù)可以用比原本的組態(tài)更好的方式來(lái)應(yīng)用這些資源。
可以簡(jiǎn)單地將Docker容器理解為一種沙盒(Sandbox)。每個(gè)容器內(nèi)運(yùn)行一個(gè)應(yīng)用,不同的容器相互隔離,容器之間也可以建立通信機(jī)制。

Docker容器是在操作系統(tǒng)層面上實(shí)現(xiàn)虛擬化,直接復(fù)用本地操作系統(tǒng)。由于Docker引擎使用了Linux內(nèi)核特性,所以在Windows上運(yùn)行的話(huà),需要額外使用一個(gè)虛擬機(jī)來(lái)提供Linux支持。

2. Docker核心概念
2.1 Docker鏡像
????????Docker鏡像(Image)類(lèi)似于虛擬機(jī)鏡像,可以將它理解為一個(gè)面向Docker引擎的只讀模版,包含來(lái)文件系統(tǒng)。鏡像是創(chuàng)建Docker容器的基礎(chǔ)。鏡像文件一般是由若干層組成,層(Layer)是AUFS(Advanced Union File System)一種聯(lián)合文件系統(tǒng)中的重要概念,是實(shí)現(xiàn)增量保存和更新的基礎(chǔ)。
2.2 Docker容器
????????Docker容器(Container)類(lèi)似于一個(gè)輕量級(jí)的沙箱,Docker利用容器來(lái)運(yùn)行和隔離應(yīng)用。容器是從鏡像創(chuàng)建的應(yīng)用運(yùn)行實(shí)例,可以將其啟動(dòng),開(kāi)始,停止,刪除,而這些容器是相互隔離,互不可見(jiàn)的。容器是鏡像的一個(gè)運(yùn)行實(shí)例,所不同的是,它帶有額外的可寫(xiě)文件層。
2.3 Docker倉(cāng)庫(kù)
????????Docker倉(cāng)庫(kù)(Repository)類(lèi)似于代碼倉(cāng)庫(kù),是Docker集中存放鏡像文件的場(chǎng)所。
2.4 注冊(cè)服務(wù)器
????????注冊(cè)服務(wù)器(Registry)是存放倉(cāng)庫(kù)的地方,其上往往存放著多個(gè)倉(cāng)庫(kù)。每一個(gè)倉(cāng)庫(kù)集中存放某一類(lèi)鏡像,往往包括多個(gè)鏡像文件,通過(guò)不同的標(biāo)簽(tag)來(lái)進(jìn)行區(qū)分。注冊(cè)服務(wù)器是存放倉(cāng)庫(kù)的具體服務(wù)器,每個(gè)服務(wù)器上可以有多個(gè)倉(cāng)庫(kù),而每個(gè)倉(cāng)庫(kù)下面有多個(gè)鏡像;倉(cāng)庫(kù)可以被認(rèn)為是一個(gè)具體的項(xiàng)目或目錄。

2.5 docker 數(shù)據(jù)管理
(1)數(shù)據(jù)卷:在容器內(nèi)創(chuàng)建數(shù)據(jù)卷,并且把本地的目錄或文件掛載到容器內(nèi)的數(shù)據(jù)卷中;
(2)數(shù)據(jù)卷容器:使用數(shù)據(jù)卷容器在容器和主機(jī),容器和容器之間共享數(shù)據(jù)。
2.6 Docker網(wǎng)絡(luò)配置
????????docker提供映射容器端口到宿主主機(jī)和容器互聯(lián)機(jī)制來(lái)為容器提供網(wǎng)絡(luò)服務(wù)。從外部訪(fǎng)問(wèn)容器應(yīng)用,需要通過(guò)端口映射實(shí)現(xiàn)容器訪(fǎng)問(wèn)。容器的連接(linking)系統(tǒng)是除了端口映射外另一種與容器中應(yīng)用進(jìn)行交互的方式,它會(huì)在源和接收容器之間創(chuàng)建一個(gè)隧道,接收容器可以看到元容器指定的信息,通過(guò)容器名稱(chēng)來(lái)進(jìn)行互連。當(dāng)兩個(gè)docker容器在同一主機(jī)(或虛擬機(jī))時(shí),可以通過(guò)—link命令讓兩者直接相互訪(fǎng)問(wèn);如果要跨主機(jī)實(shí)現(xiàn)容器互聯(lián),則往往需要容器知道其物理主機(jī)的IP地址,利用Ambassador容器機(jī)制,可以讓互聯(lián)的容器無(wú)需知道所在物理主機(jī)的IP地址即可互聯(lián)。


2.7 Docker網(wǎng)絡(luò)實(shí)現(xiàn)
????????其是利用Linux上的網(wǎng)絡(luò)命名空間和虛擬網(wǎng)絡(luò)設(shè)備;docker網(wǎng)絡(luò)就是很好地利用來(lái)Linux虛擬網(wǎng)絡(luò)技術(shù),它在本地主機(jī)和容器內(nèi)分別創(chuàng)建一個(gè)虛擬接口,并讓他們彼此聯(lián)通(這樣一對(duì)接口叫做veth pair),如下圖所示:



3. Docker命令?
Help命令: docker –help
3.1 鏡像命令
pull命令格式:dockerpull NAME[:TAG] 從網(wǎng)絡(luò)上下載鏡像,對(duì)于docker鏡像來(lái)說(shuō),如果不顯示制定TAG,則默認(rèn)會(huì)選擇latest標(biāo)簽,即下載倉(cāng)庫(kù)中最新版本鏡像。
run命令:?docker run --help
images命令:dockerimages 列出本地主機(jī)上已有的鏡像
inspect命令:dockerinspect 查看鏡像的信息
search命令:dockersearch 搜索遠(yuǎn)程倉(cāng)庫(kù)(注冊(cè)服務(wù)器Registry)中共享的鏡像
rmi命令:docker rmi 刪除鏡像,其中rmi(remove image)
commit命令:dockercommit 創(chuàng)建鏡像
save命令:docker save 將鏡像存儲(chǔ)到本地文件
load命令:docker load 將本地文件導(dǎo)入到本地鏡像庫(kù)
push命令:docker push 將鏡像上傳到倉(cāng)庫(kù)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 鏡像創(chuàng)建的方法
????創(chuàng)建鏡像的方法有是三種:基于已有鏡像的容器創(chuàng)建(docker commit),基于本地模板導(dǎo)入(從一個(gè)操作系統(tǒng)模板文件導(dǎo)入一個(gè)鏡像),基于Dockerfile創(chuàng)建。
基于Dockerfile創(chuàng)建:用戶(hù)可以使用Dockerfile來(lái)創(chuàng)建自定義的鏡像,編寫(xiě)完dockerfile文件之后,可以通過(guò)docker build命令來(lái)創(chuàng)建鏡像,其中dockerfile對(duì)應(yīng)的注意點(diǎn)如下:
(1)第一行必須指定基于的基礎(chǔ)鏡像
(2)鏡像操作指令:
指令格式:INSTRUCTION argumens
?? RUN指令:RUN 或者 RUN [“executable”,”param1”,”param2”],前者將在shell終端中運(yùn)行命令即/bin/sh –c ;后者則使用exec執(zhí)行;每運(yùn)行一條RUN指令,鏡像添加新的一層,并提交
?? CMD指令:CMD [“executable”,”param1”,”param2”]使用exec執(zhí)行;CMD command param1 param2 在/bin/sh中執(zhí)行;CMD [“param1”,”param2”]提供給ENTRYPOINT的默認(rèn)參數(shù);指定運(yùn)行容器時(shí)的操作命令,每個(gè)Dockerfile只能有一條CMD指令,如果指定了多條命令,只有最后一條會(huì)被執(zhí)行。
?? MAINTATINER指令:MAINTATINER 制定維護(hù)者信息
?? EXPOSE 指令:EXPOSE 告訴Docker服務(wù)端容器暴露的端口號(hào),供互聯(lián)系統(tǒng)使用
?? ENV指令:ENV 指定一個(gè)環(huán)境變量,會(huì)被后續(xù)RUN指令使用,并在容器運(yùn)行時(shí)保持
?? ADD指令:ADD 復(fù)制指定的到容器中的
?? COPY指令:COPY 復(fù)制本地主機(jī)到容器中的中
?? ENTRYPOINT指令:ENTRYPOINT[“executable”,”param1”,”param2”]或者ENTRYPOINT commandparam1 param2 配置容器啟動(dòng)后執(zhí)行的命令,并且不可被docker run提供的參數(shù)覆蓋;每一個(gè)dockerfile中只能有一個(gè)ENTRYPOINT,當(dāng)指定多個(gè)ENTRYPOINT時(shí),只有最后一個(gè)生效
?? VOLUME指令:VOLUME [“/data”] 創(chuàng)建一個(gè)可以從本地主機(jī)或其他容器掛載的掛載帶點(diǎn)
?? USER指令:USER daemon 指定運(yùn)行容器時(shí)的用戶(hù)名或UID,后續(xù)的RUN也會(huì)使用指定用戶(hù)
?? WORKDIR指令:WORKDIR /path/to/workdir 為后續(xù)的RUN,CMD,ENTRYPOINT指令配置工作目錄,可以使用多個(gè)WORKDIR指令,后續(xù)命令如果參數(shù)是相對(duì)路徑,則會(huì)基于之前命令制定的路徑
?? ONBUILD指令:ONBUILD [INSTRUCTION] 配置當(dāng)所創(chuàng)建的鏡像作為其他新創(chuàng)建鏡像的基礎(chǔ)鏡像時(shí),所執(zhí)行的操作指令
3.2 容器命令
create命令:dockercreate 新建一個(gè)容器,只是這個(gè)容器處于停止?fàn)顟B(tài),可以使用docker start 命令來(lái)啟動(dòng)它
start命令:dockerstart 啟動(dòng)一個(gè)容器,對(duì)于處于終止?fàn)顟B(tài)的容器,使用start命令來(lái)重新啟動(dòng)
restart命令:dockerrestart 將一個(gè)運(yùn)行狀態(tài)的容器終止,然后再重新啟動(dòng)它
run命令:docker run 運(yùn)行一個(gè)容器,等價(jià)于先執(zhí)行docker create命令創(chuàng)建一個(gè)容器,然后再執(zhí)行docker start命令來(lái)啟動(dòng)這個(gè)新建的容器
stop命令:docker stop 終止一個(gè)運(yùn)行中的容器,當(dāng)Docker容器中制定的應(yīng)用終結(jié)時(shí),容器也自動(dòng)終止
ps命令:docker ps 可以列出容器信息
attach命令: dockerattach 將在后臺(tái)運(yùn)行的容器通過(guò)attach命令來(lái)獲得對(duì)應(yīng)的關(guān)聯(lián)
exec命令:docker exec 可以通過(guò)exec命令在對(duì)應(yīng)的容器環(huán)境中執(zhí)行對(duì)應(yīng)命令
rm命令:docker rm 刪除容器
export命令:dockerexport 導(dǎo)出容器(導(dǎo)出一個(gè)已經(jīng)創(chuàng)建的容器到一個(gè)文件)
import命令:dockerimport 導(dǎo)入容器(將導(dǎo)出的容器文件變成鏡像),其中docker load命令來(lái)導(dǎo)入鏡像存儲(chǔ)文件到本地的鏡像庫(kù),也可以使用docker import命令來(lái)導(dǎo)入一個(gè)容器快照到本地鏡像庫(kù);這兩者的區(qū)別在于容器快照文件將丟棄所有的歷史記錄和元數(shù)據(jù)信息(即僅保存容器當(dāng)時(shí)的快照狀態(tài)),而鏡像存儲(chǔ)文件保存完整的記錄,體積也大;此外,從容器快照文件導(dǎo)入時(shí)可以重新制定標(biāo)簽等元數(shù)據(jù)信息。