内容摘要

通过容器构建镜像

dockerfile 方式构建镜像


通过容器构建

上一节讲了容器镜像的基本操作,本节讲解如何构建容器镜像。

容器是镜像的实例,根据容器构建镜像方法如下:

1、运行容器

以 centos 镜像为例,命令为:

docker run -it centos:7




centos 删除R centos删除容器_dockerfile构建镜像的命令


使用 -it 参数以交互方式创建容器,并进入容器。


2、在容器中操作

可以在容器中做在主机中做的大量操作,比如创建文件,安装软件等。


centos 删除R centos删除容器_dockerfile构建镜像的命令_02


在容器中创建 in_docker 文件,由于容器无法使用 vim 命令,使用 yum install vim 命令安装。


3、创建新镜像

使用 exit 指令退出容器,创建新镜像,命令为:

docker commit 原镜像名 新镜像名


centos 删除R centos删除容器_centos查看docker是否在运行_03


容器名称 heuristic_rosalind 是随机生成的,新构建镜像名称为 centos7-with-yum,

查看镜像,在 SIZE 列可以看到新构建的镜像为 369M,比原先的镜像大。


4、验证是否构建成功

根据新的镜像创建容器,进入容器后,运行vim命令,并查看根目录下是否有 in_docker文件


centos 删除R centos删除容器_docker 容器保存为镜像_04


进入容器可以看到根目录下有 in_docker 文件,使用 yum 命令编辑该文件,说明镜像构建成功。


优点:

1、交互性好;

2、可用于测试接下来要讲解的使用Dockerfile构建镜像的方法;

缺点:

1、不可重用,每次构建都要运行容器,在容器中做操作,重复构建步骤;

2、无法查看镜像构建的步骤;


Dockerfile初步

Dockerfile 是一个文件,里面记录了镜像构建的操作步骤,它有自己的语法规则。

先从一个简单的 Dockerfile 文件开始,如下:

在自己的容器环境中,/root 目录下创建文件夹 test,并在该文件夹下创建 Dockerfile 文件,写入内容:

FROM centosRUN mkdir in_docker


centos 删除R centos删除容器_docker 容器保存为镜像_05



构建镜像,命令为:

docker build -t centos-with-file .


centos 删除R centos删除容器_dockerfile构建镜像的命令_06


centos-with-file 为新镜像名,最后的点表示当前目录,标识Dockerfile所在的目录。

构建过程如下:

1、FROM centos: 该镜像ID为 67fa590cfc1c;

2、RUN mkdir in_docker:构建了一个中间镜像 4d03ee4e95de,在其中运行该命令,运行完后,删除该镜像,新构建镜像为 e7fe8e515798;


镜像分层结构

使用 docker history 查看容器构建历史:


centos 删除R centos删除容器_centos 删除R_07


在 CREATED BY 列可以看到 Dockerfile 执行的命令,由于没有安装软件,所有 SIZE 列显示为 0B,下面的操作是 centos 镜像基础镜像构建做过的操作。

从 CREATED BY 列可以看出:新构建的镜像是在基础镜像的基础上做进一步操作而得到,镜像是一层一层叠加出来的。

进入镜像保存目录下看下镜像的原始文件:

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


centos 删除R centos删除容器_centos查看docker是否在运行_08


从上图可以看到 Storage Driver 为 overlay2,Docker Root Dir 为 /var/lib/docker.

使用 cd /var/lib/docker 指令进入目录


centos 删除R centos删除容器_docker 容器保存为镜像_09


在该目录下可以看到overlay2目录,在该目录下存储保存了镜像的文件,进入该目录下:


centos 删除R centos删除容器_centos删除docker_10


该目录下保存着一些随机字符串名字的文件夹,进入其中:


centos 删除R centos删除容器_docker 容器保存为镜像_11


在该文件夹的 diff 文件夹下,可以看到我们曾经创建的 in_docker 文件

查看 link 和 lower 文件:


centos 删除R centos删除容器_centos 删除R_12


可以看到一些随机字符串指示文件的位置,在上面的目录中,有一些名为 l 的目录,进入其中:


centos 删除R centos删除容器_docker 容器保存为镜像_13


可以看到link和lower两个文件链接的文件在这里。

可以推断 l 目录下保存的是基础镜像,上层镜像文件使用link和lower两个文件指示其引用基础文件的位置。

进入以PD开头的文件夹:


centos 删除R centos删除容器_dockerfile构建镜像的命令_14


是不是有似曾相识的感觉,其实就是操作系统的所有目录,但是这个目录下没有我们自己创建的 in_docker 文件,在上面的diff文件夹下保存着 in_docker 文件,这说明上层镜像只保存有差异的部分。

进入 l 目录的另外两个文件夹下:


centos 删除R centos删除容器_centos查看docker是否在运行_15


可以看到我们前面创建的文件和文件夹。


镜像缓存特性

在构建镜像过程中,如果基础镜像已经存在,那么就会直接使用,不会再从远程仓库中拉取。

测试过程如下:

1、删除环境中所有镜像,之后运行先前编写的 Dockerfile

删除所有镜像和容器操作参考下方的命令补充中的shell命令。


centos 删除R centos删除容器_centos 删除R_16


上面数字编号1的指令删除所有容器,数字编号2的指令删除所有镜像。

之后运行 docker build 构建镜像,由于基础镜像 centos 在本机不存在,所有显示 "Pulling form library/centos"。

2、在 Dockerfile 同一目录下创建文件,名为test,修改 Dockerfile

内容如下:

FROM centosRUN mkdir in_dockerCOPY test /


centos 删除R centos删除容器_centos查看docker是否在运行_17


构建镜像:


centos 删除R centos删除容器_centos删除docker_18


构建的第一步没有再从远程拉取镜像,该镜像在本机已经存在。

查询镜像


centos 删除R centos删除容器_dockerfile构建镜像的命令_19


第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}')