SpringBoot新手快速入门系列教程十:基于Docker Compose,部署一个简单的项目

我的教程都是亲自测试可行才发布的,如果有任何问题欢迎留言或者来群里我每天都会解答。

前述:

 本篇教程将略过很多docker下载环境配置的基础步骤,如果您对docker不太熟悉请参考我的上一个教程:SpringBoot新手快速入门系列教程九:基于docker容器,部署一个简单的项目

使用 Docker Compose 支持部署 Docker 项目有许多优势,

对比:使用 Docker 和 Docker Compose

功能DockerDocker Compose
单一容器管理良好,使用 Dockerfile 和 docker run良好,但通常用于多容器管理
多容器管理较繁琐,需要手动管理各个容器优秀,使用 docker-compose.yml 文件
服务依赖管理手动设置依赖关系和启动顺序自动管理依赖关系和启动顺序
配置和环境管理使用环境变量和配置文件使用环境变量和配置文件,统一管理
扩展和缩放手动扩展,使用 docker run简单扩展,使用 docker-compose up --scale

另外对于分布式的 Spring Boot 应用,建议使用 Docker Compose 来管理多个服务。虽然仅使用 Docker 也可以实现,但 Docker Compose 提供了更多的便利性和简化操作,特别是当涉及到多个相互依赖的服务时。以下是原因及如何使用 Docker Compose 来构建分布式 Spring Boot 应用的详细步骤:

使用 Docker Compose 的优势

  1. 简化多容器管理:通过一个简单的 docker-compose.yml 文件定义所有服务,使用一个命令即可启动或停止整个应用。
  2. 服务依赖管理:可以定义服务之间的依赖关系,确保按顺序启动。
  3. 统一网络管理:所有服务自动加入同一个网络,方便服务之间的通信。
  4. 环境变量和配置管理:可以在 docker-compose.yml 文件中统一管理环境变量和配置。
  5. 易于扩展和缩放:可以简单地通过调整 docker-compose.yml 文件扩展服务实例数量。

步骤一:新建基于Docker Compose的项目

选择依赖

步骤二:代码示例

1. 创建实体类

src/main/java/com/yuye/www/hellodockeradv/entity 目录下创建 User.java 文件:

package com.yuye.www.hellodockeradv.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String name;

    // Getters and Setters
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

2,创建Repository接口

src/main/java/com/yuye/www/hellodockeradv/repository 目录下创建 UserRepository.java 文件:

package com.yuye.www.hellodockeradv.repository;

import com.yuye.www.hellodockeradv.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.Optional;

public interface UserRepository extends JpaRepository<User, Long> {
    Optional<User> findByName(String name);
    boolean existsByName(String name);
}

3,创建Controller

src/main/java/com/yuye/www/hellodockeradv/controller 目录下创建 UserController.java 文件:

package com.yuye.www.hellodockeradv.controller;

import com.yuye.www.hellodockeradv.entity.User;
import com.yuye.www.hellodockeradv.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.Optional;

@RestController
public class UserController {

    @Autowired
    private UserRepository userRepository;

     @GetMapping("/register")
    public String registerUser(@RequestParam String name) {
        // Check if a user with the same name already exists
        if (userRepository.existsByName(name)) {
            return "User already exists";
        }

        // If user doesn't exist, create a new user and save to the database
        User user = new User();
        user.setName(name);
        userRepository.save(user);
        return "User registered successfully";
    }

    @GetMapping("/login")
    public String loginUser(@RequestParam String name) {
        Optional<User> user = userRepository.findByName(name);
        if (user.isPresent()) {
            return "User found: " + name;
        } else {
            return "User not found";
        }
    }
}

4. 配置 application.properties 文件

src/main/resources/application.properties 文件中添加MySQL数据库连接配置

spring.application.name=HelloDockerAdv
spring.datasource.url=jdbc:mysql://localhost:3306/userdata?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=Qwerty123
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect

server.port=8081

5. 创建 Dockerfile

在项目根目录下创建一个 Dockerfile 文件:

# 使用官方的OpenJDK镜像作为基础镜像
FROM openjdk:17-jdk-slim

# 添加一个环境变量来指示Spring Boot使用哪个端口
ENV SERVER_PORT=8080

# 将jar包添加到容器中
COPY build/libs/HelloDockerAdv-0.0.1-SNAPSHOT.jar app.jar

# 暴露应用程序的端口
EXPOSE 8080

# 运行jar包
ENTRYPOINT ["java", "-jar", "/app.jar"]

6. 创建 docker-compose.yml 文件

在项目根目录下创建一个 docker-compose.yml 文件:

version: '3.8'
services:
  app:
    image: hellodockeradv
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8080:8080"
    depends_on:
      - mysql
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/demo
      SPRING_DATASOURCE_USERNAME: root
      SPRING_DATASOURCE_PASSWORD: yourpassword

  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: yourpassword
      MYSQL_DATABASE: demo
    ports:
      - "3306:3306"
    volumes:
      - mysql-data:/var/lib/mysql

volumes:
  mysql-data:

7. 构建和运行Docker容器

确定你的mysql数据库有一个

userdata

和一个user的表

然后启动mysql后

在项目根目录下运行以下命令:

# 构建Spring Boot应用程序
./gradlew build

# 启动Docker Compose,构建并运行所有服务
docker-compose up --build

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值