Docker基礎(chǔ)(1)—— Docker基本概念
Docker基礎(chǔ)(2)—— Docker安裝及基礎(chǔ)操作
二、環(huán)境配置
1、下載安裝
macOS安裝Docker還是比較簡(jiǎn)單的。下載 Stable 或 Edge 版本的 Docker for Mac,安裝。

也可以使用Homebrew安裝:$ brew cask install docker 。
Windows用戶可以參考教程。
2、運(yùn)行
點(diǎn)擊Docker圖標(biāo)運(yùn)行之后右上角菜單欄會(huì)出現(xiàn)一個(gè)鯨魚(yú)圖標(biāo),這個(gè)圖標(biāo)表明了Docker的運(yùn)行狀態(tài)。

第一次點(diǎn)擊圖標(biāo),可能會(huì)看到這個(gè)安裝成功的界面,點(diǎn)擊 "Got it!" 可以關(guān)閉這個(gè)窗口。

以后每次點(diǎn)擊鯨魚(yú)圖標(biāo)會(huì)彈出操作菜單。

啟動(dòng)終端,通過(guò)命令可以檢查安裝后的 Docker 版本。

下面嘗試運(yùn)行一個(gè)Nginx服務(wù)器:

3、鏡像加速
鑒于國(guó)內(nèi)網(wǎng)絡(luò)問(wèn)題,后續(xù)拉取 Docker 鏡像十分緩慢,建議安裝 Docker 之后配置國(guó)內(nèi)鏡像加速。

三、Docker架構(gòu)

DOCKER_HOST:我們進(jìn)行操作的宿主機(jī)
Docker daemon:守護(hù)進(jìn)程(核心程序),做各種Docker操作
Client:客戶端,將命令交給daemon,由daemon來(lái)做實(shí)際的操作
Registry:倉(cāng)庫(kù),所有Docker玩家共享Docker鏡像的服務(wù) (Docker Registry提供一個(gè)集中的存儲(chǔ)、分發(fā)鏡像的服務(wù))
四、實(shí)戰(zhàn)之鏡像操作
1、拉取鏡像
1.1 可以去Docker hub查找自己想要的鏡像


也可以使用 > docker search nginx 指令。
1.2 指令:> docker pull nginx


執(zhí)行Docker run 時(shí)若在本地找不到鏡像,則會(huì)去倉(cāng)庫(kù)拉取,存于本地。
2、列出鏡像
2.1查看已有鏡像:> docker images 等同于 > docker image ls
ls只顯示頂層鏡像,加上-a可顯示中間層鏡像,這樣會(huì)看到很多無(wú)標(biāo)簽的鏡像。這些無(wú)標(biāo)簽的鏡像很多都是中間層鏡像,是其它鏡像所依賴的鏡像。(這些無(wú)標(biāo)簽鏡像不應(yīng)該刪除,否則會(huì)導(dǎo)致上層鏡像因?yàn)橐蕾噥G失而出錯(cuò)。實(shí)際上,這些鏡像也沒(méi)必要?jiǎng)h除,因?yàn)橄嗤膶又粫?huì)存一遍,而這些鏡像是別的鏡像的依賴,因此并不會(huì)因?yàn)樗鼈儽涣谐鰜?lái)而多存了一份。當(dāng)刪除那些依賴它們的鏡像后,這些依賴的中間層鏡像也會(huì)被連帶刪除。)
若想列出部分鏡像可在ls后加鏡像倉(cāng)庫(kù)名 如:> docker image ls ubuntu

3、刪除本地鏡像 > docker image rm

4、構(gòu)建鏡像
4.1 使用Dockerfile定制鏡像
在一個(gè)空白目錄中,建立一個(gè)文本文件,并命名為 Dockerfile。內(nèi)容為:

這個(gè) Dockerfile 很簡(jiǎn)單,一共就兩行。涉及到了兩條指令,F(xiàn)ROM 和 RUN 。
FROM指令指定基礎(chǔ)鏡像,RUN指令用來(lái)執(zhí)行命令(RUN指令會(huì)在一個(gè)容器中進(jìn)行操作)。還有很多其他的Dockerfile指令(如:COPY、ADD、CMD、ENTRYPOINT、ENV、ARG、WORKDIR、EXPOSE 等)可自行學(xué)習(xí)。
4.2 構(gòu)建鏡像 > docker build -t nginx:v4 .

“.”表示當(dāng)前目錄,用于指定上下文路徑。
當(dāng)我們進(jìn)行鏡像構(gòu)建的時(shí)候,并非所有定制都會(huì)通過(guò) RUN 指令完成,經(jīng)常會(huì)需要將一些本地文件復(fù)制進(jìn)鏡像,比如通過(guò) COPY 指令、ADD 指令等。而 docker build 命令構(gòu)建鏡像,其實(shí)并非在本地構(gòu)建,而是在服務(wù)端,也就是 Docker 引擎中構(gòu)建的。那么在這種客戶端/服務(wù)端的架構(gòu)中,如何才能讓服務(wù)端獲得本地文件呢?
這就引入了上下文的概念。當(dāng)構(gòu)建的時(shí)候,用戶會(huì)指定構(gòu)建鏡像上下文的路徑,docker build 命令得知這個(gè)路徑后,會(huì)將路徑下的所有內(nèi)容打包,然后上傳給 Docker 引擎。這樣 Docker 引擎收到這個(gè)上下文包后,展開(kāi)就會(huì)獲得構(gòu)建鏡像所需的一切文件。(若路徑下有些文件不需要上傳給Docker引擎,可以將其放在.dockerignore中)
構(gòu)建成功,測(cè)試一下:

