Spring专题

使用gradle生成Spring Boot应用的Docker Image

  

本教程演示如何通过gradle将一个Spring Boot应用生成Docker的Image,Docker的Image类似Java的WAR发布包,可以被Docker容器带着在任何操作系统上运行,一个操作系统也可以运行多个Docker容器。

本案例源码 Github repository dubbed galoshe.

首先,基于Spring boot的应用很简单,通过浏览器输出Hello World,代码如下:

@RestController

@Configuration

@EnableAutoConfiguration

@ComponentScan

public class Application {

 

  public static void main(String[] args) {

    ApplicationContext ctx = SpringApplication.run(Application.class, args);

  }

 

  @RequestMapping("/")

  public String index() {

    return "Hello to you, world";

  }

}

这是访问URL根目录/会返回Hello的应用,application.properties配置如下:

server.port: 8080

下面是使用gradle来配置这个应用,以便生成Docker的Imag. 四个步骤:

1. 加入gradle插件

为了Docker-ize 应用,需要两个插件docker 和 application. gradle有两个docker插件开源项目:gradle-docker plugin和及 other plugin

将插件加入配置文件build.gradle 

apply plugin: 'application'
apply plugin: 'docker'

需要在dependencies 配置告诉gradle如何发现这些插件。

为Docker插件指定classpath:

buildscript {

    repositories { mavenCentral() }

    dependencies {

        classpath 'se.transmode.gradle:gradle-docker:1.1'

    }

}

2.提供一些属性

gradle-docker插件只是创建一个Dockerfile文件,然后供docker命令行来建立一个image. 因此,你需要在 build.gradle提供一些属性,以便能有效自动运行你的应用。

需要提供:

  • 运行的类,也就是包含main方法的应用类
  • JVM 版本 (缺省是 Java 7)
  • 可选项, 一个group id, 适合于 Docker 归类的标签.

group = 'aglover'
sourceCompatibility = 1.7
mainClassName = 'com.github.aglover.galoshe.Application'

虽然group不是必须的,可以帮助Docker归类贴上标签,当插件创建一个Docker image时,它会使用 group/name 方式给这个image命名。

最后,启动的主类名是启动应用的入口,F插件会创建一个脚本,这样你的Docker image在启动时会调用这个脚本,脚本类似如下格式:

1 java -classpath your_class_path your_main_class

 

3.指定Dockerfile所需

Dockerfiles 包含一些有关image相应的指令要求,重要点见这里,这里的Spring Boot应用只需要一个参数:端口,可以通过插件的exposePort方法设置。

因此,为确保Docker容器能 按照之前定义的application.properites文件暴露端口8080,加入下面脚本到build.gradle 文件:

指定端口 8080

1 distDocker {
2     exposePort 8080
3 }

依次可以想象,在插件中加入addFile实际是Docker的ADD指令,而runCommand会对应aRUN,而setEnvironment会创建一个ENV指令。

4.构建运行

最后一步我们运行gradle来创建Docker Image,如下:

$ ./gradlew distDocker

当你第一次运行这个命令,它会下载一些所需的Image。构建完成后,你可以查询列出本地的image.文件:


1 $ docker images
2 REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
3 aglover/galoshe     latest              332e163221bc        20 hours ago        1.042 GB
4 dockerfile/java     latest              f9793c257930        3 weeks ago         1.026 GB

在docker中运行这个Image

docker run 332e163221bc

然后打开浏览器,访问localhost:8080即可

当然你可以发布这个image 让其他人直接使用。

 

在VirtualBox和Vagrant中安装Docker

Spring各种源码项目下载

微服务