内容摘要
通过容器构建镜像
dockerfile 方式构建镜像
通过容器构建
上一节讲了容器镜像的基本操作,本节讲解如何构建容器镜像。
容器是镜像的实例,根据容器构建镜像方法如下:
1、运行容器
以 centos 镜像为例,命令为:
docker run -it centos:7
使用 -it 参数以交互方式创建容器,并进入容器。
2、在容器中操作
可以在容器中做在主机中做的大量操作,比如创建文件,安装软件等。
在容器中创建 in_docker 文件,由于容器无法使用 vim 命令,使用 yum install vim 命令安装。
3、创建新镜像
使用 exit 指令退出容器,创建新镜像,命令为:
docker commit 原镜像名 新镜像名
容器名称 heuristic_rosalind 是随机生成的,新构建镜像名称为 centos7-with-yum,
查看镜像,在 SIZE 列可以看到新构建的镜像为 369M,比原先的镜像大。
4、验证是否构建成功
根据新的镜像创建容器,进入容器后,运行vim命令,并查看根目录下是否有 in_docker文件
进入容器可以看到根目录下有 in_docker 文件,使用 yum 命令编辑该文件,说明镜像构建成功。
优点:
1、交互性好;
2、可用于测试接下来要讲解的使用Dockerfile构建镜像的方法;
缺点:
1、不可重用,每次构建都要运行容器,在容器中做操作,重复构建步骤;
2、无法查看镜像构建的步骤;
Dockerfile初步
Dockerfile 是一个文件,里面记录了镜像构建的操作步骤,它有自己的语法规则。
先从一个简单的 Dockerfile 文件开始,如下:
在自己的容器环境中,/root 目录下创建文件夹 test,并在该文件夹下创建 Dockerfile 文件,写入内容:
FROM centosRUN mkdir in_docker
构建镜像,命令为:
docker build -t centos-with-file .
centos-with-file 为新镜像名,最后的点表示当前目录,标识Dockerfile所在的目录。
构建过程如下:
1、FROM centos: 该镜像ID为 67fa590cfc1c;
2、RUN mkdir in_docker:构建了一个中间镜像 4d03ee4e95de,在其中运行该命令,运行完后,删除该镜像,新构建镜像为 e7fe8e515798;
镜像分层结构
使用 docker history 查看容器构建历史:
在 CREATED BY 列可以看到 Dockerfile 执行的命令,由于没有安装软件,所有 SIZE 列显示为 0B,下面的操作是 centos 镜像基础镜像构建做过的操作。
从 CREATED BY 列可以看出:新构建的镜像是在基础镜像的基础上做进一步操作而得到,镜像是一层一层叠加出来的。
进入镜像保存目录下看下镜像的原始文件:
使用 docker info 指令查看本机容器信息:
从上图可以看到 Storage Driver 为 overlay2,Docker Root Dir 为 /var/lib/docker.
使用 cd /var/lib/docker 指令进入目录
在该目录下可以看到overlay2目录,在该目录下存储保存了镜像的文件,进入该目录下:
该目录下保存着一些随机字符串名字的文件夹,进入其中:
在该文件夹的 diff 文件夹下,可以看到我们曾经创建的 in_docker 文件
查看 link 和 lower 文件:
可以看到一些随机字符串指示文件的位置,在上面的目录中,有一些名为 l 的目录,进入其中:
可以看到link和lower两个文件链接的文件在这里。
可以推断 l 目录下保存的是基础镜像,上层镜像文件使用link和lower两个文件指示其引用基础文件的位置。
进入以PD开头的文件夹:
是不是有似曾相识的感觉,其实就是操作系统的所有目录,但是这个目录下没有我们自己创建的 in_docker 文件,在上面的diff文件夹下保存着 in_docker 文件,这说明上层镜像只保存有差异的部分。
进入 l 目录的另外两个文件夹下:
可以看到我们前面创建的文件和文件夹。
镜像缓存特性
在构建镜像过程中,如果基础镜像已经存在,那么就会直接使用,不会再从远程仓库中拉取。
测试过程如下:
1、删除环境中所有镜像,之后运行先前编写的 Dockerfile
删除所有镜像和容器操作参考下方的命令补充中的shell命令。
上面数字编号1的指令删除所有容器,数字编号2的指令删除所有镜像。
之后运行 docker build 构建镜像,由于基础镜像 centos 在本机不存在,所有显示 "Pulling form library/centos"。
2、在 Dockerfile 同一目录下创建文件,名为test,修改 Dockerfile
内容如下:
FROM centosRUN mkdir in_dockerCOPY test /
构建镜像:
构建的第一步没有再从远程拉取镜像,该镜像在本机已经存在。
查询镜像
第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}')