基于Spring Boot的Docker部署实践

1,166 阅读5分钟

基于Spring Boot的Docker部署实践

在云计算和微服务架构日益普及的今天,Docker已成为一种主流的应用部署方式。本文将详细介绍如何将基于Spring Boot的项目部署到Docker容器中。我们将从Spring Boot项目的创建开始,逐步介绍Docker的基本概念、Dockerfile的编写、镜像的构建与发布以及容器的运行与管理等方面的内容。文章最后,我们还将探讨Docker在持续集成与发布(CI/CD)流程中的应用。本文篇幅较长,请读者耐心阅读。

一、Spring Boot项目创建

在开始学习如何将Spring Boot项目部署到Docker之前,我们首先需要创建一个简单的Spring Boot项目。这里我们以一个简单的RESTful API项目为例。

1.1 项目初始化

访问Spring Initializr ↗,选择你喜欢的构建工具(Maven或Gradle)、打包方式(Jar或War)、Java版本等配置信息,然后在依赖项中选择Web,点击“Generate”生成项目模板并下载。

1.2 项目导入与运行

将下载的项目模板解压后,使用IDE(如IntelliJ IDEA或Eclipse)导入项目。项目导入成功后,运行项目的主类文件(含@SpringBootApplication注解的类),访问http://localhost:8080,如果能看到Spring Boot的欢迎页面,说明项目运行成功。

1.3 编写RESTful API

在项目中添加一个简单的RESTful API,以便我们在后续部署到Docker时进行测试。在项目的主类所在的包中,新建一个名为HelloController的类,内容如下:

package com.example.demo;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello() {
        return "Hello, Docker!";
    }
}

重新运行项目,访问http://localhost:8080/hello,如果能看到“Hello, Docker!”的输出,说明RESTful API已经运行成功。

二、Docker基本概念

在将Spring Boot项目部署到Docker之前,我们需要了解一些Docker的基本概念。Docker是一个开源的容器平台,它能够将应用及其依赖打包到一个轻量级、可移植的容器中,从而实现跨平台、跨环境的应用部署。Docker的核心概念包括镜像(Image)、容器(Container)和仓库(Registry)。

2.1 镜像(Image)

镜像是Docker的基本概念之一,可以简单地理解为应用的“静态”表示。镜像包含了运行应用所需的所有文件、代码、配置和依赖,它可以被用来创建容器。镜像是分层的,每一层都是只读的。这种分层结构使得镜像构建和分发变得高效且节省存储空间。

2.2 容器(Container)

容器是Docker的另一个核心概念,它是镜像的“动态”表示。容器是镜像的一个运行实例,它包括一个可写层和一个或多个只读层(即镜像层)。容器能够实现应用的隔离、沙盒化执行,从而保证应用在不同环境中的一致性。

2.3 仓库(Registry)

仓库是用于存储和分发镜像的服务。Docker官方提供了一个公共的仓库Docker Hub ↗,用户可以在其中搜索、拉取和推送镜像。此外,用户还可以搭建私有仓库,用于存储和分发内部项目的镜像。

三、编写Dockerfile

在将Spring Boot项目部署到Docker之前,我们需要编写一个Dockerfile。Dockerfile是一个文本文件,用于描述镜像的构建过程。Dockerfile中包含了一系列指令,每个指令对应一个镜像层。通过编写Dockerfile,我们可以定制应用的镜像。

3.1 创建Dockerfile

在Spring Boot项目的根目录下,新建一个名为Dockerfile的文件(注意,文件名没有后缀)。打开Dockerfile,编写以下内容:

# 基础镜像
FROM openjdk:8-jdk-alpine

# 作者信息
LABEL maintainer="your_name <your_email@example.com>"

# 设置工作目录
WORKDIR /app

# 将项目构建输出的jar文件复制到镜像中
COPY target/*.jar app.jar

# 设置容器启动时执行的命令
ENTRYPOINT ["java", "-jar", "app.jar"]

# 暴露端口
EXPOSE 8080

上述Dockerfile的主要内容如下:

  • FROM指令:指定基础镜像。这里我们选择了一个包含Java 8 JDK的轻量级Alpine镜像。
  • LABEL指令:设置镜像的元数据,如作者信息等。
  • WORKDIR指令:设置镜像的工作目录。这里我们将工作目录设置为/app
  • COPY指令:将项目构建输出的jar文件复制到镜像中。这里我们将target目录下的jar文件复制到工作目录,并重命名为app.jar
  • ENTRYPOINT指令:设置容器启动时执行的命令。这里我们使用java -jar app.jar命令启动Spring Boot应用。
  • EXPOSE指令:暴露容器的端口。这里我们将暴露8080端口,以便访问Spring Boot应用。

3.2 构建镜像

在项目根目录下,打开终端,运行以下命令构建镜像:

docker build -t your_repo/springboot-docker:latest .

其中,-t参数用于指定镜像的名称和标签,your_repo是你的Docker仓库名,springboot-docker是镜像名,latest是标签。.表示Dockerfile所在的上下文目录为当前目录。

构建成功后,运行docker images命令,可以看到新构建的镜像已经添加到本地镜像列表中。

四、运行与管理容器

在构建好镜像后,我们可以使用docker run命令创建并启动一个新的容器。运行以下命令:

docker run -d -p 8080:8080 --name springboot-docker your_repo/springboot-docker:latest

其中:

  • -d参数:以后台模式运行容器。
  • -p参数:将容器的端口映射到宿主机的端口。这里我们将容器的8080端口映射到宿主机的8080端口。
  • --name参数:给容器指定一个名称。这里我们将容器命名为springboot-docker

运行成功后,访问http://localhost:8080/hello,如果能看到“Hello, Docker!”的输出,说明容器已经成功运行。

使用docker ps命令,可以查看当前正在运行的容器列表。使用docker logs命令,可以查看容器的日志输出。使用docker stopdocker start命令,可以停止和启动容