如何使用 SpringBoot 和 Docker 技术,实现一次构建到处运行的应用程序?

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 如何使用 SpringBoot 和 Docker 技术,实现一次构建到处运行的应用程序?

随着云计算、容器化等技术的发展和普及,业界对于部署和维护应用程序的要求也愈发严格。使用传统的部署方式,需要为不同的操作系统、硬件环境和配置参数分别编译和打包,增加了开发和运维人员的工作量和难度。而使用 Docker 技术,可以将应用程序与所需的依赖项封装为一个镜像,使其能够在任何地方以相同的方式运行,实现了一次构建到处运行的目标。本文介绍如何使用 SpringBoot 和 Docker 技术,实现一次构建到处运行的应用程序。

环境准备

在使用 SpringBoot 和 Docker 技术之前,需要安装和配置相应的开发环境和工具。本文使用的开发环境为:

  • Java 8
  • Maven
  • IntelliJ IDEA
  • Docker

请确保已经正确安装了以上环境和工具,并且能够正常使用。

创建 SpringBoot 项目

首先,我们创建一个 SpringBoot 项目作为演示。使用 IntelliJ IDEA 新建项目,选择 Spring Initializr,填写项目基本信息后,点击下一步进入依赖选择页面。这里我们选择 Web、JPA、MySQL 等常用依赖,点击完成,即可创建一个基本的 SpringBoot 项目。

编写应用程序

接下来,编写一个简单的应用程序,实现用户名的增删改查功能。为了演示方便,我们使用内存数据库 H2,省去了安装和配置 MySQL 数据库的步骤。

首先,定义一个 User 实体类,表示用户信息:

@Entity
@Table(name = "t_user")
@Data
public class User {
   
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotBlank
    private String name;

    public User(String name) {
   
        this.name = name;
    }

    // 省略 getter 和 setter 方法
}

然后,定义一个 UserRepository 接口,继承 JpaRepository,提供增删改查等基本方法:

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
   
}

最后,实现一个 UserController,处理用户请求:

@RestController
@RequestMapping("/user")
public class UserController {
   
    @Autowired
    private UserRepository userRepository;

    @PostMapping
    public User create(@RequestBody User user) {
   
        return userRepository.save(user);
    }

    @GetMapping("/{id}")
    public User getById(@PathVariable Long id) {
   
        return userRepository.findById(id).orElse(null);
    }

    @PutMapping("/{id}")
    public User updateById(@PathVariable Long id, @RequestBody User user) {
   
        user.setId(id);
        return userRepository.save(user);
    }

    @DeleteMapping("/{id}")
    public void deleteById(@PathVariable Long id) {
   
        userRepository.deleteById(id);
    }
}

到此,基本的应用程序编写完成。

构建 Docker 镜像

接下来,我们使用 Docker 将应用程序打包成镜像,并在运行时加入所需的依赖项。

首先,创建一个 Dockerfile 文件,指定基础镜像、将应用程序打包成 Jar 包并复制到镜像中、设置容器启动命令等:

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

然后,在项目根目录下执行以下命令,构建 Docker 镜像:

docker build -t myapp:latest .

其中,myapp 为镜像名称,latest 为标签。如果需要指定版本号,可以使用 myapp:1.0 等格式。

构建完成后,可以使用以下命令查看所有已经构建的镜像:

docker images

运行 Docker 容器

完成镜像构建后,可以使用以下命令启动一个容器实例:

docker run -p 8080:8080 myapp:latest

其中,-p 8080:8080 表示将容器的 8080 端口映射到主机的 8080 端口,myapp:latest 表示使用刚刚构建的镜像。

启动后,可以在浏览器中访问 http://localhost:8080/user 查看应用程序运行情况。

使用 Docker Compose 管理多个容器

在对 SpringBoot 应用程序进行部署时,除了应用本身的镜像,在生产环境中常常需要一些辅助的服务,例如数据库、Redis 缓存、消息队列等。这些服务可以单独使用 Docker 镜像进行部署,也可以使用 Docker Compose 进行管理。

Docker Compose 是一个简化部署过程的工具,可以管理多个 Docker 容器。使用 Docker Compose,可以通过配置文件一次性启动完整的应用程序,并自动创建和管理所有必需的容器。

下面,我们通过一个示例,演示如何使用 Docker Compose 管理多个容器。

首先,定义一个 docker-compose.yml 文件,指定需要启动的服务和参数。在本例中,我们使用 MySQL 作为数据库服务:

version: '3.5'
services:
  app:
    build: .
    ports:
      - "8080:8080"
    depends_on:
      - db
  db:
    image: mysql:8
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_USER: mydbuser
      MYSQL_PASSWORD: mydbpass
      MYSQL_DATABASE: mydb
    ports:
      - "3306:3306"
    volumes:
      - ./mysql_data:/var/lib/mysql

其中,app 表示将启动应用程序的容器;build: . 表示使用当前目录下的 Dockerfile 构建镜像;ports: - "8080:8080" 表示将容器的 8080 端口映射到主机的 8080 端口;depends_on 表示在启动应用程序之前,需要先启动 db 容器;db 表示将启动 MySQL 数据库容器;image: mysql:8 表示使用 MySQL 官方提供的镜像;environment 表示设置环境变量,指定数据库的用户名、密码、数据库名称等;ports 表示将容器的 3306 端口映射到主机的 3306 端口;volumes 表示将容器内的 /var/lib/mysql 目录挂载到主机的 ./mysql_data/ 目录,实现数据持久化。

