浅析Docker镜像分层的注意事项
前言
我们平常在对程序进行Docker镜像打包的时候总会有些困惑,到底是将最终的镜像分层打包最后汇总成程序的镜像(也就是一层一层的 From )合适,还是说直接将程序从Source code就打包出最终的镜像更合适呢?其实这里面没有说那个是对或错的,要看程序包自身的情况做选择。
Docker build的注意点
如果接触过Docker,Docker build大家都清楚怎么用了,但是有几个容易忽略的注意点:
1、Dockerfile开头的 From 和 MAINTAINER 其实都是一层镜像
2、如果 From 和 MAINTAINER 不同,就算是后面的命令语句相同也不会是相同的镜像。如都是执行 RUN echo "hello world" >> test.txt
,如果 MAINTAINER 不同,则生成的这个语句的镜像层将是不同的。
3、原理上如果每一层对应的父层不同,那怕执行的命令相同,Docker也会生成一层新的镜像,如下面两个Dockerfile文件
Dockerfile 1:
FROM centos:latest MAINTAINER duffqiu@gmail.com RUN echo "test" >> hello.txt RUN echo "hello" > test.txt
Dockerfile 2:
FROM centos:latest MAINTAINER duffqiu@gmail.com RUN echo "hello" > test.txt RUN echo "test" >> hello.txt
这两个文件的内容只是两个 RUN 语句顺序不一样,但是最后它们生成的image层是不一样的,可以通过 docker history <image name>
来对比
从这里面也看到一个问题,From最好不要用lastest标签,避免不同镜像的顶层是不同,从而无法复用。
实践建议
需要看具体情况,如果有一个包是公用的,且比较大,则最好先将这个包打成Image再给后续的程序打包使用,这样使用时占用的机器磁盘空间最小,启动时如果需要pull的话也最快。
但是如果包本身就是很小,过细的分层也不利于维护和管理,所以最终还是一个艺术问题
总结
以上就是这篇文章的全部内容,希望这篇文章的内容对大家的学习或者工作能有一定的帮助,如果有疑问大家可以留言交流。
相关推荐
-
Docker 下载镜像慢的问题解决方法
docker 解决下载镜像慢 使用Docker pull 镜像这个超级慢,因为docker的hub是在国外的,所以是特别慢的,有什么办法可以解决这个问题么?答案肯定是有的,我们可以使用docker的代理的解决这个问题,大家要自己准备一个可以使用的http代理地扯 原文. 代理设置 此文使用的系统是fedora 创建一个docker service目录 mkdir /etc/systemd/system/docker.service.d 创建 /etc/systemd/system/docker.
-
Docker 镜像和容器的区别详解
最近学习Docker,被Docker 的镜像和容器搞的晕头转向,索性上网查找相关资料并整理下彻底的理解这块内容,有需要的小伙伴可以看下,少走点弯路. Docker的镜像和容器的区别 一.Docker镜像 要理解Docker镜像和Docker容器之间的区别,确实不容易. 假设Linux内核是第0层,那么无论怎么运行Docker,它都是运行于内核层之上的.这个Docker镜像,是一个只读的镜像,位于第1层,它不能被修改或不能保存状态. 一个Docker镜像可以构建于另一个Docker镜像之上,这种层
-
Docker在CentOS7下不能下载镜像timeout的解决办法(图解)
今天小编给大家记录下Docker在CentOS7下不能下载镜像timeout的问题,先给大家说下问题的来龙去脉. 问题描述: 昨天买了六个月阿里云服务器的学生机用来部署毕设环境,在鼓捣docker的时候出现问题,docker安装成功并且已经成功启动,如图 但在pull镜像的时候却出现超时无法下载镜像的问题,估计是国内docker官方镜像被墙了,网上找了好久发现要使用国内镜像加速,推荐的有Daocloud和阿里云,我使用的是Daocloud镜像加速,注册了账号之后上方会有一个镜像加速的超链接 点进
-
docker在已有的tomcat镜像上打新的镜像的Dockerfile编写说明介绍
如果需要将某个文件替换或者添加到旧的tomcatimage中,形成一个新的image,需要在dockerfile中做一下操作 FROM old_tomcat #这里可以使用docker官方的镜像,以下说明都是在此基础上的实例 MAINTAINER ****************** #如果需要替换原有的配置文件或者脚本 ADD web.xml /usr/local/tomcat/webapps/manager/WEB-INF/ ADD tomcat-users.xml /usr/local/t
-
简单谈谈Docker镜像的使用方法
在上篇文章(在Docker中搭建Nginx服务器)中,我们已经介绍了如何快速地搭建一个实用的Nginx服务器.这次我们将围绕Docker镜像(Docker Image),介绍其使用方法.包括三部分: 从Docker Hub或者其他镜像源安装Docker镜像 从Image file安装Docker镜像 从Docker file制作Docker镜像 查找Docker镜像 安装Docker镜像的第一步,是查找你需要的Docker镜像列表,键入: docker search mysql 如果出现权限问题
-
Docker创建镜像、怎么修改、上传镜像等详细介绍
Docker 创建镜像.修改.上传镜像 –创建镜像有很多方法,用户可以从 Docker Hub 获取已有镜像并更新,也可以利用本地文件系统创建一个. 一.创建镜像 创建镜像有很多方法,用户可以从 Docker Hub 获取已有镜像并更新,也可以利用本地文件系统创建一个. 二.修改已有镜像 1.先使用下载的镜像启动容器. $ docker run -t -i training/sinatra /bin/bash root@0b2616b0e5a8:/# 注意:记住容器的 ID,稍后还会用到. 2.
-
Docker创建镜像两种方法详解
Docker创建镜像 最近学习Docker 的知识,偶然在网上看到关于Docker 创建对象的两种方法很好,这里记录下,也许可以帮助到你. 我们都知道Docker中我们是基于镜像来运行的容器,那如何创建镜像呢?创建镜像有两种方法,一是使用docker commit命令,二是使用docker build命令和Dockerfile文件.这里我们说的创建镜像是指基于一个已有的基础镜像比如ubuntu等,而不是从零创建一个全新的镜像. 下面分别简单介绍一下两种方法.
-
两种方式创建docker镜像的启动容器时区别介绍(总结篇)
Docker是建立在Linux内核基础上的,在目前的主流Linux系统中,都已经原生支持了Docker且使用体验也最好,当然,在Windows平台和MacOS系统中也支持Docker,只是需要使用类似Boot2Docker等虚拟化工具来提供Linux支持. 下面重点给大家介绍基于两种创建docker镜像的启动容器时区别,感兴趣的朋友可以跟着小编一起学习! 1.凡是用docker commit生成的镜像启动的时候可以加载一个启动自己应用的脚本,例如: docker run -d -P tomcat
-
利用Docker制作Nginx+PHP镜像的步骤详解
前言 这篇文章给大家介绍的是使用Docker制作nginx+php的镜像,本文里的镜像是centos + nginx 1.9.7 + php 5.6.14,下面话不多说,直接看实现的步骤吧. 1.首先下载到nginx和php: nginx-1.9.5.tar.gz 下载:http://nginx.org/en/download.html php-5.6.14.tar.gz 下载:>http://php.net/downloads.php 2.以及扩展包so: memcache-2.2.4.t
-
Docker镜像制作详解介绍
最近由于工作原因,需要对Docker镜像进行制作,这里记录下,也许对大家也有一定帮助! 写在前面:本文docker镜像制作方法更适用于基于已有docker镜像一次性修改. 推荐用Docker File制作docker镜像. 原理是一样的,但是用docker file制作docker镜像能够记录下操作步骤,方便以后更改或者镜像丢失后重新创建. 本文以Ubuntu为基础镜像,预启动一个django项目和ssh服务,制作一个新的镜像. 1.基础镜像 我选用的是从Docker官网下载的ubuntu镜像.
-
深入了解docker(docker镜像、容器、仓库的基本概念)
本文重点给大家介绍docker镜像.容器.仓库的基本概念的知识. Docker概念 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何接口. 镜像 Docker 镜像就是一个只读的模板. 例如:一个镜像可以包含一个完整的 CentOS 操作系统环境,里面仅安装了 httpd或用户需要的其它应用程序. 镜像可以用来创建 Docker 容器. Dock
随机推荐
- BAT与HTML混合编程写法
- js点击按钮实现带遮罩层的弹出视频效果
- 浅谈互斥锁为什么还要和条件变量配合使用
- JavaScript 选中文字并响应获取的实现代码
- Elasticsearch.Net使用入门教程(1)
- php比较两个字符串长度的方法
- php获取当前时间的毫秒数的方法
- JS解决url传值出现中文乱码的另类办法
- Python代码解决RenderView窗口not found问题
- JavaScript 计算当天是本年本月的第几周
- win10设置java环境变量的方法
- js注入 黑客之路必备!
- 详解备忘录模式及其在Java设计模式编程中的实现
- Android实现不同apk间共享数据的方法(2种方法)
- Android仿UC底部菜单栏实现原理与代码
- PHP下的浮点运算不准的解决方法
- JavaScript实现写入文件到本地的方法【基于FileSaver.js插件】
- webpack 模块热替换原理
- 开发环境Ubuntu16安装以后的初始化设置
- Java集合总结