随着云计算、容器化等技术的发展和普及,业界对于部署和维护应用程序的要求也愈发严格。使用传统的部署方式,需要为不同的操作系统、硬件环境和配置参数分别编译和打包,增加了开发和运维人员的工作量和难度。而使用 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 管理多个容器,快速部署完整的应用程序。