如何将SpringBoot工程一键部署为容器化服务

在多系统协同开发时,经常需要在开发环境进行系统联调。传统方式是通过IDE工具启动系统工程,然后其他系统再通过开发主机的IP地址和端口进行联调。这种方式的效率较低,主要表现在:

  • 由于IDE的系统工程正在运行,开发人员无法继续编写代码。
  • 由于系统联调,开发人员无法调试和修改其他功能。

现在,将Docker容器和IDE工具相结合,便能较好地解决上述两个问题,有助于提升系统开发效率。本文将会使用两种比较流行的IDE工具:

  • 基于Eclipse的Spring Tool Suite(STS)
  • IntelliJ IDEA

本文会分别通过这两种IDE工具建立SpringBoot的示例工程,然后为IDE工具配置Docker连接,最后将示例工程部署为容器化的服务。

一、环境描述

1. 开发机

  • 操作系统:Windows 10 Enterprise
  • Java:build 1.8.0_144-b01
  • STS:spring-tool-suite-3.9.0.RELEASE-e4.7.0-win32-x86_64.zip
  • IntelliJ:ideaIU-2017.2.4.win.zip
  • DockerToolBox:17.07.0-ce

2. 联调机

  • 操作系统:CentOS 7.3 Minimal
  • Docker:17.06.2-ce
  • Docker-Compose:1.16.1
  • 基础设施:阿里云ECS主机
  • IP地址:172.17.245.110

二、建立示例工程

1. Spring Tool Suite

Step-1 访问菜单File → New → Spring Starter Project,打开新建工程窗口,如下图所示:

新建SpringBoot示例工程

保持默认配置项不变,然后点击Next按钮。

Step-2 指定新建工程的依赖关系,选择Web → Web,如下图所示:

设置工程依赖关系

然后点击Next按钮,进入站点信息配置窗口。

Step-3 保持站点信息不变,如下图所示:

设置示例工程的站点信息

然后点击Finish按钮,STS便会建立示例工程,并且下载相应的依赖关系。

Step-4 SpringBoot示例工程的目录结构,如下图所示:

示例工程的STS目录结构

接下来,新建一个控制器类,代码如下所示:

package com.example.demo;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    public String say() {
        return "Hello World From Spring Tool Suite …";
    }
}

至此,STS工具的SpringBoot示例工程已经创建完毕了。工程启动之后,通过Web浏览器访问HelloController控制器,便能看到相应的提示信息。

2. IntelliJ IDEA

Step-1 在IntelliJ的启动窗口中,点击Create New Project按钮,如下图所示:

IntelliJ首页

Step-2 在新建工程窗口中,定义工程的SDK和工程类型,如下图所示:

新建SpringBoot示例工程

Step-3 点击Next按钮,进入工程元数据配置窗口,保持默认配置不变,如下图所示:

示例工程的元数据

Step-4 点击Next按钮,进入依赖关系配置窗口,选择Web依赖,如下图所示:

设置工程的依赖关系

Step-5 点击Next按钮,配置工程名和目录位置,如下图所示:

示例工程的名称和位置

Step-6 点击Finish按钮,IntelliJ便会建立示例工程,并且下载相应的依赖关系。SpringBoot示例工程的目录结构,如下图所示:

示例工程的IntelliJ目录结构

Step-7 接下来,新建一个控制器类,代码如下所示:

package com.example.demo;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    public String say() {
        return "Hello World From IntelliJ …";
    }
}

至此,IntelliJ工具的SpringBoot示例工程已经创建完毕了。工程启动之后,通过Web浏览器访问HelloController控制器,便能看到相应的提示信息。

三、配置Docker连接

1. Spring Tool Suite

Step-1 访问STS的Help → Install New Software...,打开插件安装窗口,然后将插件源指定为Eclipse的官方源,搜索关键字docker,找到Docker Tooling插件,如下图所示:

查找Docker Tooling插件

Step-2 安装Docker Tooling插件,安装完成之后需要重新启动STS,然后便能打开Docker Tooling的视图,如下图所示:

打开Docker Tooling视图

Step-3 在STS的Docker Explorer中新建Docker连接,配置如下图所示:

新建STS的Docker连接

至此,STS的Docker连接配置完毕!

2. IntelliJ IDEA