保存文件后,使用以下命令启动所有服务:

docker-compose up

启动完成后,可以使用以下命令查看所有已经启动的容器:

docker ps

此时,可以通过访问 http://localhost:8080/user 测试应用程序是否能够正常运行,并且能够使用 MySQL 数据库进行数据存储。如果需要停止所有容器,可以使用以下命令:

docker-compose down

总结

本文介绍了如何使用 SpringBoot 和 Docker 技术,实现一次构建到处运行的应用程序。首先,创建一个基本的 SpringBoot 项目,然后编写应用程序,实现用户名的增删改查功能。然后,使用 Docker 将应用程序打包成镜像,并在运行时加入所需的依赖项。最后,演示了如何使用 Docker Compose 管理多个容器,快速部署完整的应用程序。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1天前
|
Prometheus 监控 Cloud Native
构建高效稳定的Docker容器监控体系
【5月更文挑战第20天】 在微服务架构日益普及的今天,Docker作为其重要的实现技术之一,承载着大量应用的运行。然而,随之而来的是对于容器健康状态、资源使用情况以及性能指标的监控需求急剧增加。本文旨在探讨构建一个高效且稳定的Docker容器监控体系,不仅涵盖了监控工具的选择与配置,还详细阐述了监控数据的分析与处理流程。通过精心设计的监控策略和实时响应机制,我们能够确保系统的稳定性,并及时发现及处理潜在的问题。
|
4天前
|
Kubernetes 持续交付 Docker
构建高效微服务架构:Docker与Kubernetes的完美搭档
【5月更文挑战第17天】在当今云计算和微服务架构的大潮中,Docker容器化技术和Kubernetes容器编排系统成为了后端开发领域的热门技术栈。本文将探讨如何通过Docker和Kubernetes的结合使用来构建一个高效、可扩展且易于管理的微服务环境。我们将从基础概念出发,深入到实际操作层面,最后讨论这种组合对持续集成和持续部署(CI/CD)流程的影响,旨在为开发者和企业提供一种可靠的后端服务解决方案。
|
6天前
|
存储 前端开发 JavaScript
基于 GitHub Workflow和 Docker 构建 NextJS
基于 GitHub Workflow和 Docker 构建 NextJS
9 0
|
6天前
|
Prometheus 监控 Cloud Native
构建高效稳定的Docker容器监控体系
【5月更文挑战第14天】 在现代微服务架构中,Docker容器作为应用部署的基本单元,其运行状态的监控对于保障系统稳定性和性能至关重要。本文将探讨如何构建一个高效且稳定的Docker容器监控体系,涵盖监控工具的选择、关键指标的采集、数据可视化以及告警机制的设计。通过对Prometheus和Grafana的整合使用,实现对容器资源利用率、网络IO以及应用健康状态的全方位监控,确保系统的高可用性和故障快速响应。
|
6天前
|
Prometheus 监控 Cloud Native
构建高效稳定的Docker容器监控体系
【5月更文挑战第13天】在微服务架构和容器化部署日益普及的背景下,对Docker容器的监控变得尤为重要。本文将探讨一种构建高效稳定Docker容器监控体系的方法,通过集成Prometheus和cAdvisor工具,实现对容器资源使用情况、性能指标和运行状态的实时监控。同时,结合Grafana进行数据可视化,为运维人员提供直观的分析界面,以便及时发现和解决潜在问题,保障系统的高可用性和稳定性。
31 6
|
6天前
|
存储 安全 数据安全/隐私保护
【Docker 专栏】Docker 容器化应用的备份与恢复策略
【5月更文挑战第9天】本文探讨了Docker容器化应用的备份与恢复策略,强调了备份在数据保护、业务连续性和合规要求中的关键作用。内容涵盖备份的重要性、内容及方法,推荐了Docker自带工具和第三方工具如Portainer、Velero。制定了备份策略,包括频率、存储位置和保留期限,并详细阐述了恢复流程及注意事项。文章还提及案例分析和未来发展趋势,强调了随着技术发展,备份与恢复策略将持续演进,以应对数字化时代的挑战。
【Docker 专栏】Docker 容器化应用的备份与恢复策略
|
6天前
|
监控 Kubernetes Docker
【Docker 专栏】Docker 容器内应用的健康检查与自动恢复
【5月更文挑战第9天】本文探讨了Docker容器中应用的健康检查与自动恢复,强调其对应用稳定性和系统性能的重要性。健康检查包括进程、端口和应用特定检查,而自动恢复则涉及重启容器和重新部署。Docker原生及第三方工具(如Kubernetes)提供了相关功能。配置检查需考虑检查频率、应用特性和监控告警。案例分析展示了实际操作,未来发展趋势将趋向更智能和高效的检查恢复机制。
【Docker 专栏】Docker 容器内应用的健康检查与自动恢复
|
4天前
|
Java 虚拟化 Docker
Docker简介及用途,为什么要使用Docker?Docker容器和虚拟机的区别
Docker简介及用途,为什么要使用Docker?Docker容器和虚拟机的区别
|
4天前
|
存储 Linux Docker
CentOS7修改Docker容器和镜像默认存储位置
CentOS7修改Docker容器和镜像默认存储位置