博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
jenkins+docker的简单项目部署
阅读量:6403 次
发布时间:2019-06-23

本文共 3159 字,大约阅读时间需要 10 分钟。

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

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

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

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

  首先po上大概的流程:

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

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

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

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

实现:

实验环境:

  jenkins:192.168.1.224

  docker宿主机:192.168.1.120

发布前状态:

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

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

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

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

实验准备:

  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为版本信息)

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

部署新项目:

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

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

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

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

  4:查看页面:

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

 5:查看容器运行状态

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

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

后记:

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

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

本文转自 icenycmh 51CTO博客,原文链接:http://blog.51cto.com/icenycmh/1784735,如需转载请自行联系原作者
你可能感兴趣的文章
java 输入
查看>>
mysql主从连接报错ERROR 1201
查看>>
TurboGate邮件网关中继云服务,助您国际邮件畅通无阻!
查看>>
Apache Arrow官方文档-IPC进程间通信
查看>>
【Java面试整理之JVM】深入理解JVM结构、类加载机制、垃圾回收GC原理、JVM内存分配策略、J...
查看>>
maven的pom.xml模板(springmvc+jpa )
查看>>
2014-07-13 Java Web的学习(10)-----jdbc&工厂模式解耦
查看>>
Apache HBase + Apache Hadoop + Xceivers
查看>>
Linux内核锁机制
查看>>
SAR 命令详解
查看>>
iOS-崩溃调试
查看>>
[置顶] 文件上传简介1---上传到指定的目录2
查看>>
关于第一份工作,程序员!
查看>>
nginx 编译
查看>>
VMM2012应用指南之2- 准备VMM2012虚拟机
查看>>
(转)给入门程序员的忠告
查看>>
我的友情链接
查看>>
starting NFS daemon failed
查看>>
springboot带参数路径访问
查看>>
刀片服务器性价比
查看>>