实用干货 使用Docker进行Spring Boot开发

通过优锐课的java学习分享,让我们研究一下如何将容器带入Spring Boot项目。 在这里,我们使用Docker来包含Java REST后端,而无需担心操作系统。

AtSea Shop是示例店面应用程序,可以部署在不同的操作系统上,并且可以针对企业开发和运营环境进行自定义。 在较早的帖子中,我讨论了该应用程序的体系结构。 在本文中,我将介绍如何设置开发环境以调试在容器中运行的Java REST后端。

构建REST应用
我使用Spring Boot框架快速开发了REST后端,该后端管理AtSea Shop中使用的产品,客户和订单表。 该应用程序利用Spring Boot的内置应用程序服务器,对REST接口的支持以及定义多个数据源的能力。 因为它是用Java编写的,所以与基本操作系统无关,并且可以在Windows或Linux容器中运行。 这使开发人员可以针对异构体系结构进行构建

项目设置
AtSea项目使用多阶段构建,这是一项新的Docker功能,它使我可以使用多个映像来构建单个Docker映像,其中包含应用程序所需的所有组件。多阶段构建使用Maven容器构建应用程序JAR文件。然后将JAR文件复制到Java开发工具包映像。因为Maven不包含在应用程序中,所以这使图像更加紧凑和有效。同样,React店面客户端构建在Node映像中,并且还将编译应用程序添加到最终应用程序映像中。
我使用Eclipse编写了AtSea应用程序。如果你需要有关配置IntelliJ或Netbeans进行远程调试的信息,可以查看Docker Labs存储库。你还可以在AtSea应用程序GitHub存储库中签出代码。
0
我通过克隆存储库构建了应用程序,并通过将Root Directory设置为项目并单击Finish将项目导入到Eclipse中
文件>导入> Maven>现有Maven项目
自从我使用Spring Boot以来,我就利用spring-devtools在应用程序中进行远程调试。我必须将Spring Boot-devtools依赖项添加到pom.xml文件中。

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-devtools</artifactId>
</dependency>

请注意,当应用程序完全打包为JAR时,将自动禁用开发人员工具。 为了确保在开发期间可以使用devtools,我在spring-boot-maven构建插件中将<excludeDevtools>配置设置为false:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <excludeDevtools>false</excludeDevtools>
            </configuration>
        </plugin>
    </plugins>
</build>

本示例使用Docker Compose文件,该文件为开发和调试特别需要的容器创建了简化的构建。

version: "3.1"
services:
  database:
    build:
       context: ./database
    image: atsea_db
    environment:
      POSTGRES_USER: gordonuser
      POSTGRES_DB: atsea
    ports:
      - "5432:5432"
    networks:
      - back-tier
    secrets:
      - postgres_password
  appserver:
    build:
       context: .
       dockerfile: app/Dockerfile-dev
    image: atsea_app
    ports:
      - "8080:8080"
      - "5005:5005"
    networks:
      - front-tier
      - back-tier
    secrets:
      - postgres_password
secrets:
  postgres_password:
    file: ./devsecrets/postgres_password
networks:
  front-tier:
  back-tier:
  payment:
    driver: overlay

Compose文件使用机密提供密码和其他敏感信息(例如证书),而无需依赖环境变量。 尽管该示例使用PostgreSQL,但是应用程序可以使用密码连接到由Spring Boot数据源定义的任何数据库。 从JpaConfiguration.java:

public DataSourceProperties dataSourceProperties() {
        DataSourceProperties dataSourceProperties = new DataSourceProperties();
    // Set password to connect to database using Docker secrets.
    try(BufferedReader br = new BufferedReader(new FileReader("/run/secrets/postgres_password"))) {
        StringBuilder sb = new StringBuilder();
        String line = br.readLine();
        while (line != null) {
            sb.append(line);
            sb.append(System.lineSeparator());
            line = br.readLine();
        }
         dataSourceProperties.setDataPassword(sb.toString());
     } catch (IOException e) {
        System.err.println("Could not successfully load DB password file");
     }
    return dataSourceProperties;
}

还要注意,appserver打开端口5005进行远程调试,并且build调用Dockerfile-dev文件来构建打开了远程调试的容器。 这在入口点中设置,该入口点指定调试器的传输和地址。
ENTRYPOINT ["java",

"-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005","-jar",
"/app/AtSea-0.0.1-SNAPSHOT.jar"]

远程调试

要在应用程序上启动远程调试,请使用docker-compose-dev.yml文件运行compose。

docker-compose -f docker-compose-dev.yml up --build

Docker将构建映像并启动AtSea Shop数据库和appserver容器。 但是,只有将Eclipse的远程调试器附加到应用程序后,应用程序才能完全加载。 要开始远程调试,请单击运行>调试配置...。

选择“远程Java应用程序”,然后按新按钮创建配置。 在“调试配置”面板中,为配置指定名称,选择AtSea项目,并将主机和端口的连接属性设置为5005。单击“应用”>“调试”。


该应用服务器将启动:

