介绍一种新的部署方式,让应用部署更加简单高效。

对于微服务架构来说,服务拆分的越多,运维的成本也就越高,以前的一个系统只需要部署一次就可以了,但拆分成多个服务后,就需要多次部署了,为了简化部署流程,容器化成了该问题的最佳解决方案。

这里假定大家对 Springboot 应用的搭建及 Docker 都有了一定的了解,如果不知道,可以阅读下 SpringBoot实战 之 入门篇 等系列文章及查看 Docker 官方文档。

第一步:使用 http://start.spring.io 快速创建一个 gradle 管理的 springboot 工程

生成完以后,需要将 build.gradle 脚本中的版本号改成 1.5.8,如下:

buildscript {
     ext {
         springBootVersion = '1.5.8.RELEASE'
     }
     repositories {
         mavenCentral()
     }
     dependencies {
         classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
     }
 }apply plugin: 'java'
 apply plugin: 'eclipse'
 apply plugin: 'org.springframework.boot'group = 'com.qchery'
 version = '0.0.1-SNAPSHOT'
 sourceCompatibility = 1.8repositories {
     mavenCentral()
 }dependencies {
     compile('org.springframework.boot:spring-boot-starter-web')
     testCompile('org.springframework.boot:spring-boot-starter-test')
 }

 第二步: 编写一个简单的接口用于服务验证@RestController
 @SpringBootApplication
 public class SpringbootGradleDockerApplication {    public static void main(String[] args) {
         SpringApplication.run(SpringbootGradleDockerApplication.class, args);
     }    @RequestMapping("hello")
     public String hello() {
         return "Hello, SpringBoot With Docker";
     }}

 第三步: Docker 有一个简单的 Dockerfile 文件格式,它用来指定镜像的层次。因此,我们继续在Spring Boot项目中创建一个Dockerfile,存放在与 build.grade 相同的目录下:FROM openjdk:8-jdk-alpine
 VOLUME /tmp
 ARG JAR_FILE
 ADD ${JAR_FILE} app.jar
 ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

 这个Dockerfile非常简单,但只需运行一个Spring Boot应用程序就可以完成这一切。项目JAR文件以“app.jar”的形式添加到容器中,然后在 ENTRYPOINT 执行。为了缩短 Tomcat 的启动时间,我们添加了一个系统属性,指定 “/dev/urandom” 作为熵源。
第四步: 使用 Palantir 插件辅助镜像构建
buildscript {
     ...
     dependencies {
         ...
         classpath('gradle.plugin.com.palantir.gradle.docker:gradle-docker:0.13.0')
     }
 }...
 apply plugin: 'com.palantir.docker'docker {
     name "${project.group}/${jar.baseName}"
     files jar.archivePath
     buildArgs(['JAR_FILE': "${jar.archiveName}"])
 }


Docker 配置参数说明

name 用于容器的名称,可以包括一个标签
tags 一组标签参数,在应用标签之前,name 中的标签都会被剥离;默认为空集(可选)
dockfile 用于构建镜像Dockerfile文件,默认为 project.file('Dockerfile') 且必须是一个文件对象(可选)
files 需要包含在 Docker 上下文中的文件列表(可选)
buildArgs 一个键值都为 String 的 Map 集合,将为 build 命令设置 --build-arg 参数(可选)
labels 一个键值都为 String 的 Map 集合,将为 build 命令设置 --label 参数,默认为空(可选)
pull 是否在构建前拉取最新的基础镜像,默认为 false 。(可选)
noCache 是否在构建时设置 --no-cache 参数,从头开始构建镜像;默认为 false 。
现在使用如下命令即可构建出 Docker 镜像(需保证当前环境中的 Docker 进程已启动)

./gradlew build -x test docker

构建完成后,可以查看本地的镜像仓库

确认镜像无误后,启动镜像

docker run -d -p 8080:8080 --name="docker-springboot" com.qchery/springboot-gradle-docker:latest

测试镜像是否发布成功

curl http://localhost:8080/hello 参考文献:

Getting Started - Springboot With Docker https://github.com/palantir/gradle-docker