基于SpringBoot项目实现Docker容器化部署

将Spring Boot项目部署到Docker容器中的涉及几个主要步骤:
在这里插入图片描述

准备Docker镜像

  • 首先,需要选择一个基础镜像,通常是包含Java运行时环境的镜像,例如OpenJDK。可以从Docker Hub或其他镜像仓库中获取这些镜像。
  • 接下来,需要在基础镜像上构建一个包含Spring Boot应用程序的镜像。这包括将应用程序的JAR文件、依赖项和配置文件添加到镜像中。

编写Dockerfile

  • Dockerfile是一个文本文件,其中包含了构建Docker镜像的指令。需要编写一个Dockerfile来指定如何构建包含Spring Boot应用程序的镜像。
  • 在Dockerfile中,可以使用COPY指令将本地文件(包括Spring Boot应用程序的JAR文件和配置文件)复制到镜像中。
  • 使用RUN指令可以在容器内运行命令,例如安装依赖项或执行应用程序的构建。
  • 使用CMDENTRYPOINT指令指定在容器启动时要运行的命令,通常是启动Spring Boot应用程序的命令。

构建Docker镜像

  • 使用docker build命令根据Dockerfile构建Docker镜像。例如:docker build -t my-spring-boot-app .,其中-t选项用于指定镜像的名称和标签。

运行Docker容器

  • 使用docker run命令运行你的Docker镜像。例如:docker run -p 8080:8080 my-spring-boot-app,其中-p选项用于将主机的端口映射到容器的端口,以便外部可以访问应用程序。
  • 还可以使用其他选项来配置容器,例如挂载卷、设置环境变量等。

访问应用程序

  • 一旦容器运行,可以通过访问主机的端口(在上述示例中是8080)来访问运行在Docker容器中的Spring Boot应用程序。

Docker容器化部署Spring Boot项目的原理涉及将应用程序及其依赖项打包到一个Docker镜像中,然后在容器内运行该镜像。这使得应用程序在不同环境中更加可移植和隔离,同时也方便了部署和扩展。使用Docker可以大大简化应用程序的部署流程,并提供了更好的资源管理和隔离,以及更高的可伸缩性。

闲言少叙,上科技!!!

方式一:直接构建jar包运行的镜像

  • 将打包好程序,上传到服务器的指定目录
    例如:/home/www/spring-boot-image/spring-boot-docker-1.0.jar
  • 在该目录下创建Dockerfile文件
FROM openjdk:8u312
MAINTAINER zhangt
ADD spring-boot-docker-1.0.jar zhangt.jar
EXPOSE 8520
ENTRYPOINT ["java","-jar","zhangt.jar"]

Dockerfile的内容解释:
FROM openjdk:8u312
这一行指定了基础镜像,从openjdk:8u312镜像构建。它使用了OpenJDK 8的版本号为312的镜像作为基础。这是一个包含Java运行时环境的基础镜像。
MAINTAINER zhangt
这一行设置了维护者信息,尽管在较新版本的Docker中,MAINTAINER已不再建议使用,而可以使用LABEL来添加类似的元数据信息。
ADD spring-boot-docker-1.0.jar zhangt.jar
这一行使用ADD指令将本地的spring-boot-docker-1.0.jar文件复制到镜像中,并重命名为zhangt.jar。这个JAR文件包含了Spring Boot应用程序的可执行代码。
EXPOSE 8520
这一行使用EXPOSE指令声明容器将监听的端口号,这里指定为8520。请注意,这只是一个元数据声明,它不会自动将端口映射到主机上。
ENTRYPOINT ["java","-jar","zhangt.jar"]
这一行设置了容器启动时要执行的命令。在这种情况下,容器将以java -jar zhangt.jar命令启动,这会运行Spring Boot应用程序。java命令会启动Java虚拟机(JVM),并执行zhangt.jar中的可执行代码。
这Dockerfile的作用是基于OpenJDK 8u312镜像构建一个包含Spring Boot应用程序的Docker镜像。一旦构建完成,可以使用这个镜像来运行Spring Boot应用程序的容器,容器将监听8520端口,可以通过适当的端口映射来让外部访问应用程序。

  • 创建好Dockerfile文件之后,执行命构建镜像