appserver_1|2017-05-09 03:22:23.095 INFO 1 --- [main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
appserver_1|2017-05-09 03:22:23.118 INFO 1 --- [main] com.docker.atsea.AtSeaApp                : Started AtSeaApp in 38.923 seconds (JVM running for 109.984)

要测试远程调试,请在ProductController.java上设置一个断点,该断点将返回产品列表。

你可以使用curl或用于发出HTTP请求的首选工具对其进行测试:
curl -H "Content-Type: application/json" -X GET http://localhost:8080/api/product/

Eclipse将切换到调试透视图,你可以在其中逐步执行代码。

AtSea Shop示例显示了使用你和你的团队所熟悉的工具将容器用作常规开发环境的一部分是多么容易。 下载该应用程序以尝试使用容器进行开发,或者将其用作你自己的Spring Boot REST应用程序的基础。

喜欢这篇文章的可以点个赞,欢迎大家留言评论,记得关注我,每天持续更新技术干货、职场趣事、海量面试资料等等
?> 如果你对java技术很感兴趣也可以交流学习,共同学习进步。?
不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代

文章写道这里,欢迎完善交流。最后奉上近期整理出来的一套完整的java架构思维导图,分享给大家对照知识点参考学习。有更多JVM、Mysql、Tomcat、Spring Boot、Spring Cloud、Zookeeper、Kafka、RabbitMQ、RockerMQ、Redis、ELK、Git等Java干货

原文地址:https://blog.51cto.com/14634606/2467193

时间: 2024-10-08 10:17:38

实用干货 使用Docker进行Spring Boot开发的相关文章

微服务架构实践 - 你只懂docker与spring boot就够了吗?

微服务架构实践 - 你只懂docker与spring boot就够了吗? 作者 浮云发发 已关注 2017.02.27 02:50* 字数 2613 阅读 2583评论 6喜欢 35赞赏 2 微服务并不是单独存在的,为了更好地实现微服务架构,需要整合许多组件混搭使用,方能打通任督二脉,天下无敌.网上很多大拿讲了微服务治理的内容,也有人单方面讲微服务的,比如spring boot与docker,本文着重于组件选型的较量,也积累了我们团队多次PK的精华:这些组件包括spring boot.sprin

Spring Boot 开发微信公众号后台

Hello 各位小伙伴,松哥今天要和大家聊一个有意思的话题,就是使用 Spring Boot 开发微信公众号后台. 很多小伙伴可能注意到松哥的个人网站(http://www.javaboy.org)前一阵子上线了一个公众号内回复口令解锁网站文章的功能,还有之前就有的公众号内回复口令获取超 2TB 免费视频教程的功能(免费视频教程),这两个都是松哥基于 Spring Boot 来做的,最近松哥打算通过一个系列的文章,来向小伙伴们介绍下如何通过 Spring Boot 来开发公众号后台. 1. 缘起

天天玩微信,Spring Boot 开发私有即时通信系统了解一下

1/ 概述 利用Spring Boot作为基础框架,Spring Security作为安全框架,WebSocket作为通信框架,实现点对点聊天和群聊天. 2/ 所需依赖 Spring Boot 版本 1.5.3,使用MongoDB存储数据(非必须),Maven依赖如下: <properties> <java.version>1.8</java.version> <thymeleaf.version>3.0.0.RELEASE</thymeleaf.ve

Spring Boot 开发系列一 开发环境的一些九九

从今天开始写这个Spring Boot 开发系列,我是第二周学习JAVA的,公司号称springboot把JAVA的开发提升到填空的能力,本人是NET转JAVA的,想看看这个填空的东西到底有多强.废话不多说,强不强,撸段代码试试吧. 写过NET的人第一次看到JAVA这个工程文件的目录,有没有想死的感觉,一入JAVA深似海,N个展开就是找不到代码,我去,其实在这里可以设置成后面这种xx.xx.xx包的模式显示,机关在这里. 意思是  隐藏  空的中间过渡包,勾上后就成后后面这种舒服的感觉. 2.代

使用Spring boot开发RestFul 风格项目PUT/DELETE方法不起作用

在使用Spring boot 开发restful 风格的项目,put.delete方法不起作用,解决办法. 实体类Student @Data public class Student { private String id; private String name; private int age; private String sex; @Override public String toString() { return ToStringBuilder.reflectionToString(

Spring Boot 2.0(六):使用 Docker 部署 Spring Boot 开源软件云收

只需三步即可部署开源项目云收藏,打造专属个人的收藏系统,就是这么简单! 云收藏项目已经开源2年多了,作为当初刚开始学习 Spring Boot 的练手项目,使用了很多当时很新的技术,现在看来其实很多新技术是没有必要使用的,但做为学习案例来讲确实是一个绝佳的 Spring Boot 实践. 从开源到现在,写了一些教程给大家介绍如何部署云收藏,如何在IDE中运行云收藏,但是仍然有很多的朋友不知道如何使用,如何部署?就像"请提供一份云收藏数据结构" 这样的问题我至少都回答了一百多次,并且在

【docker】docker部署spring boot服务,但是docker logs查看容器输出控制台日志,没有日志打印,日志未打印,docker logs不打印容器日志

如题: docker部署spring boot服务,但是docker logs查看容器输出控制台日志,没有日志打印,日志未打印,docker logs不打印容器日志 场景再现: docker部署并启动了  springboot服务,容器启动正常,docker exec 也可以正常进入容器内部,但是docker logs 控制台并没有日志打印出来. 同样的,/var/lib/docker/containers目录下的对应容器目录中,也没有对应的 *-json.log日志文件生成. 原因: dock

spring boot 开发环境搭建(Eclipse)

Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 spring boot 连接Mysql spring boot配置druid连接池连接mysql spring boot集成mybatis(1) spring boot集成mybatis(2) – 使用pagehelper实现分页 spring boot集成mybatis(3) – mybatis ge

Spring Boot 2.0(五):Docker Compose + Spring Boot + Nginx + Mysql 实践

我知道大家这段时间看了我写关于 docker 相关的几篇文章,不疼不痒的,仍然没有感受 docker 的便利,是的,我也是这样认为的,I know your felling . 前期了解概念什么的确实比较无聊,请不要着急精彩马上开始,当大家对 docker 相关概念有所了解之后,后面我会结合 Spring Boot 给大家来一系列的小例子,会让大家感受到使用 Docker 就是这么爽! 今天给大家演出的导演是 Docker 家族的 docker-compare ,主演是 Spring Boot.