前述:
本篇教程将略过很多docker下载环境配置的基础步骤,如果您对docker不太熟悉请参考我的上一个教程:SpringBoot新手快速入门系列教程九:基于docker容器,部署一个简单的项目
使用 Docker Compose 支持部署 Docker 项目有许多优势,
对比:使用 Docker 和 Docker Compose
功能 | Docker | Docker 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 的优势
- 简化多容器管理:通过一个简单的
docker-compose.yml
文件定义所有服务,使用一个命令即可启动或停止整个应用。 - 服务依赖管理:可以定义服务之间的依赖关系,确保按顺序启动。
- 统一网络管理:所有服务自动加入同一个网络,方便服务之间的通信。
- 环境变量和配置管理:可以在
docker-compose.yml
文件中统一管理环境变量和配置。 - 易于扩展和缩放:可以简单地通过调整
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