关于Docker里面的几个主要概念
这里用个不太恰当的比方来讲明。docker
你们确定安装过ghost系统,镜像就像是ghost文件,容器就像是ghost系统。你能够拿别人的ghost文件安装系统(使用镜像运行容器),也能够把本身现有的系统制做成ghost文件(从容器构建镜像)。Dockerfile则像是一个生成ghost文件的脚本(镜像构建脚本),这个脚本会指定去哪里下载哪一个版本的window系统,再去哪里下载哪些软件并安装,再修改哪些配置文件,等等。本文主要讲的是,如何从容器构建镜像(把现有系统制做成ghost文件),和如何使用Dockerfile构建镜像(使用脚本生成ghost文件)。tomcat
两种方式构建镜像的主要步骤:
- 从容器构建镜像(如下简称容器镜像)
- 建立一个容器,好比使用
tomcat:latest
镜像建立一个tomcat-test容器
- 修改tomcat-test容器的文件系统,好比修改tomcat的server.xml文件中的默认端口
- 使用commit命令提交镜像
- 使用Dockerfile构建镜像(如下简称Dockerfile镜像)
- 编写Dockerfile文件
- 使用build命令构建镜像
两种构建方式的区别:
- 容器镜像的构建者能够任意修改容器的文件系统后进行发布,这种修改对于镜像使用者来讲是不透明的,镜像构建者通常也不会将对容器文件系统的每一步修改,记录进文档中,供镜像使用者参考。
- 容器镜像不能(更准确地说是不建议)经过修改,生成新的容器镜像。
从镜像运行容器,其实是在镜像顶部上加了一层可写层,全部对容器文件系统的修改,都在这一层中进行,不影响已经存在的层。好比在容器中删除一个1G的文件,从用户的角度看,容器中该文件已经没有了,但从文件系统的角度看,文件其实还在,只不过在顶层中标记该文件已被删除,固然这个标记为已删除的文件还会占用镜像空间。从容器构建镜像,其实是把容器的顶层固化到镜像中。
也就是说, 对容器镜像进行修改后,生成新的容器镜像,会多一层,并且镜像的体积只会增大,不会减少。久而久之,镜像将变得愈来愈臃肿。Docker提供的 export
和 import
命令能够必定程度上处理该问题,但也并非没有缺点。
- 容器镜像依赖的父镜像变化时,容器镜像必须进行从新构建。若是没有编写自动化构建脚本,而是手工构建的,那么又要从新修改容器的文件系统,再进行构建,这些重复劳动实际上是没有价值的。
- Dockerfile镜像是彻底透明的,全部用于构建镜像的指令均可以经过Dockerfile看到。甚至你还能够递归找到本镜像的任何父镜像的构建指令。也就是说,你能够彻底了解一个镜像是如何从零开始,经过一条条指令构建出来的。
- Dockerfile镜像须要修改时,能够经过修改Dockerfile中的指令,再从新构建生成,没有任何问题。
- Dockerfile能够在GitHub等源码管理网站上进行托管,DockerHub自动关联源码进行构建。当你的Dockerfile变更,或者依赖的父镜像变更,都会触发镜像的自动构建,很是方便。
** 无论是官方仍是我我的,都推荐使用第二种方式构建镜像。**网站
关于Dockerfile里面指令的详细说明,这里就不一一列出了,你们能够参考官方文档,或关注我以后的文章,固然网上也是一搜一大堆。ui