5、上傳鏡像 > docker push
5.1 上傳前要先登陸Docker Hub
指令 > docker login ,輸入用戶名和密碼。

5.2 更改倉(cāng)庫(kù)名
指令 > docker tag nginx:v4 huangbaoling/nginx ,我這里沒(méi)寫(xiě)標(biāo)簽則默認(rèn)是latest,我們也可以 > docker tag nginx:v4 huangbaoling/nginx:4
(對(duì)已有Docker鏡像做tag,注意新tag需要附帶注冊(cè)用戶名huangbaoling。如果是在內(nèi)網(wǎng)倉(cāng)庫(kù)操作則附帶服務(wù)器地址 docker.sunseaiot.cn)
當(dāng)沒(méi)有做tag直接push時(shí),默認(rèn)的路徑是library,是官方鏡像段路徑。前面提到的兩段式路徑是多用戶環(huán)境下,推送鏡像段規(guī)范是:> docker push 注冊(cè)用戶名/鏡像名

上傳成功。

五、實(shí)戰(zhàn)之容器操作
1、新建并啟動(dòng)容器
1.1 查看已有鏡像:> docker images

1.2 啟動(dòng)容器指令:> docker run -d -p 8088:80 nginx


-d:后臺(tái)運(yùn)行容器并打印容器
-i:保證輸入有效
-t:分配個(gè)偽終端
-p:開(kāi)放容器端口給主機(jī) (-p 本機(jī)端口:鏡像端口),Docker Hub上可查看到鏡像端口和鏡像使用到一些信息
其他參數(shù)用法可參考 >docker run -help
2、進(jìn)入容器
2.1 ps指令查看進(jìn)程信息
容器外:> docker ps 列出所有運(yùn)行的容器
容器內(nèi):> ps -ef

查看容器信息指令 > docker container ls 和 > docker ps 是一樣的效果
2.2 進(jìn)入容器內(nèi)部 > docker exec -it ____ bash
(____中填寫(xiě)容器ID、容器名,ID可以只填部分?jǐn)?shù)據(jù),只要能與其他容器區(qū)分)

2.3 退出容器 exit
注意退出容器并不是終止容器,容器仍然在運(yùn)行。
(這針對(duì)的是2.2的情況,若執(zhí)行的docker run -it ubuntu,因?yàn)闆](méi)有后臺(tái)運(yùn)行-d,所以在偽終端執(zhí)行exit后容器也就結(jié)束了。)

3、 終止容器 > docker container stop ____
(____中可填寫(xiě)容器ID、容器名,可以只填部分?jǐn)?shù)據(jù),只要能與其他容器區(qū)分)

在容器中寫(xiě)入的內(nèi)容會(huì)存放在容器存儲(chǔ)層,若只是將容器stop,存儲(chǔ)層中的內(nèi)容不會(huì)消失,下次restart還在,若是將容器remove,容器存儲(chǔ)層會(huì)隨著容器一起消失,所以若想保存內(nèi)容,應(yīng)當(dāng)掛載到外部宿主。
4、 刪除容器
4.1 單個(gè)刪除 > docker container rm _____
(____中可填寫(xiě)容器ID、容器名,可以只填部分?jǐn)?shù)據(jù),只要能與其他容器區(qū)分)

4.2 清除所有出于終止?fàn)顟B(tài)的容器 > docker container prune

六、總結(jié)
容器技術(shù)有很多種,Docker只是其中一種,只是它的流行度比較高。注意區(qū)分容器技術(shù)和虛擬化技術(shù)的區(qū)別(容器和虛擬機(jī)之間的主要區(qū)別在于虛擬化層的位置和操作系統(tǒng)資源的使用方式)。
前面我們分析了容器的輕量的原因,但因此也會(huì)給容器帶來(lái)局限性:一,由于所有容器都是與宿主機(jī)共用內(nèi)核的,容器與容器之間的隔離性就會(huì)差很多;二,容器里面是不存放數(shù)據(jù)的,容器里面的數(shù)據(jù)會(huì)隨著容器的生命周期而消失,如果想要持久化的存儲(chǔ),必須要依靠外部的存儲(chǔ)設(shè)備。(所有的文件寫(xiě)入操作,都應(yīng)該使用 數(shù)據(jù)卷(Volume)、或者綁定宿主目錄,在這些位置的讀寫(xiě)會(huì)跳過(guò)容器存儲(chǔ)層,直接對(duì)宿主(或網(wǎng)絡(luò)存儲(chǔ))發(fā)生讀寫(xiě),其性能和穩(wěn)定性更高。數(shù)據(jù)卷的生存周期獨(dú)立于容器,容器消亡,數(shù)據(jù)卷不會(huì)消亡。因此,使用數(shù)據(jù)卷后,容器刪除或者重新運(yùn)行之后,數(shù)據(jù)卻不會(huì)丟失。)