docker build -t zhangt .

注意最后的 . 表示Dockerfile在当前文件目录下。zhangt表示构建的镜像,构建成功后可以使用**docker images**命令查看镜像。
-t 选项用于指定镜像的名称和标签,你可以将 zhangt 替换为你想要的名称和标签。

  • 镜像构建成功之后,就可以运行容器
docker run -d --restart=always --name zhangt -p 8520:8520 zhangt

各个参数的含义:
docker run: 用于启动 Docker 容器的命令。
-d: 这是一个选项,表示在后台(守护进程模式)运行容器。容器将在后台运行,不会占据终端。
--restart=always: 这是另一个选项,表示容器在退出时总是重新启动。即使容器因为错误或其他原因而停止,Docker 也会尝试自动重新启动容器。
--name zhangt: 这是用于给容器指定一个名称的选项。容器的名称被设置为 “zhangt”。
-p 8520:8520: 这是用于将主机端口与容器端口进行映射的选项。这个选项将主机的 8520 端口映射到容器的 8520 端口。这样,外部可以通过访问主机的 8520 端口来访问容器内运行的应用程序。
zhangt: 这是容器的名称或镜像名称,表示要运行的容器是基于名为 “zhangt” 的 Docker 镜像创建的。如果 “zhangt” 是一个镜像名称,Docker 将查找该镜像并在容器中运行它。
这个命令的目的是在后台运行一个 Docker 容器,该容器使用 “zhangt” 镜像创建,并将主机的 8520 端口映射到容器的 8520 端口。容器的名称设置为 “zhangt-p”,并且如果容器在任何情况下退出,Docker 会自动重新启动它。这通常用于部署应用程序,以确保应用程序在意外情况下能够自动恢复。
启动容器后可以使用 **docker ps**命令查看启动的容器
docker logs -f --tail 1000 容器id ,可以查看服务的日志。
如果想更新jar包,只需要使用 docker cp spring-boot-docker-1.0.jar 容器ID:/zhangt.jar,就可以将spring-boot-docker-1.0.jar拷贝进容器并重命名,然后 docker restart 容器ID 重启容器。

方式二:基于jdk镜像运行容器

  • 在服务器中来取jdk镜像
docker pull openjdk:8u181
  • 创建目录,并将jar包上传到该目录
cd /home/  mkdir www/spring-boot-docker
  • 在Jar放置的同级目录,编写shell脚本命名为:start.sh
#!/bin/bash
echo -e "\n################ build service start #########################"

# delete docker container
echo -e "\n1, delete docker container [spring-boot-docker-1.0] start ......"
sudo docker rm -f spring-boot-docker-1.0

# docker run # docker run developer-platform-basic-1.0.0
echo -e "\n2, docker run build container [spring-boot-docker-1.0] start ......"
sudo docker run --name spring-boot-docker-1.0 -d -p 8741:8741 \
-v /home/www/spring-boot-docker:/jar openjdk:8u181 \
java -jar /jar/spring-boot-docker-1.0.jar --spring.profiles.active=dev

echo -e "\n3, docker ps container [spring-boot-docker-1.0] start ...."
sudo docker ps -a  | grep spring-boot-docker-1.0

echo -e "\n4, docker logs container [spring-boot-docker-1.0] start ...."
sudo docker logs -f -t spring-boot-docker-1.0 > ./logs/log_$(date +%Y%m%d).out 2>&1 &

echo -e "\n################ build service end #########################"

