原文日期: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,它将构建过程做成流水线作业,使得部署更加人性化。