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

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

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

以后每次點擊鯨魚圖標會彈出操作菜單。

啟動終端,通過命令可以檢查安裝后的 Docker 版本。

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

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

三、Docker架構(gòu)

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


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


執(zhí)行Docker run 時若在本地找不到鏡像,則會去倉庫拉取,存于本地。
2、列出鏡像
2.1查看已有鏡像:> docker images 等同于 > docker image ls
ls只顯示頂層鏡像,加上-a可顯示中間層鏡像,這樣會看到很多無標簽的鏡像。這些無標簽的鏡像很多都是中間層鏡像,是其它鏡像所依賴的鏡像。(這些無標簽鏡像不應(yīng)該刪除,否則會導(dǎo)致上層鏡像因為依賴丟失而出錯。實際上,這些鏡像也沒必要刪除,因為相同的層只會存一遍,而這些鏡像是別的鏡像的依賴,因此并不會因為它們被列出來而多存了一份。當刪除那些依賴它們的鏡像后,這些依賴的中間層鏡像也會被連帶刪除。)
若想列出部分鏡像可在ls后加鏡像倉庫名 如:> docker image ls ubuntu

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

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

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

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

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

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

上傳成功。

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

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


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

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

2.3 退出容器 exit
注意退出容器并不是終止容器,容器仍然在運行。
(這針對的是2.2的情況,若執(zhí)行的docker run -it ubuntu,因為沒有后臺運行-d,所以在偽終端執(zhí)行exit后容器也就結(jié)束了。)

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

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

4.2 清除所有出于終止狀態(tài)的容器 > docker container prune

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