还记得上一篇文章我们讲了镜像构建的三种方法,让我们再回顾一下:
镜像的构建有三种方法:
1. 基于运行的容器状态生成新的镜像,即docker commit;
2. 基于Dockerfile构建镜像,即docker build;
3. 利用Docker Hub自动构建镜像。
我们已经介绍了使用docker commit构建镜像,那这篇文章让我们讲讲如何使用Dockerfile构建镜像
什么是Dockerfile?
dockerfile,相当于是一个文档,客户可以基于dockerfile生成新的容器
dockerfile仅仅是用来制作镜像的源码文件,是构建容器过程中的指令,docker能够读取dockerfile的指定进行自动构建容器,基于dockerfile制作镜像,每一个指令都会创建一个镜像层,即镜像都是多层叠加而成,因此,层越多,效率越低,创建镜像,层越少越好。因此能在一个指令完成的动作尽量通过一个指令定义。
Dockerfile镜像制作的工作逻辑
首先需要有一个制作镜像的目录,该目录下有个文件,名称必须为Dockerfile,Dockerfile有指定的格式,#号开头为注释,,指定默认用大写字母来表示,以区分指令和参数,docker build读取Dockerfile是按顺序依次Dockerfile里的配置,且第一条非注释指令必须是FROM 开头,表示基于哪个基础镜像来构建新镜像。可以根据已存在的任意镜像来制作新镜像。
Dockerfile可以使用环境变量,用ENV来定义环境变量,变量名支持bash的变量替换,如${variable:-word},表示如果变量值存在,就使用原来的变量,变量为空时,就使用word的值作为变量的值,一般使用这个表示法。
Dockerfile文件说明
在这里,我只列出了一些最常用的指令。
FROM:指定基础镜像,必须为第一个命令
MAINTAINER: 维护者信息
RUN:构建镜像时执行的命令
ADD:将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget
COPY:功能类似ADD,但是是不会自动解压文件,也不能访问网络资源
CMD:构建容器后调用,也就是在容器启动时才进行调用。
ENTRYPOINT:配置容器,使其可执行化。配合CMD可省去"application",只使用参数。
LABEL:用于为镜像添加元数据
ENV:设置环境变量
EXPOSE:指定于外界交互的端口
VOLUME:用于指定持久化目录
WORKDIR:工作目录,类似于cd命令
USER:指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户
ARG:用于指定传递给构建运行时的变量
ONBUILD:用于设置镜像触发器
......
用一张有趣的图来解释常用命令的意义:)
做个小示例
步骤 1 在/root目录下创建一个dockerfile文件夹
mkdir dockerfile
步骤 2 创建一个名为dockerfile1的dockerfile文件。
cd ~/dockerfile
touch dockerfile1
步骤 3 使用vi编辑器编辑dockerfile1,做个最简单的让大家感受一下
vi dockerfile1
步骤 4 构建镜像,镜像命名为httpd:v11
docker build -t httpd:v11 -f dockerfile1 /root/dockerfile
步骤 5 查看创建的镜像。
docker images
步骤 6 以镜像httpd:v11运行一个容器。
docker run -d -p 8081:80 httpd:v11
步骤 7 验证容器内容。
好了,使用dockerfile制作镜像的方法,我们就讲到这里了,更多内容大家可以继续关注。