将 Spring Boot 项目发布到 Docker 容器,简化部署过程!

背景

如果你正在使用 Spring Boot 开发项目,那么你一定知道它的便捷性和高效性。但是,当你需要将项目部署到生产环境时,可能会遇到一些挑战。传统的部署方式可能需要大量的配置和手动操作,这不仅费时费力,还容易出错。

现在,有了 Docker,一切都变得简单了!Docker 是一种容器化技术,可以将应用程序及其依赖项打包成一个轻量级的容器,从而实现快速部署和轻松迁移。在本教程中,我们将向你展示如何将 Spring Boot 项目发布到 Docker 容器中,让你的部署过程变得更加简单和高效。

通过使用 Docker,你可以将 Spring Boot 项目打包成一个独立的容器,并在任何支持 Docker 的环境中运行。无论你是在本地开发环境还是在云端部署,都可以享受到 Docker 的便利性。

前置条件

1、构建 spring boot 工程

2、本地启动 docker descktop (Docker version 25.0.2, build 29cf629)

目的

将构建 的springboot 工程,通过 docker 命令构建镜像并运行容器,完成接口请求测试。

构建 springboot 工程

使用 IDEA 2023.3 开发工具构建 springboot 项目工程,结构如下:

其中包含一个 hello 方法:

java 复制代码
@RestController
@SpringBootApplication
public class HelloApplication {
    @GetMapping("/hello")
    public Map<String, Object> test() {
        Map<String, Object> rsMap = new HashMap<>();
        rsMap.put("time", System.currentTimeMillis());
        rsMap.put("msg", "This is HelloSpring");
        return rsMap;
    }

    public static void main(String[] args) {
        SpringApplication.run(HelloApplication.class);
    }
}

编写镜像文件 DockerFile

复制代码
FROM openjdk:8-jre-alpine
VOLUME /tmp
ADD target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app.jar"]

FROM openjdk:8-jre-alpine:使用openjdk:8-jre-alpine作为基础镜像。

VOLUME /tmp:创建一个名为/tmp的卷,用于在容器和宿主机之间共享临时文件。

ADD target/*.jar app.jar:将target目录下的所有jar文件添加到容器的/app.jar路径下。

EXPOSE 8080:暴露容器的8080端口,允许外部访问容器内的服务。

ENTRYPOINT "java", "-jar", "/app.jar":设置容器的启动命令,使用java命令运行/app.jar文件。

构建镜像

复制代码
docker build -t hello-spring .

hello-spring 是镜像的名称, 最后的 . 表示使用当前目录下的 Dockerfile 文件。

此外在开发环境,还可以使用 IDEA 自带工具进行构建:

注:hello-spring是项目名称,1.0.0是版本号

直接允许 Run 即可,查看镜像:

启动容器

复制代码
# 容器端口:8089 映射内部 8080 启动端口
➜  ~ docker run  -d -p 8089:8080 --name hello-spring hello-spring
43a4860ace4671db9b572728249d5fdc02c1367fda85d482ae81bfc3b332d320

➜  ~ curl http://localhost:8089/hello
{"msg":"This is HelloSpring","time":1710492701643}%

查看容器

复制代码
# 查看所有容器
➜  ~ docker container ls -a
CONTAINER ID   IMAGE                    COMMAND                   CREATED          STATUS          PORTS                    NAMES
43a4860ace46   hello-spring             "java -jar /app.jar"      10 minutes ago   Up 10 minutes   0.0.0.0:8089->8080/tcp   hello-spring
577713de9a04   kubernetesui/dashboard   "/dashboard --insecu..."   33 minutes ago   Up 33 minutes                            k8s_kubernetes-dashboard_kubernetes-dashboard-8ff59f48c-9zdc8_kubernetes-dashboard_a74fbff3-0be5-4bfa-98c1-641338a18733_2
3ed1b5acbfd0   86262685d9ab             "/metrics-sidecar"        33 minutes ago   Up 33 minutes                            k8s_dashboard-metrics-scraper_dashboard-metrics-scraper-856cb79ffb-b89pv_kubernetes-dashboard_44b504fe-e5ec-4323-95cb-df87faa273c1_2

# 查看正在运行的容器
docker ps

# 查看容器详情
docker container inspect hello-spring

查看详情也可使用工具,如:

查看日志

复制代码
➜  ~ docker logs -f --tail  100 hello-spring

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::               (v2.7.14)

2024-03-15 08:50:22.709  INFO 1 --- [           main] com.tan.trainning.HelloApplication       : Starting HelloApplication v1.0-SNAPSHOT using Java 1.8.0_212 on 43a4860ace46 with PID 1 (/app.jar started by root in /)
2024-03-15 08:50:22.711  INFO 1 --- [           main] com.tan.trainning.HelloApplication       : No active profile set, falling back to 1 default profile: "default"
2024-03-15 08:50:23.629  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)

最后

一般公司内都有的自己的镜像仓库,目前比较流行的是使用 Docker 和 Jenkins 进行持续集成和持续部署(CI/CD) 以上只是简单的将项目部署到 docker 容器中,真正实现了类 Java 一般"一次构建,到处运行"。

但是,如果在生产环境中部署容器,那么你可能需要使用容器编排工具,例如 Kubernetes 或 Docker Swarm,来管理和调度容器。这些工具可以帮助你自动化容器的部署、扩展和管理,以确保你的应用程序在生产环境中可靠地运行。

相关推荐
LEE8 分钟前
前端转型全栈 03:接口失败也返回 200,OpenAPI 契约与错误码怎么定
前端·后端·全栈
打工仔折腾 AI37 分钟前
用 Docker 部署 Excalidraw 手绘白板并配置固定公网访问的完整实践
人工智能·后端·python
山岚的运维笔记38 分钟前
mysql 专业笔记 -- 第 36 章:MySQL 管理
运维·数据库·笔记·后端·mysql·oracle·dba
掘金者阿豪42 分钟前
Oracle 迁移金仓,50 个存储过程到底要改多少?聊聊实际改造中的几个问题
后端
程序猿小郑1 小时前
Docker Compose 构建完整服务实战指南:从入门到最佳实践
docker·容器
大白801 小时前
iOS 内存深度解析:ARC 到底是怎么管理对象生命周期的
后端
焦玉全1 小时前
Redis Lua 脚本实战:从入门到精通(Java 版)
后端
知识的搬运工旺仔1 小时前
唯一索引与 NULL 值:PostgreSQL 主键约束与 NULLS NOT DISTINCT
数据库·后端·sql·postgresql
大勇前进2 小时前
从 OC 到 Swift,老 iOS 开发者踩过的 10 个语法大坑
后端
我的xiaodoujiao2 小时前
Django 基础知识详细图文教程 9-Django 模板引擎 2
开发语言·数据库·后端·django