Docker化Spring Boot3应用:从镜像构建到部署

简介: 本文介绍了如何在Linux上通过命令行构建和运行Spring Boot 3服务的Docker镜像。首先,基于Ubuntu创建包含JDK 21的基础镜像,然后使用Maven打包Spring Boot应用。接着,构建服务镜像,将应用和依赖添加到镜像中,并设置工作目录和暴露端口。最后,利用docker-compose部署服务,挂载宿主机目录以方便更新静态文件。Docker简化了应用部署,确保了不同环境的一致性。

随着容器化技术的发展,越来越多的应用采用了容器化部署的方式。容器化部署极大地减少了因部署环境不同带来的差异,实现了一次构建、随处运行的效果。此外,容器化还具有版本管理、快速启动、持续集成等优点。今天,我们将介绍如何在Linux上通过命令行构建和运行Spring Boot 3服务的镜像。

_20240522075102.jpg

基础镜像构建

我们的服务采用的jdk 版本为21,spring boot版本为3.1.0,首先我们基于ubuntu来构建一个jdk版本为21的基础镜像。其Dockerfile 文件内容如下:

Dockerfile

# 基础镜像
FROM ubuntu:22.04

# 维护者
MAINTAINER xj

# 拷贝文件到容器(自动解压,解压完目录为jdk-21.0.2)
ADD ./openjdk-21.0.2_linux-x64_bin.tar.gz /usr/local/

# 安装unzip
RUN apt-get update \

&& apt-get install unzip

# 设置JAVA_HOME
ENV JAVA_HOME /usr/local/jdk-21.0.2

ENV PATH $PATH:$JAVA_HOME/bin

将我们的jdk文件openjdk-21.0.2_linux-x64_bin.tar.gz 拷贝到Dockerfile的同级目录下,执行以下命令进行基础镜像的构建:

docker build -t xj/jdk:21.0.2 .

构建完成后我们会在服务器上使用以下命令看到我们刚刚构建的镜像

docker images | grep jdk

_20240522070843.jpg

使用Maven打包服务

在本地打包我们spring boot3服务,我们此处为了方便修改服务中的静态文件,将所有的静态文件打包到了jar包的外部,家人可以翻阅我们之前的文章 深入探讨Maven打包:打造精致的Zip包,打包后snowflake-0.0.1.zip文件的目录结果如下:

_20240522071545.jpg

构建服务镜像

基于我们刚刚创建好的jdk21的基础镜像构建我们的服务镜像,其Dockerfile 文件内容如下:

Dockerfile


# 基础镜像
FROM xj/jdk:21.0.2

# 维护者
MAINTAINER xj

# 环境变量
ENV TZ=Asia/Shanghai \
    SERVER_DIR=/home/app/

RUN mkdir -p $SERVER_DIR \
&& chmod -R 777 $SERVER_DIR 

# 拷贝文件到容器
ADD ./snowflake-0.0.1.zip $SERVER_DIR

RUN  unzip /home/app/snowflake-0.0.1.zip -d $SERVER_DIR  \

&& chmod +x /home/app/start.sh

# 设置工作目录
WORKDIR $SERVER_DIR

# 镜像暴露的端口号
EXPOSE 8000

CMD ["/home/app/start.sh","run"]

将我们打包后的zip文件snowflake-0.0.1.zip 拷贝到Dockerfile的同级目录下,执行以下命令进行基础镜像的构建:

docker build -t xj/snowflake:1.0.0 .

构建成功后我们可以使用以下命令看到构建后的镜像

docker images | grep snowflake

_20240522072556.jpg

使用docker-compose 部署服务

首先在服务器上创建一个部署目录snowflake,在该目录下创建docker-compose.yml文件,内容如下:

docker-compose.yml

version: '3.3'
services:
  snowflake:
    image: xj/snowflake:1.0.0
    container_name: xj-snowflake
    restart: always
    ports:
      - 8000:8000
    volumes:
      - ./data:/home/app

在部署目录下创建挂载目录data,将我们的打包后的服务文件snowflake-0.0.1.zip拷贝到挂载目录中并解压。

我们此处是将整个部署目录/home/app 挂载到了宿主机,这样我们后续如果需要修改配置文件等一些静态文件的话直接修改,完了重启以下服务就可以了,不用重新构建镜像。

在docker-compose.yml同级目录下使用以下命令启动容器

docker-compose up -d

如果不出意外的话我们的服务就启动成功了。

注意: 如果我们以前是直接在服务器上部署服务的话大家注意下start.sh启动脚本,一般都是使用nohup后台启动的,而Docker容器中默认的主进程如果退出,容器就会停止运行。所以我们如果使用docker启动服务的话一定要前台启动。

总结

通过以上步骤,我们实现了使用Spring Boot构建Docker镜像并部署的全过程。Docker使得应用的部署变得更加简单和一致,无论是在本地开发环境还是在生产环境,都能保证应用的可靠运行。希望本文对你在Spring Boot和Docker的结合使用上有所帮助。

目录
相关文章
|
13小时前
|
监控 Java 数据安全/隐私保护
性能监控之 JMX 监控 Docker 容器中的 Java 应用
【6月更文挑战9天】性能监控之 JMX 监控 Docker 容器中的 Java 应用
6 1
|
17小时前
|
监控 测试技术 开发者
【Docker项目实战】使用Docker部署NextTrace Web路由工具
【6月更文挑战第16天】使用Docker部署NextTrace Web路由工具
9 2
|
1天前
|
Java Linux Spring
在 Linux 系统中将 Spring Boot 应用作为系统服务运行
【6月更文挑战第11天】最近由于一些原因,服务器经常会重启,每次重启后需要手动启动 Spring Boot 的工程,因此我需要将其配置成开启自启动的服务。
5 0
|
1天前
|
存储 Linux Docker
python项目 以docker形式打包部署全流程
在很久很久以前,我已经听过Docker的大名,当时服务着急上线虽然考虑过用Docker来部署我的服务,但是因为赶期的原因放弃了。 这两天因为华为云服务器到期,而且阿里云服务器优惠力度特别大的原因,我要把华为云服务器里的工程迁移到阿里云。 迁移的过程中,大量的时间精力浪费在了重装python,加载依赖,迁移项目,配置端口等环境配置的工作上。 我在想,如果当时用了Docker部署,我至于受这气?
|
1天前
|
Web App开发 测试技术 数据安全/隐私保护
【Docker项目实战】使用Docker部署linkding书签管理器
【6月更文挑战第15天】使用Docker部署linkding书签管理器
14 7
|
2天前
|
JSON 安全 Java
Spring Security 与 JWT、OAuth 2.0 整合详解:构建安全可靠的认证与授权机制
Spring Security 与 JWT、OAuth 2.0 整合详解:构建安全可靠的认证与授权机制
8 0
|
2天前
|
负载均衡 Java API
Spring Cloud Gateway 详解:构建高效的API网关解决方案
Spring Cloud Gateway 详解:构建高效的API网关解决方案
5 0
|
2天前
|
Nacos Docker 容器
docker部署nacos
docker部署nacos
13 2
|
2天前
|
应用服务中间件 nginx Docker
docker部署nginx
docker部署nginx
15 1
|
2天前
|
消息中间件 存储 数据安全/隐私保护
docker部署rabbitmq
docker部署rabbitmq
6 0