核心脚本解释:
1.sudo docker run 这是用于在Docker中运行容器的命令。通常需要使用sudo权限来执行Docker命令,以确保具有足够的权限来管理容器。
2. --name spring-boot-docker-1.0: 这是为Docker容器指定的名称,容器的名称被设置为"spring-boot-docker-1.0"。
3. -d: 这是一个选项,表示在后台运行容器(即以守护进程模式运行),而不是在前台交互模式下运行。
4. -p 8741:8741: 这个选项用于将主机的端口与容器的端口进行映射。具体来说,将主机的8741端口映射到容器的8741端口,这样外部可以通过主机的8741端口访问容器中的应用程序。
5. -v /home/www/spring-boot-docker:/jar: 这个选项用于将主机的文件系统目录与容器内的目录进行挂载。在这种情况下,将主机上的/home/www/spring-boot-docker目录挂载到容器内的/jar目录。这通常用于将应用程序的代码和资源文件从主机复制到容器中,以便在容器内运行应用程序。
6. openjdk:8u181: 这是要在容器中使用的Docker镜像的名称和标签。在这里,使用的是一个基于OpenJDK 8u181的Java镜像,该镜像包含了Java运行时环境。
7. java -jar /jar/spring-boot-docker-1.0.jar --spring.profiles.active=dev: 这是在容器内运行的命令。它启动了Java虚拟机(JVM),并在JVM内运行了一个Spring Boot应用程序。具体来说,它运行了/jar/spring-boot-docker-1.0.jar这个JAR文件,并通过–spring.profiles.active=dev指定了一个Spring配置文件的激活配置。

这个脚本的作用是创建一个名为"spring-boot-docker-1.0"的Docker容器,该容器运行一个基于Spring Boot的Java应用程序,该应用程序监听8741端口,并将主机上的/home/www/spring-boot-docker目录挂载到容器内的/jar目录,以供应用程序使用。这样,可以通过主机的8741端口访问运行在容器中的Spring Boot应用程序。

  1. 运行脚本 sh start.sh
  2. 以后发布,只需要把宿主机目录里的jar包替换掉,重启容器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/879687.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++库文件移植到QT中一直出错

🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收…

【软考】数据字典(DD)

目录 1. 说明2. 数据字典的内容2.1 说明2.2 数据流条目2.3 数据存储条目2.4 数据项条目2.5 基本加工条目 3. 数据词典管理4. 加工逻辑的描述4.1 说明4.2 结构化语言4.3 判定表4.3 判定树 5. 例题5.1 例题1 1. 说明 1.数据流图描述了系统的分解,但没有对图中各成分进…

一个基于 laravel 和 amis 开发的后台框架, 友好的组件使用体验,可轻松实现复杂页面(附源码)

前言 随着互联网应用的发展,后台管理系统的复杂度不断增加,对于开发者而言,既要系统的功能完备,又要追求开发效率的提升。然而,传统的开发方式往往会导致大量的重复劳动,尤其是在构建复杂的管理页面时。有…

【移动端开发】“明日头条APP”

文章目录 1 系统概述1.1研究背景1.2研究意义 2 系统设计2.1 关键技术2.2 系统设计2.2.1 系统功能模块2.2.2 数据库设计 3 系统实现3.1 数据模型3.1.1 NewsURL3.1.2 NewsType3.1.3 NewsInfo 3.2 数据库操作3.2.1 DBOpenHelper3.2.2 DBManager 3.3 适配器类3.3.1 AddItem3.3.2 In…

Redhat 7,8,9系(复刻系列) 一键部署Oracle19c rpm

Oracle19c前言 Oracle 19c 是甲骨文公司推出的一款企业级关系数据库管理系统,它带来了许多新的功能和改进,使得数据库管理更加高效、安全和可靠。以下是关于 Oracle 19c 的详细介绍: 主要新特性 多租户架构:支持多租户架构,允许多个独立的数据库实例在同一个物理服务器上…

【机器学习】9 ——最大熵模型的直观理解

机器学习9 ——最大熵模型的直观理解 文章目录 机器学习9 ——最大熵模型的直观理解前奏例子硬币垃圾邮件代码 前奏 【机器学习】6 ——最大熵模型 例子 硬币 假设我们有一枚硬币,可能是公平的,也可能是不公平的。我们的任务是估计硬币的正反面出现的…

通过Python代码发送量化交易信号邮件通知

