我们学会了在主机上安装部署docker,也学会了构建自己的docker镜像和容器,启停也都会用了,下一步就需要持续构建发布docker的技能了。

我们希望能在代码提交后,有个远程服务能自动开始构建项目、拉取相应的镜像,执行对应的Dockerfile命令,最终给我们生成一个可以直接启动的contrainer容器,之后我们就可以将该容器发布到任何主机了。

现在有一些第三方的docker管理平台能提供上面的功能,如DaoCloud、网易蜂巢、阿里云docker平台等。这里我们以DaoCloud为例来看看怎么完成持续化构建。

1 创建DaoCloud项目

首先,注册个DaoCloud账号,进入控制台。


在这里创建一个项目,指定个名字,设置代码源。

可以看到,它给了几个选项,譬如GitHub,gitlab,git地址等。选择自己代码托管的地方,复制项目的git地址。

需要注意的是,GitHub和自己搭的git地址或者其他平台的git地址,在最终的持续构建时功能有所不同,GitHub的能够做到一提交代码就自己开始构建,而git地址只能手工点一下构建。见官方文档说明:http://guide.daocloud.io/dcs/git-9870399.html

我这里使用的是oschina的git地址,代码托管到git.oschina.net,输入项目的git地址后,点开始创建即可。

2 设置流程


可以看到右上角有个push触发或手动触发,由于我们使用的是git地址,所以只能手动触发。

流程定义系统默认给了3个阶段,测试、构建和发布,可以分别点开看看是什么。


这里有个基础镜像,环境变量还有左上角的触发条件等的配置。如果你需要进行一些构建前的测试,就可以添加安装命令、预备动作什么的,也可以替换基础镜像。

由于我只是用它来构建镜像,所有直接把测试任务给删掉了,只保留个构建任务


构建路径为“/”,代表是项目根目录,Dockerfile可以使用本地和云端,我使用本地,在项目的根目录添加一个Dockerfile文件


这是一个初始化的Springboot项目,我在application里添加了Controller标签,输出了一句“hello docker”,仅此。

FROM hub.c.163.com/wuxukun/maven-aliyun:3-jdk-8

ADD pom.xml /tmp/build/

ADD src /tmp/build/src
        #构建应用
RUN cd /tmp/build && mvn clean package \
        #拷贝编译结果到指定目录
        && mv target/*.jar /app.jar \
        #清理编译痕迹
        && cd / && rm -rf /tmp/build

VOLUME /tmp
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]

上面的Dockerfile文件,Springboot项目依赖的基础镜像很简单,只需要maven和jdk即可,当然如果你里面用了数据库、redis什么的,只有maven和jdk就不行了。当然,最好是选择云数据库,避免在docker里安装数据库、redis之类的。这样你的镜像就比较小,也不与容器内的数据绑定了,更便于集群使用。

为毛我的from镜像是那么长一串,而不是maven3-jdk-8的基础镜像呢,这可是我精心找的最快的适合Springboot基础镜像了。

众所周知,很多原始镜像下载速度很慢,而maven的依赖下载更是慢上加慢,平时开发中我们都习惯于使用阿里的maven仓库。这个基础镜像就是集成的阿里的maven库,而是地址在国内,下载飞快。

在项目根路径编辑好dockerfile后,把项目提交到git上即可。

然后就可以点击手动触发了


填写项目的分支或标签,譬如我的项目分支master,输入master确定即可。就可以看到构建过程开始了。

构建时,你可以点击该流程,就能看到日志,里面进行Dockerfile各种你设定好的流程。


3 得到镜像

构建完成后可以看到执行的历史

这时DaoCloud就已经为我们的代码构建完了一个docker镜像了,并且将镜像放到了DaoCloud中我们私有的镜像库中,我们就可以在任何地址拉取这个镜像,就像拉取任何一个公开的镜像一样。
你可以点击上图中,“镜像:testdocker”,进入镜像的详情页,
右上角就是该镜像的地址,你可以在任何地方拉取它,在设置里有访问控制,默认私有,就是当你拉取该镜像时需要输入DaoCloud的账号密码。公开的话就是任何人都可以拉取该镜像,不需要验证。


然后大家就可以在自己的主机上拉取这个镜像,并部署启动了。
下一篇来看看使用rancher来分发镜像到主机、多个容器负载均衡。





Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