docker+svn+maven+tomcat一键部署项目

来源:互联网 发布:淘宝店铺流量来源查询 编辑:程序博客网 时间:2024/05/24 11:13

要准备的环境

  • docker
  • maven
  • jdk
  • svn
  • docker官方的tomcat镜像

有关环境的安装和配置可参考

linux下安装JDK

linux系统安装maven

安装Docker并在容器里运行tomcat

centos下安装svn可以用yum快捷安装yum install svn


要实现一键部署其实就是要写一个脚本帮助我们完成部署任务。下面我们用一个脚本完成项目自动部署至Docker,由于步骤比较多,我们将步骤分解出来执行以便有更清晰的认识。

  1. 从SVN拉取或更新项目
  2. 使用MAVEN编译打包
  3. 将可执行的web应用移至发布的目录
  4. 使用Docker运行tomcat镜像,将步骤3的web应用目录挂载至Docker容器

步骤如上所示,下面开始动手。


从SVN中checkout项目

mkdir -p /usr/local/svn-projectssvn checkout --username=massive --password=massive svn://192.168.1.108/test/basic-web
  • 1
  • 2
  • 1
  • 2

如果项目已经checkout出来,使用svn update更新项目


使用MAVEN编译打包项目

mvn package -Dmaven.test.skip=true -f /usr/local/svn-projects/basic-web
  • 1
  • 1

将可执行的web应用移至发布的目录

cp /usr/local/svn-projects/basic-web/target/basic-web /app/deploy/basic-web
  • 1
  • 2
  • 1
  • 2

使用docker运行tomcat镜像

docker run --privileged=true -v /app/deploy/basic-web:/usr/local/tomcat/webapps/basic-web -p 8081:8080 tomcat:7
  • 1
  • 1

将 /app/deploy/basic-web 的资源挂载至容器的 /usr/local/tomcat/webapps/basic-web 目录


把上述步骤编写成一个脚本执行

步骤分析完毕,现在要做的事就是把上述的步骤放在一个脚本里执行,达到我们一建部署的目的。

mkdir -p /usr/local/scripttouch /usr/local/script/docker-deploychmod +x /usr/local/script/docker-deployln -s /usr/local/bin/docker-deploy /usr/local/script/docker-deploy
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

脚本的内容如下:

#!/bin/sh# deploy optionsproject=basic-web# 要部署的目录deploy_dir=/app/deploy/$project# svn optionsproject_svn_uri=svn://192.168.1.108/test/basic-websvn_base_dir=/usr/local/svn-projects/svn_user=massivesvn_password=massive# docker options# 接收 -p 参数,若没传此参数则取默认端口8080port=8080while getopts ":p:" opt; do  case $opt in    p)      port=$OPTARG   #get the value      ;;    ?)      echo "How to use: $0 [-p port]" >&2      exit 1      ;;    :)      echo "Option -$OPTARG requires an argument." >&2      exit 1      ;;  esacdone# 取svn地址最后一个`/`字符后面的名称作为checkout出来的目录svn_full_dir=$svn_base_dir${project_svn_uri##*/}echo '----------------------------------------------'echo "checkout project    :    ${project_svn_uri}"echo "checkout diretory   :    ${svn_full_dir}"echo "deploy project      :    ${deploy_dir}"echo "deploy port         :    ${port}"echo '----------------------------------------------'# ------------------------------------# checkout or update from svn# ------------------------------------cd $svn_full_direcho "try to get svn info..."svn info# 如果svn info命令执行成功,证明项目已checkout,否则就未checkout# 若未checkout则checkout项目,否则update项目至最新版本if [ $? -eq 0 ];then    echo "update svn ..."    svn updateelse    echo 'checkout from svn...'    echo "svn checkout --username=${svn-user} --password=${svn_password} ${project_svn_uri}"    svn checkout --username=$svn_user --password=$svn_password $project_svn_urifi# ------------------------------------# install maven project# ------------------------------------mvn package -Dmaven.test.skip=true -f $svn_full_dir# ------------------------------------echo "copying project to ${deploy_dir}..."mkdir -p $deploy_dircp $svn_full_dir/target/$project $deploy_dir -recho "copy project end"echo "docker run --privileged=true -v ${deploy_dir}:/usr/local/tomcat/webapps/${project} -p ${port}:8080 tomcat:7"docker run --privileged=true -v $deploy_dir:/usr/local/tomcat/webapps/$project -p $port:8080 tomcat:7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82

编写脚本完成后,我们可以就可以愉快的使用部署命令了

docker-deploy
  • 1
  • 1

若要指定容器的映射端口可以加上 -p 参数

docker-deploy -p 8081
  • 1
  • 1

至此,我们已经实现了一个命令实现应用的部署,而且容器不用关心环境变量,不得不感慨docker对于DevOps带来的便利。这个脚本执行的任务和Jenkins有点类似,但脚本可以控制的粒度更细,可扩展性更高。


若有其它需要,可以扩展脚本以实现更多功能, 
比如svn的版本回滚至3000再运行: docker-deploy -b 3000 -p 8081 
比如svn的版本不更新直接运行: docker-deploy -U -p 8081 (可设置成-U 不更新svn,-u更新svn)

原创粉丝点击