量化交易利用数学模型和计算机算法来分析市场数据,并生成交易信号,本文将介绍如何使用Python编写一个简单的脚本,通过发送邮件通知量化交易信号。 开启SMTP服务 首先要在发件箱的邮件设置中,将POP3/SMPT服务开启,记录下授权密码,在本地可通过此密码登录,注意有效期和保…

微信小程序页面制作——婚礼邀请函(含代码)

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

【网络】TCP/IP 五层网络模型:网络层

最核心的就是 IP 协议,是一个相当复杂的协议 TCP 详细展开讲解,是因为 TCP 确实在开发中非常关键,经常用到,IP 则不同,和普通程序猿联系比较浅。和专门开发网络的程序猿联系比较紧密(开发路由器&#xff0…

3款免费的GPT类工具

前言 随着科技的飞速发展,人工智能(AI)的崛起与发展已经成为我们生活中不可或缺的一部分。它的出现彻底改变了我们与世界互动的方式,并为各行各业带来了前所未有的便利。 一、Kimi 网址:点我前往 国产AI模型Kimi是一…

neo4j安装启动教程+对应的jdk配置

参考这位博主的视频教程:neo4j社区windows版下载 一、官网下载neo4j的安装包 (1)官网下载页面 (2)上一步 【download】之后,会自动下载,如果没有,点击【here】 这里可以看到一行字…

Qwen 2.5:阿里巴巴集团的新一代大型语言模型

Qwen 2.5:阿里巴巴集团的新一代大型语言模型 摘要: 在人工智能领域,大型语言模型(LLMs)的发展日新月异,它们在自然语言处理(NLP)和多模态任务中扮演着越来越重要的角色。阿里巴巴集…

获取参数

获取querystring参数 querystring 指的是URL中 ? 后面携带的参数,例如:http://127.0.0.1:9090/web?query杨超越。 获取请求的querystring参数的方法如下: 方法1: Query package main// querystringimport ("github.com/…

有毒有害气体检测仪的应用和性能_鼎跃安全

随着现代工业的不断发展和扩张,越来越多的企业涉及到有毒有害气体的生产、使用和处理。工业规模的扩大导致有毒有害气体的排放量增加,同时也增加了气体泄漏的风险。在发生火灾、爆炸或危险化学品泄漏等紧急事件时,救援人员需要迅速了解现场的…

python+flask+mongodb+vue撸一个实时监控linux服务资源的网站

用pythonflaskmongodbvue写一个监控linux服务资源实时使用率的页面网站,并每30秒定时请求,把Linux数据保存数据到mongodb数据库中,监控的linux的资源有:cup、内存、网络带宽、mysql慢查询、redis、系统平均负载、磁盘使用率等&…

百度Android IM SDK组件能力建设及应用

作者 | 星途 导读 移动互联网时代,随着社交媒体、移动支付、线上购物等行业的快速发展,对即时通讯功能的需求不断增加。对于各APP而言,接入IM SDK(即时通讯软件开发工具包)能够大大降低开发成本、提高开发效率&#…

动手学习RAG:大模型重排模型 bge-reranker-v2-gemma微调

动手学习RAG: 向量模型动手学习RAG: moka-ai/m3e 模型微调deepspeed与对比学习动手学习RAG:rerank模型微调实践 bge-reranker-v2-m3动手学习RAG:迟交互模型colbert微调实践 bge-m3动手学习RAG: 大模型向量模型微调 intfloat/e5-mistral-7b-instruct动手学…

Leetcode Hot 100刷题记录 -Day14(矩阵置0)

矩阵置0 问题描述: 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0。 示例 1: 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]]示例 2:…

模版进阶(template)

1.非类型模版参数 模版参数分类类型形参与非类型形参。 ① 类型形参:出现在在模板参数列表中,跟在class或者typename之类的参数类型名称。 ② 非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当…

鸿蒙Harmony应用开发,数据驾驶舱登录页面的实现

鸿蒙Harmony应用开发,数据驾驶舱登录页面的实现 ​ 首先我们有个Splash 过渡页面来判断当前是用户是否登录,我们先从preferences中获取token是否存在。如果不存在直接跳转登录即可,如果存在的情况我们再去获取下用户的信息看看token是否过期…