Step-1 访问File → Settings,打开全局配置窗口,然后点击Plugins菜单,在插件窗口中点击Install JetBrains plugin...按钮,如下图所示:

打开IntelliJ的插件窗口

Step-2 搜索关键字docker,找到Docker integration插件,然后点击Install按钮,如下图所示:

查找Docker Integration插件

Step-3 安装完成之后,需要重新启动IntelliJ,然后访问File → Settings,打开全局配置窗口,然后点击Build, Execution, Deployment菜单,点击其下属的Docker菜单,然后点击“+”号,如下图所示:

打开Docker配置窗口

Step-4 在新建Docker连接窗口中填写连接配置信息,如下图所示:

新建IntelliJ的Docker连接

至此,IntelliJ的Docker连接配置完毕!

四、部署容器化服务

0. 新建docker文件

Step-1 在示例工程的根目录新建Dockerfile文件,内容如下所示:

FROM java
COPY target/*.jar app.jar
RUN bash -c 'touch ./app.jar'
EXPOSE 8080

CMD ["java","-jar","app.jar"]

该文件用于构建示例工程的docker镜像,这个步骤同时适用于STS和IntelliJ!

Step-2 在示例工程的根目录新建docker-compose.yml文件,内容如下所示:

version: '3'
services:
  demo:
    build:
      context: .
      dockerfile: Dockerfile
    image: demo-image:latest
    container_name: demo-container
    hostname: demo-container
    expose:
      - "8080"
    ports:
      - "8080:8080"
    network_mode:  "bridge"

该文件用于编排示例工程的docker容器,这个步骤同时适用于STS和IntelliJ!

1. Spring Tool Suite

Step-1 右键点击示例工程,在弹出菜单中选择Run As → 5 Maven Build,打开Maven配置和启动窗口,打包设置如下图所示:

STS的Maven打包配置

设置完成之后,点击Run按钮,Maven便会将示例工程打包为可执行jar包,存放在target目录中。

Step-2 访问Run → Run Configurations...,打开运行配置窗口,点击Docker Compose菜单,然后点击New launch configuration按钮,新建运行配置,如下图所示:

新建STS的运行配置

Step-3 配置完成之后,点击Run按钮,STS便会自动构建镜像,然后自动将示例工程的服务容器化部署至联调机。部署完成之后,便能在Docker Explorer中看到相应的docker镜像和容器,如下图所示:

Docker Explorer中的容器和镜像

其中,demo-container是运行示例工程对应的服务容器,demo-image:latest是基于示例工程构建的镜像,java:latest是示例工程镜像的基础镜像。

2. IntelliJ IDEA

Step-1 打开最右侧的Maven Projects窗口,然后忽略测试过程,访问demo → Lifecycle,双击其中的package项目,如下图所示:

IntelliJ的Maven打包配置

此时,Maven便会将示例工程打包为可执行jar包,存放在target目录中。

Step-2 访问Run → Edit Configurations...,点击“+”符号,然后在弹出的新增配置窗口中选择Docker Deployment,打开Docker部署配置窗口,配置信息如下图所示:

新建IntelliJ的运行配置

Step-3 运行配置完成之后,访问Run → Run,在弹出的运行菜单中选择demo-docker,IntelliJ将会自动打包、构建镜像和部署服务。部署完成之后,便能在Docker标签页中看到相应的docker镜像和容器,如下图所示:

Docker标签页中的容器和镜像

其中,demo-container是运行示例工程对应的服务容器,demo-image:latest是基于示例工程构建的镜像,java:latest是示例工程镜像的基础镜像。

五、验证

1. Spring Tool Suite

在Web浏览器的地址栏中访问http://172.17.245.110:8080/hello,若打开页面如下图所示,则表示STS将示例工程部署为容器化服务:

通过STS部署的容器化的Web服务

2. IntelliJ IDEA

在Web浏览器的地址栏中访问http://172.17.245.110:8080/hello,若打开页面如下图所示,则表示IntelliJ将示例工程部署为容器化服务:

通过IntelliJ部署的容器化的Web服务

六、总结

上述的配置方法完成之后,当开发者编辑完代码,想要部署联调环境时:

  • Spring Tool Suite:通过Maven打包,然后执行先前指定的Docker Compose运行配置。
  • IntelliJ IDEA:直接一键运行先前指定的Docker Compose配置。

此时,便能将SpringBoot工程方便快捷地部署为容器化服务!