Docker動手教程3.2:容器鏡像構建1

內容摘要

通過容器構建鏡像

dockerfile 方式構建鏡像

通過容器構建

上一節講了容器鏡像的基本操作,本節講解如何構建容器鏡像。

容器是鏡像的實例,根據容器構建鏡像方法如下:

1、運行容器

以 centos 鏡像為例,命令為:

docker run -it centos:7
Docker動手教程3.2:容器鏡像構建1

使用 -it 參數以交互方式創建容器,並進入容器。

2、在容器中操作

可以在容器中做在主機中做的大量操作,比如創建文件,安裝軟件等。

Docker動手教程3.2:容器鏡像構建1

在容器中創建 in_docker 文件,由於容器無法使用 vim 命令,使用 yum install vim 命令安裝。

3、創建新鏡像

使用 exit 指令退出容器,創建新鏡像,命令為:

docker commit 原鏡像名 新鏡像名
Docker動手教程3.2:容器鏡像構建1

容器名稱 heuristic_rosalind 是隨機生成的,新構建鏡像名稱為 centos7-with-yum,

查看鏡像,在 SIZE 列可以看到新構建的鏡像為 369M,比原先的鏡像大。

4、驗證是否構建成功

根據新的鏡像創建容器,進入容器後,運行vim命令,並查看根目錄下是否有 in_docker文件

Docker動手教程3.2:容器鏡像構建1

進入容器可以看到根目錄下有 in_docker 文件,使用 yum 命令編輯該文件,說明鏡像構建成功。

優點:

1、交互性好;

2、可用於測試接下來要講解的使用Dockerfile構建鏡像的方法;

缺點:

1、不可重用,每次構建都要運行容器,在容器中做操作,重複構建步驟;

2、無法查看鏡像構建的步驟;

Dockerfile初步

Dockerfile 是一個文件,裡面記錄了鏡像構建的操作步驟,它有自己的語法規則。

先從一個簡單的 Dockerfile 文件開始,如下:

在自己的容器環境中,/root 目錄下創建文件夾 test,並在該文件夾下創建 Dockerfile 文件,寫入內容:

FROM centos
RUN mkdir in_docker
Docker動手教程3.2:容器鏡像構建1

構建鏡像,命令為:

docker build -t centos-with-file .
Docker動手教程3.2:容器鏡像構建1

centos-with-file 為新鏡像名,最後的點表示當前目錄,標識Dockerfile所在的目錄。

構建過程如下:

1、FROM centos: 該鏡像ID為 67fa590cfc1c;

2、RUN mkdir in_docker:構建了一箇中間鏡像 4d03ee4e95de,在其中運行該命令,運行完後,刪除該鏡像,新構建鏡像為 e7fe8e515798;

鏡像分層結構

使用 docker history 查看容器構建歷史:

Docker動手教程3.2:容器鏡像構建1

在 CREATED BY 列可以看到 Dockerfile 執行的命令,由於沒有安裝軟件,所有 SIZE 列顯示為 0B,下面的操作是 centos 鏡像基礎鏡像構建做過的操作。

從 CREATED BY 列可以看出:新構建的鏡像是在基礎鏡像的基礎上做進一步操作而得到,鏡像是一層一層疊加出來的。

進入鏡像保存目錄下看下鏡像的原始文件:

使用 docker info 指令查看本機容器信息:

Docker動手教程3.2:容器鏡像構建1

從上圖可以看到 Storage Driver 為 overlay2,Docker Root Dir 為 /var/lib/docker.

使用 cd /var/lib/docker 指令進入目錄

Docker動手教程3.2:容器鏡像構建1

在該目錄下可以看到overlay2目錄,在該目錄下存儲保存了鏡像的文件,進入該目錄下:

Docker動手教程3.2:容器鏡像構建1

該目錄下保存著一些隨機字符串名字的文件夾,進入其中:

Docker動手教程3.2:容器鏡像構建1

在該文件夾的 diff 文件夾下,可以看到我們曾經創建的 in_docker 文件

查看 link 和 lower 文件:

Docker動手教程3.2:容器鏡像構建1

可以看到一些隨機字符串指示文件的位置,在上面的目錄中,有一些名為 l 的目錄,進入其中:

Docker動手教程3.2:容器鏡像構建1

可以看到link和lower兩個文件鏈接的文件在這裡。

可以推斷 l 目錄下保存的是基礎鏡像,上層鏡像文件使用link和lower兩個文件指示其引用基礎文件的位置。

進入以PD開頭的文件夾:

Docker動手教程3.2:容器鏡像構建1

是不是有似曾相識的感覺,其實就是操作系統的所有目錄,但是這個目錄下沒有我們自己創建的 in_docker 文件,在上面的diff文件夾下保存著 in_docker 文件,這說明上層鏡像只保存有差異的部分。

進入 l 目錄的另外兩個文件夾下:

Docker動手教程3.2:容器鏡像構建1

可以看到我們前面創建的文件和文件夾。

鏡像緩存特性

在構建鏡像過程中,如果基礎鏡像已經存在,那麼就會直接使用,不會再從遠程倉庫中拉取。

測試過程如下:

1、刪除環境中所有鏡像,之後運行先前編寫的 Dockerfile

刪除所有鏡像和容器操作參考下方的命令補充中的shell命令。

Docker動手教程3.2:容器鏡像構建1

上面數字編號1的指令刪除所有容器,數字編號2的指令刪除所有鏡像。

之後運行 docker build 構建鏡像,由於基礎鏡像 centos 在本機不存在,所有顯示 "Pulling form library/centos"。

2、在 Dockerfile 同一目錄下創建文件,名為test,修改 Dockerfile

內容如下:

FROM centos
RUN mkdir in_docker
COPY test /
Docker動手教程3.2:容器鏡像構建1

構建鏡像:

Docker動手教程3.2:容器鏡像構建1

構建的第一步沒有再從遠程拉取鏡像,該鏡像在本機已經存在。

查詢鏡像

Docker動手教程3.2:容器鏡像構建1

第3行名為 centos 鏡像就是上面用到的鏡像。

鏡像構建就講到這裡,dockerfile的命令還有很多,這節先講這些。請大家在容器環境做實驗。

實驗

1、通過容器構建鏡像

2、使用dockerfile構建鏡像

命令補充

刪除所有的docker

sudo docker rm -f $(sudo docker ps -a | awk 'NR == 1 {next} {print $1}')
或者:
docker stop $(docker ps -q) & docker rm $(docker ps -aq)

刪除所有的鏡像

sudo docker rmi -f $(sudo docker images | awk 'NR == 1 {next} {print $3}')


分享到:


相關文章: