开发者社区> 余二五> 正文

jenkins+docker的简单项目部署

简介:
+关注继续查看

怎么使用docker实现新项目的发布,一般有两种方式,以一个web容器为例:

  1:定制一个通用的web容器镜像,以逻辑卷-v的方式,关联webapp目录到宿主机,每次发布新版本时只需要更新宿主机上关联目录的项目包(例如war包),然后重启web的相关docker容器。完成新版本发布。

  2:以dockerfile的方式,每次发布新版本时,把相应的程序包传入dockerfile,一起打包成一个新的web容器镜像,停止旧版本的容器,然后以新镜像启动容器。完成新版本发布。


这里我想以dockerfile的方式做结合jenkins做一个简单的自动部署实验:

  首先po上大概的流程:

wKioL1dM-0PhYV94AAByooLmLVU824.png

  1:开发人员发布新代码,上传至本地gitlab。

  2:jenkins开始构建,拉取新的代码,利用dockerfile把新代码传入docker,制作一个全新的镜像,上传至本地的docker私有仓库。

  3:项目服务器拉取新的镜像。

  4:关闭原有在运行的项目容器,使用新的镜像开启容器。项目发布完成


实现:

实验环境:

  jenkins:192.168.1.224

  docker宿主机:192.168.1.120

发布前状态:

  这里我使用简单的一个web页面演示一个发布的流程,web容器使用的是resin。

  当前运行的docker容器信息如下:

wKiom1dM--bQwYgYAAAdcg3JVcQ550.png

  当前运行的web容器镜像为registry.cmh.cn/test:V2,容器名称为test_V2,容器内部的8080端口映射到宿主机的8080端口。

  当前的页面显示如下:(hello.txt充当本例要更新的代码部分)

wKioL1dM_K_CRcPVAAAoAMKHuCg686.png


实验准备:

  1:配置docker私有仓库,安装jenkins。(不在本博客范畴)

  2:dockerfile,这里的dockerfile定制一个resin的images,具体配置和写法因人而异。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# more /opt/scripts/Dockerfile/resin/Dockerfile 
#create a images of resin environment..
FROM centos_java
 
MAINTAINER chenminghui "359275330@qq.com"
 
RUN echo 'RESIN_HOME=/opt/apps/resin' >> /etc/profile && echo 'PATH=$PATH:$JAVA_HOME/bin/:$JAVA_HOME/jre/bin/' >> /etc/profle && source /etc/profile
ENV JAVA_HOME=/opt/apps/jdk1.8.0_51/
 
#copy files to new images
ADD resin-pro-4.0.42.tar.gz /opt/apps/
RUN cd /opt/apps/resin-pro-4.0.42 && yum install -y gcc make.x86_64 openssl.x86_64 openssl-devel.x86_64  && ./configure --prefix=/opt/apps/resin  --libexecdir=/opt/apps/resin/libexec  --enable-jni --enable-64bit && make && make install
COPY pro.jar /opt/apps/resin/lib/ 
COPY gzlife-ad.sh /opt/scripts/resin.sh
COPY gzlife-ad.xml /opt/conf/resin/
COPY /webapps/hello.txt /opt/webapps/          ----------这里把更新的代码hello.txt,传入镜像的相关目录,供resin使用。
EXPOSE 8080
ENTRYPOINT sh /opt/scripts/resin.sh start && /bin/bash

  3:jenkins所需的构建脚本,这里的脚本相对简单,主要就是传入IP,项目,版本三个参数。进行拉取代码,制作镜像,上传镜像,远程拉取镜像以及启动容器等。(具体的脚本各位看官可自己写,这里只是做个简单的例子)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#more /opt/scripts/devops.sh 
#!/bin/sh
IP=$1
PROJECT=$2
VERSION=$3
 
echo "############git new code....#############"
cd /opt/scripts/Dockerfile/resin/webapps
git pull git@code.gzlife.cn:chenminghui/cmhtest.git
 
echo "#################build new images and push to private registry###########"
docker build -t registry.cmh.cn/test:${VERSION} /opt/scripts/Dockerfile/resin
docker push registry.cmh.cn/test:${VERSION}
 
echo "###########download new images and start new version of project##########"
ssh $IP "docker pull registry.cmh.cn/test:${VERSION}"
CONTAINER=`ssh $IP "docker ps | grep ${PROJECT}" awk '{print $1}'`
ssh $IP "docker stop ${CONTAINER}"
ssh $IP "docker run -idt --name=${PROJECT}_${VERSION} -p 8080:8080 registry.cmh.cn/test:${VERSION}"

  4:jenkins新建一个构建工程,如下:(IP为web容器的ip,PROJECT为项目名称,VERSION为版本信息)

wKioL1dNANijG12sAABDvAbWzMc204.png


wKiom1dM_9zDx0AKAAAQUrBZP0A430.png

  以上准备好之后,就可以开始跑我们的构建流程了。


部署新项目:

  1:更新hello.txt,push新代码至gitlab。

wKioL1dNAfXCwgJtAACNaeaZz3s889.png

  2:jenkins填写相关参数,开始构建:

wKiom1dNAaSwoFB1AACCNtPIVLU160.png

  3:静静等待构建完成:(可以看看构建信息)

wKiom1dNAhXAusuRAAAdDtSqLG8563.png

  构建如果没有报错,则可以看到SUCCESS的结构,说明构建部署完毕。

  4:查看页面:

wKiom1dNAnDx4lkeAAAqQ-vpCM0938.png

  可以看到新的代码已经生效。


 5:查看容器运行状态

wKioL1dNBV3AFgBJAAAp3TzeOUo943.png

  可以看到运行了新的容器,名字为test_V3,镜像使用的是registry.cmh.cn/test:V3。旧版本容器test_V2被关闭。

  如果发布的新版本有异常,可以停止test_V3,启动test_V2。这样就可以迅速实现版本的回退。


后记:

  该例子只是一个简单的实践,生产环境肯定要复杂的多,要根据具体项目制定不同的部署步骤和需求。但是这个例子可以提供一个简单的思路给大家参考。

  该例子适用于针对单一的web部署的环境。










本文转自 icenycmh 51CTO博客,原文链接:http://blog.51cto.com/icenycmh/1784735,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
使用 Jenkins 实现 Java 项目的持续集成和持续交付
本文参考中国 DevOps 社区核心组织者刘征老师在中国 DevOps 社区济南 Meetup 活动上分享的 "用Jenkins实施CI/CD工作坊",展示如何使用 Jenkins 实现 Java 项目的 CI/CD (持续集成/持续交付)。
2324 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
27751 0
JENKINS针对不同项目组对用户进行权限分配
权限需求 因JENKINS上存有de(开发)、te(测试)、re(预发布)等三个不同环境的项目,同时因为项目需求,需要对不同的开发及测试人员配置不同的jenkins权限,即以项目为单位,对不同人员进行不同权限配置,要求如下: 1、项目都以healthcloud开头,分别以-de、-te、-r...
2195 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
19991 0
在阿里云Centos7上利用docker搭建Jenkins来自动化部署Django项目
在阿里云Centos7上利用docker搭建Jenkins来自动化部署Django项目
208 0
jenkins部署vue项目
jenkins部署vue项目
90 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
23527 0
+关注
20380
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载