Dockerfile 中的保留字指令讲解
之前简单学过 Docker,当时是为了快速部署一个项目,过的很快,对于 Dockerfile 文件的编写,有些显的陌生。
所以就写了这篇文章。希望能够帮助到大家哦!!!
一、Dockerfile 是什么?
概念:
Dockerfile 是用来构建 Docker 镜像的构建文件,由一系列命令和参数构成的脚本
构建三步骤:
编写 Dockerfile 文件
docker build
docker run
Centos 案例:
在哪找到的勒,在 hub.docker.com 上找到滴:centos。
我们不会,但是可以先去看看人家怎么写的,抄作业这事,我想大家都熟悉吧。俗称 CV 大法😂。
二、Dockerfile 构建过程分析
入门知识:
每条保留字指令(今天的重点)都必须为
大写字母
并且后面要跟随至少一个参数
。如:
指令按照从上到下,顺序执行
#
表示注释。
每条指令都会创建一个新的镜像层,并对镜像进行提交。
就如下面这样,可以套娃一样。
Dockerfile 执行流程分析:
docker
从基础镜像运行一个容器执行一条指令并对容器作出修改
执行类似
docker commit
的操作提交一个新的镜像层。docker
再基于刚提交的镜像运行一个新容器执行
dockerfile
中的下一条指令直到所有指令都执行完成
后文有案例,结合案例回过来看更容易理解。
小小番外:
在现阶段,我们将Dockerfile
、Docker
镜像和Docker
容器看待为软件的三个不同阶段。
Dockerfile
面向开发--->Docker 镜像成为交付标准--->Docker 容器则涉及部署与运维
在
Dockerfile
中定义了进程所需要的一切东西,以前需要依赖的环境变量、依赖包、运行时环境等都被写入到Dockerfile
文件中啦。比起之前你在 Liunx 服务器中,下载那么那么多软件,配置那么那么多,真的是简单蛮多,起码对于我这个菜鸡来说用 Docker 部署真的简单了蛮多的。Docker
镜像是在用Dockerfile
定义了一个文件后,docker build 时产生的一个 Docker 镜像,当运行时Docker
镜像时,才会真正开始提供服务。Docker 容器就是运行起来即可提供服务的。
三、Dockerfile 保留字指令
Dockerfiel 保留字指令大致有以下:
FROM
MAINTANINER
RUN
EXPOSE
WORKDIR
ENV
ADD
COPY
VOLUME
CMD
ENTRYPOINT
ONBUILD
3.1、FROM
基础镜像,即当前新镜像是基于哪个镜像创建的。
3.2、MAINTAINER
镜像维护者的姓名和邮箱地址
3.3、RUN
容器构建时需要运行的指令
3.4、EXPOSE
当前容器对外暴露的端口
3.5、WORKDIR
指定在创建容器后,终端默认登录的进来工作目录
3.6、ENV
用来在构建镜像过程中设置环境变量
这个环境变量可以在后续的任何 RUN 指令中使用,这就如同在命令前面指定了环境变量前缀一样;也可以在其它指令中直接使用这些环境变量。
如:
3.7、ADD 和 COPY
ADD:
将宿主机目录下的文件拷贝进镜像,并且 ADD 命令会自动处理 URL 和解压 tar 压缩包
COPY:
类似 ADD,拷贝文件和目录到镜像中。
将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置
3.8、VOLUME
容器数据卷,用于数据持久化和数据保存。
3.9、CMD 和 ENTRYPOINT
CMD
CMD 的指令和 RUN 相似,也是两种格式:
shell
格式:CMD<命令>exec
格式:CMD ["可执行文件“,”参数 1“,”参数 2“.....]
Dockerfile
中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被docker run
之后的参数替换。
ENTRYPOINT
指定一个容器启动时要运行的命令。
ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数。
区别:
在这里先简单说明一下区别,你可以将 CMD 理解为覆盖
这两条指令都写在Dockerfile
文件中,只会执行 CMD /bin/bash ,而不会执行CMD cat /conf/my.cnf
,因为CMD /bin/bash
把上一条直接覆盖掉了。
而ENTRYPOINT
则不同,你可以将ENTRYPOINT
简单理解为追加。
主要体现在docker run
上,如果使用dockerfile
文件中最后是CMD
结尾,则在运行时不能够额外追加命令,否则会覆盖掉Dockerfile
中的CMD
命令。
而Dockerfile
文件中最后一行为ENTRYPOINT
结尾时,你可以在docker run
命令后追加一些命令.
3.10、ONBUILD
当构建一个被继承的Dockerfile
时运行命令,父镜像在被子继承后,父镜像的onbuild
被触发。
四、实战案例
4.1、制作一个自己的 Centos 镜像
4.1.1、引入:
我们先从阿里云上拉取一个 centos 看看,看看有哪些问题,然后我们再进行自定义。
为什么会这样?因为 docker 仓库中的 Centos 是精简版,其只有内核,没有其它的东西。
要求自定义的 Centos 能够解决上述问题。
4.1.2、编写 Dockerfile 文件
为我们自定义的 Centos 编写 Dockerfile 文件
然后把这个复制进去即可。
4.1.3、构建 centos 镜像
解释:
-f:后面跟随的是 Dockerfile 文件
-t :后面跟随的镜像名和版本号。
最后的小数点:就表明是当前目录。
执行:
看到最后的这个就是代表成功了。
docker images
查看全部镜像:
4.1.4、运行 Centos 镜像
之所以我们进去容器的目录会从/
切换到/usr/local
是因为在 dockerfile 文件中已经写明。
4.1.5、查看镜像的变更历史
在这里也可以看出来,镜像它是由 Dockerfile 文件中的指令,一层一层构建出来的。
4.2、ONBUILD 示例
率先构建一个夫镜像
编写dockerfile
文件,命名为dockerfile2
构建一个镜像继承夫镜像
编写dockerfile
文件,命名为dockerfile3
哈
可以看到父镜像中的语句被输出了。
五、自言自语
纸上得来终觉浅,绝知此事要躬行。
一名喜欢文艺却踏上编程这条道路的小青年。
希望:
我们,待别日相见时,都已有所成
。
换个小猫表情,我们一起击个掌吧。
版权声明: 本文为 InfoQ 作者【宁在春】的原创文章。
原文链接:【http://xie.infoq.cn/article/020d7d2d1a5e51306d695da33】。文章转载请联系作者。
评论