Docker镜像分层的注意点

开发 开发工具
通常我们在对程序进行Docker镜像打包的时候总会有些困惑,到底是将最终的镜像分层打包最后汇总成程序的镜像(也就是一层一层的From)合适,还是说直接将程序从Source code就打包出最终的镜像更合适呢?其实这里面没有说那个是对或错的,要看程序包自身的情况做选择。

[[186009]]

Docker镜像打包程序的困惑

通常我们在对程序进行Docker镜像打包的时候总会有些困惑,到底是将最终的镜像分层打包***汇总成程序的镜像(也就是一层一层的From)合适,还是说直接将程序从Source code就打包出最终的镜像更合适呢?其实这里面没有说那个是对或错的,要看程序包自身的情况做选择。

Docker build的注意点

如果接触过Docker,Docker build大家都清楚怎么用了,但是有几个容易忽略的注意点:

  • Dockerfile开头的From和MAINTAINER其实都是一层镜像
  • 如果From和MAINTAINER不同,就算是后面的命令语句相同也不会是相同的镜像。如都是执行RUN echo "hello world" >> test.txt,如果MAINTAINER不同,则生成的这个语句的镜像层将是不同的。
  • 原理上如果每一层对应的父层不同,那怕执行的命令相同,Docker也会生成一层新的镜像,如下面两个Dockerfile文件

Dockerfile 1:

  1. FROM centos:latest 
  2. MAINTAINER duffqiu@gmail.com 
  3. RUN echo "test" >> hello.txt 
  4. RUN echo "hello" > test.txt 

Dockerfile 2:

  1. FROM centos:latest 
  2. MAINTAINER duffqiu@gmail.com 
  3. RUN echo "hello" > test.txt 
  4. RUN echo "test" >> hello.txt 

这两个文件的内容只是两个RUN语句顺序不一样,但是***它们生成的image层是不一样的,可以通过docker history <image name>来对比

  • 从这里面也看到一个问题,From***不要用lastest标签,避免不同镜像的顶层是不同,从而无法复用。

实践建议

需要看具体情况,如果有一个包是公用的,且比较大,则***先将这个包打成Image再给后续的程序打包使用,这样使用时占用的机器磁盘空间最小,启动时如果需要pull的话也最快。

但是如果包本身就是很小,过细的分层也不利于维护和管理,所以最终还是一个艺术问题。

【本文是51CTO专栏作者“VIPDOCKER-了哥 ”的原创文章,如需转载请通过51CTO与作者联系】

戳这里,看该作者更多好文

责任编辑:武晓燕 来源: 51CTO专栏
相关推荐

2015-08-26 11:27:26

DockerDeviceMappe分层镜像

2012-11-20 09:24:45

路由器端口镜像

2010-08-31 16:39:56

2022-05-26 08:31:41

分层机制优化

2019-07-16 14:44:52

DockerMySQL操作系统

2017-10-12 10:28:48

Docker镜像存储

2023-04-19 08:07:24

接口文档设计

2023-09-10 07:20:35

2020-08-13 07:24:27

IP地址网络协议网络

2020-12-02 06:14:35

秒杀系统

2013-04-25 10:01:35

Nginx

2018-11-15 10:04:02

机柜方法布线

2019-06-23 16:02:12

Kubernetes集群节点高并发

2021-07-30 09:00:40

鸿蒙HarmonyOS应用

2015-10-08 09:28:47

JavaDocker镜像

2014-12-15 09:16:10

DockerDaoCloud镜像部署

2021-09-02 07:04:45

Docker镜像语言

2010-04-29 12:32:30

Unix服务器

2011-04-28 11:13:02

2009-07-16 09:25:27

Java常量定义
点赞
收藏

51CTO技术栈公众号