介绍一种新的部署方式,让应用部署更加简单高效。
对于微服务架构来说,服务拆分的越多,运维的成本也就越高,以前的一个系统只需要部署一次就可以了,但拆分成多个服务后,就需要多次部署了,为了简化部署流程,容器化成了该问题的最佳解决方案。
这里假定大家对 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.8
repositories {
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