使用 Docker 部署 Springboot 应用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chinrui/article/details/79721366

SpringBoot 实战 之 优雅终止服务 中已经介绍了几种Springboot 应用的部署方式,今天来介绍一种新的部署方式,让应用部署更加简单高效。

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

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

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

gradle 工程

生成完以后,需要将 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

参考文献:

  1. Getting Started - Springboot With Docker
  2. https://github.com/palantir/gradle-docker
展开阅读全文

没有更多推荐了,返回首页