自动化发布-15.Docker项目应用镜像的构建与运行

125 阅读1分钟

原文日期:2017-06-27


构建docker应用镜像及运行

在前面我们已经将jdk-tomcat基础镜像构建完成。现在我们可以直接在该镜像上构建我们的应用镜像。构建脚本文件Dockerfile信息如下。

#
### version 0.1
FROM 192.168.10.11:5000/jdk8-tomcat8
MAINTAINER liliangang "liliangang@ctosb.com"
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime
RUN  sed -i '/<\/Host>/i <Context docBase="/app/ctosb" path="/" reloadable="true"/>' /app/tomcat/apache-tomcat-8.5.5/conf/server.xml
COPY build/libs/ctosb /app/ctosb
WORKDIR /app/ctosb
EXPOSE 8080
CMD ["/app/tomcat/apache-tomcat-8.5.5/bin/catalina.sh","run"]

如上命令主要是将主机上的ctosb项目文件推送到镜像的指定目录中(/app/ctosb),然后将8080端口出来,以便可以映射到主机对应的端口。

执行如下命令即可构建应用镜像。

$ docker build -t 192.163.10.11:5000/ctosb:0.1 -f Dockerfile .

之后推送镜像到注册中心Registry中。

$ docker push 192.163.10.11:5000/ctosb:0.1

最后运行该应用镜像,即启动应用容器。

$ docker run -itd --name ctosb 192.163.10.11:5000/ctosb:0.1

自动化docker应用镜像的构建与运行

如下是对docker应用镜像的构建和发布。

buildscript {
  repositories {
    maven {
      //nexus私服
      url "http://192.163.10.12/nexus/content/groups/public/"
    }
  }
  dependencies {
    classpath 'mysql:mysql-connector-java:5.1.40'
    classpath 'org.hidetake:gradle-ssh-plugin:2.7.0'
  }
}

apply plugin: 'java'
apply plugin: 'war'
apply plugin: 'eclipse-wtp'
apply plugin: "org.hidetake.ssh"

ext {
	projectName="ctosb"
	//支持项目版本
	projectVersion = System.getProperty("projectVersion")
	//支持自定义Java参数优化
	javaOpts = System.getProperty("JAVA_OPTS")
}


repositories {
    maven{
    	url "http://192.163.10.12/nexus/content/groups/public/"
    }
}

//设置远程服务器地址信息
remotes {
  webServer1 {
    host = '192.163.1.1'
    user = 'gelcmw'
    identity = file('/root/.ssh/id_rsa')  
  }
  webServer2 {
    host = '192.163.1.2'
    user = 'gelcmw'
    identity = file('/root/.ssh/id_rsa') 
  }
}
//ssh插件设置
ssh.settings {  
  knownHosts = allowAnyHosts
  extensions.add deploy: { 
	//deploy application
	println "deploy application"
	execute("sudo /app/application/docker/docker pull 192.163.10.11:5000/${projectName}:${projectVersion}",pty:true)
	execute("sudo /app/application/docker/docker stop ${projectName}",pty:true,ignoreError:true)
	execute("sudo /app/application/docker/docker rm ${projectName}",pty:true,ignoreError:true)
	execute("sudo /app/application/docker/docker run -d -it -p 8080:8080 -v /app/application/logs:/app/tomcat/apache-tomcat-8.5.5/logs -e JAVA_OPTS='${javaOpts}' --name ${projectName} 192.163.10.11:5000/${projectName}:${projectVersion}",pty:true)
	def result
	for(i in 1..24){
		execute ("sleep 5")
		result = execute("curl -o /dev/null -s -w %{http_code}  'http://localhost:8080' ",ignoreError: true)
		if(result=='200'||result=='302'){
		  break;
		}
	}
	assert (result=='200'||result=='302')
  }
}

task buildImage(type:Exec){
	workingDir '.'
	commandLine "./exec/buildImage.sh", "${projectVersion}"
}

//定义发布任务
task deployServer << {
  ssh.run {
    session(remotes.webServer1) {
    	deploy()
    }
	session(remotes.webServer2) {
    	deploy()
    }
  }
}

//打包阶段
war{
	baseName = projectName
}

构建镜像的脚本buildImage.sh内容如下。其中$1是版本号,即应用镜像的版本号,也是项目运行的版本号。

#!/usr/bin/env bash
docker build -t 192.163.10.11:5000/ctosb:$1 .
docker push 192.163.10.11:5000/ctosb:$1

在Jenkins中调用gradle如下任务即可完成docker应用镜像的构建和运行。

gradle clean build buildImage deployServer -DJAVA_OPTS= -DprojectVersion=2.8

该命令中 clean build是java插件自带的任务,buildImage和deployServer分别是我们自定义的构建docker应用镜像任务和发布运行docker应用容器任务。JAVA_OPTS和projectVersion是从Jenkins里传入的两个参数。

总结

至此,基本上完成了Docker容器化自动构建与部署。在Docker容器化实践应用中,我们采用了Vmware开源的Harbor软件代替Registry,可以通过web去管理Docker镜像;并引入了Docker容器平台Rancher去管理、监控、编排Docker容器;使用第三方构建平台(Wisebuild)替换Jenkins,它将构建过程做成流水线作业,使得部署更加人性化。