公司技术同事在讨论搭建一个Docker镜像自动构建系统,该怎么做?

急速马力快de源码客


一个非常好的问题。我是工作多年的Web应用架构师,来回答一下这个问题。欢迎关注我,了解更多IT专业知识。


Docker是一个开源的应用容器引擎,将应用以及依赖打包到一个可移植的镜像中,部署到服务器并运行在Container容器实例中。


构建Docker镜像时,在实际使用中有一些误区:

1,Docker镜像由工程师在本地构建,然后推送到Docker hub或者其他镜像仓库。

2,程序编译打包使用Jenkins自动构建,得到运行包后上传到代码库中,手动或者自动构建Docker镜像。

3,。。。


Docker镜像应该通过自动构建系统,从源代码开始,编译打包,构建镜像,不应该手动上传下载运行包,也不应该使用预先编译好的运行包。


阿里云容器镜像服务提供Docker镜像仓库托管,配置项目代码Git仓库和构建规则,轻松实现自动化。进一步结合Dockerfile强大功能实现云端编译打包。


操作演示:https://www.ixigua.com/i6802181124291461639/

详细配置步骤:https://www.toutiao.com/i6802179342320271879/


急速马力快de源码客


关于Docker里面的几个主要概念

这里用个不太恰当的比方来说明。

大家肯定安装过ghost系统,镜像就像是ghost文件,容器就像是ghost系统。你可以拿别人的ghost文件安装系统(使用镜像运行容器),也可以把自己现有的系统制作成ghost文件(从容器构建镜像)。Dockerfile则像是一个生成ghost文件的脚本(镜像构建脚本),这个脚本会指定去哪里下载哪个版本的window系统,再去哪里下载哪些软件并安装,再修改哪些配置文件,等等。本文主要讲的是,如何从容器构建镜像(把现有系统制作成ghost文件),和如何使用Dockerfile构建镜像(使用脚本生成ghost文件)。

两种方式构建镜像的主要步骤:

从容器构建镜像(以下简称容器镜像)

创建一个容器,比如使用 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里面指令的详细说明,这里就不一一列出了,大家可以参考官方文档,当然网上也是一搜一大堆。




通信人的自我修养


两种方式构建镜像,一种是使用Dockerfile构建镜像,通过编写dockerfile文件,使用build命令来构建。

另一种是直接从容器构建镜像,首先创建一个容器,比如使用tomcat:latest镜像创建一个tomcat-test容器,然后通过修改容器的文件系统,使用commit提交镜像。

dockerfile镜像是完全透明的,所有构建的指令都能看到,只需要改dockerfile里面的指令就能修改镜像,再重新构建生成就行。重点是可以托管在GitHub上,dockerhub自动关联源码进行构建,dockerfile或者父镜像发生变化时,都会触发镜像的自动构建。推荐使用这个。

从容器构建的话,都是要自己手动修改容器的文件系统再发布,操作者不会把每一步记录,都记录下来,要不然太麻烦了。总之相当于全程手动配置,平常自己搭建测试测试无所谓,真正项目的时候还是算了吧。就相当于别人写个脚本,服务器自动运行,然后就可以休息了。而你使用容器镜像,全程手动,只能看着别人休息,服务器镜像还会越来越臃肿。


果蔬烘干机


docker官方提供这个功能,关联github账号里的项repository,选择好branch,只要有提交就可以自动build


龙天63730502


shell 脚本大法好,加上linux的定时任务系统,把脚本写好,也可以用一些队列系统,比如python的celery,再写个web界面看数据


校园微距离


像 gitlab ,自带这种功能,还有很多类似的CI,CD系统,都带这种功能


阿尔法软件测评


多试试,多实践,有问题了查就OK


分享到:


相關文章: