栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Dockerfile详解

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Dockerfile详解

一、介绍 1.基于dockerfile创建

dockerfile是由一组指令组成的文件。

dockerfile结构四部分

基础镜像信息维护者信息镜像操作指令容器启动时执行指令

dockerfile每行支持一条指令,每条指令可携带多个参数,支持使用以“#”号开头的注释

二、操作指令

1.ADD和COPY的区别
COPY只能用于复制,ADD复制的同时,如果复制的对象是压缩包,ADD还可以解压。但是COPY比ADD节省资源。
2.CMD和ENTRYPOINT的区别
CMD设置容器启动后默认执行的命令及其参数,但CMD能够被docker run后面跟的命令行参数替换(覆盖)。如果docker run没有指定任何的执行命令或者dockerfile里面也没有entrypoint,那么就会使用cmd指定的默认执行命令执行。cmd命令只有最后一个会生效。
entrypoint指定容器启动时要执行的命令,可以追加命令。entrypoint指定的命令需要与docker run启动容器进行搭配,将docker run指令后面跟的内容当做参数作为entrypoint指令指定的运行命令的参数,entrypoint指定的linux命令一般是不会被覆盖的。entrypoint指令并不是必须的,因为它会增加复杂度。

总结:
CMD 是容器环境启动时默认加载的命令。
ENTRYPOINT 是容器环境启动时第一个加载的命令程序/脚本程序 init(init pid 1)

如果 ENTRYPOINT 使用了 shell 模式,CMD 指令会被忽略。
如果 ENTRYPOINT 使用了 exec 模式,CMD 指定的内容被追加为 ENTRYPOINT 指定命令的参数。
如果 ENTRYPOINT 使用了 exec 模式,CMD 也应该使用 exec 模式。
ENTRYPOINT ["sh","-c","echo $HOME"]

三、docker镜像的分层

镜像不是一个单一的文件,而是有多层构成。容器其实是在镜像的最上面加了一层读写层,在运行容器里做的任何文件改动,都会写到这个读写层。如果删除了容器,也就删除了其最上面的读写层,文件改动也就丢失了。Docker 使用存储驱动管理镜像每层内容及可读写层的容器层。

Dockerfile 中的每个指令都会创建一个新的镜像层

镜像层会被缓存和复用(下一层执行完后的缓存会给上一层使用)

当 Dockerfile 的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效
如果某层命令修改了,当前缓存层会失效,上层引用当前缓存层的也会失效,需要重构镜像,常用于版本升级(功能修改、添加)

镜像层是不可变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然会包含该文件,只是这个文件在 Docker 容器中不可见了

Docker 镜像每一层有唯一的编号,可以通过 docker history 来查看一个镜像由哪些层组成

四、dockerfile基础编写 例:tomcat镜像

Dockerfile镜像实例 - 丨君丶陌 - 博客园 (cnblogs.com) 五、dockerfile优化

我们在构建镜像的时候会发现官网上下的镜像比我们自己构建的镜像小很多,这是因为官网上下载的镜像都经过了优化,常用的优化方式有以下几种:

不需要输出的指令丢入/dev/null减少RUN构建多阶段构建(使用FROM命令生成多个镜像,将指定的镜像做为其他镜像的基础镜像环境来构建)使用更为轻量级的Linux发行版本(debian,alpine)

未优化之前

不需要输出的指令丢入/dev/null

减少RUN构建

多阶段构建

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/705734.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号