丝滑的打包部署,一套带走~

news2024/11/15 6:35:34

以下文章来源于悟空聊架构 ,作者悟空聊架构

本文主要内容如下:

目录

一、背景

Docker打包部署方案

项目背景:新项目的后端框架是刚起步,搭建的是一套微服务框架,基础服务有网关 Gateway, Nacos 注册中心,以及其他的微服务。现在需要弄个简单且方便的,基于 Docker 的部署方式。

为什么用 Docker:为了让后端程序更容易打包部署和管理,所以用上了 Docker 容器化部署。比如用 Docker Swarm 或 K8s 来管理多个容器。

为什么要提到 Windows:本地机器是 Windows 系统开发,通过 Windows + IDEA 将应用程序打成 Docker 镜像,然后拷贝到 Linux 服务器进行容器化部署。

  • 疑问1:有同学可能会有疑问,Windows 还能跑 Docker 吗???那必须的!

  • 疑问2:如果项目的代码改了,是不是得重新打包 docker 镜像?不需要,直接替换 docker volume 里面的 JAR 包即可。

  • 疑问3:怎么没有用 Jenkins?新项目,新项目,牛奶和面包都会有的。

二、Windows 运行 Docker

2.1 原理

为了在 Windows 能够打包 Docker 镜像,就必须弄个可以运行 Docker 的环境。

Docker 依赖于已存在并运行的 Linux 内核环境。实质上是在已经运行的 Linux 下制造了一个隔离的文件环境,因此它执行的效率几乎等同于所部署的 Linux 主机。

如果其他系统想部署 Docker 就必须安装一个虚拟 Linux 环境。

2.2 启用 Hyper-V

Windows+虚拟机+Docker

Windows 自带的 Hyper-V 工具就是一款管理和创建虚拟机的工具,要求:Windows 10 企业版、专业版或教育版。启用 Hyper-V 如下所示:

启用 Hyper-V

操作步骤:程序和功能->打开或关闭 Windows 功能->选择“Hyper-V”,然后单击“确定

参考链接:

https://learn.microsoft.com/zh-cn/virtualization/hyper-v-on-windows/quick-start/enable-hyper-v

2.3 安装 Docker for Windows

点击 官网下载地址,并下载 Windows 的版本,安装就是一路点击 next 就好了。

官网下载地址:https://www.docker.com/products/docker-desktop/

安装好之后,打开 Windows 的Powershell 命令行窗口,执行 docker run hello-world。当看到 Hello from Docker!就表示安装成功。

好了,现在我们开发环境拥有了运行 docker 容器,打包 docker 镜像的能力。接下来我们来看下如何用 IDEA 开发工具来启动 docker 容器和打包镜像。

三、IDEA 打包镜像

IDEA 工具很强大,提供 Docker 相关的功能。

IDEA 打包 Docker 镜像的方式主要分为这么几步:

  • 通过 Maven 工具将 SpringBoot 应用程序打成可执行的 JAR 包。

  • IDEA 执行指定的 Dockerfile 打包成 Docker 镜像。

这里我写了一个简单 SpringBoot 项目,定义了一个简单的 Rest API 接口。

应用程序的端口为 9600。

server.port=9600

3.1 Maven Build JAR 包

Maven 打包的话这个我们都比较熟悉,直接执行 Maven 命令(mvn package)或者在 IDEA 上点击 Maven 相关按钮即可。就会生成这样一个包

operation-core-0.0.1-SNAPSHOT,我们可以把它的名字改短一点,就改为  operation.jar 吧

3.2 编写 Dockerfile

Dockerfile 又是什么呢?

它是一个用来构建镜像的文本文件,文件内容就是一条条构建镜像所需的指令和说明。

我们就到项目创建两个 dockerfile 文件吧,一个用作开发环境的,一个用作生产环境的。

如下所示:

# 拉取指定的镜像文件
FROM hub.c.163.com/library/java:latest

# MAINTAINER 指令允许你给将要制作的镜像设置作者信息
MAINTAINER wukong <1@163.com>
# 容器内创建一个 apps 目录,用来挂载 jar 包
RUN mkdir -p /apps
# 将 passjavas-demo-1.0 jar 包复制到 /apps/passjava-demo.jar
ADD passjava-demo-1.0.jar /apps/passjava-demo.jar
# 设置时区
ENV TZ "Asia/Shanghai"
# 设置暴露的端口
EXPOSE 9600
#dockerfile中增加健康检查,interval表示每个5分钟检查一次,timeout每次超过5秒钟认定为失败,retries失败后轮询3次认定为容器不健康,考虑重启。
#HEALTHCHECK --interval=60s --timeout=5s --retries=6 \
#  CMD curl -f http://localhost:8989/health || exit 1
# 运行 Java 应用程序的命令
ENTRYPOINT ["java","-jar","/apps/passjava-demo.jar"]

3.3 配置和执行 Dockerfile

在 IDEA 里面创建一个 运行配置,添加一个 Dockerfile 配置,如下所示:

开始运行这个配置后,IDEA 就会根据 dockerfile 里面的配置自动拉取 Java JDK 镜像文件,这个过程会比较长,Java JDK 还是比较大的。

拉取之后,会一步步执行 dockerfile 里面的命令,最后会启动一个 docker 容器。

3.4 测试

我们来测试下 Java 程序是否正常运行。还是用 curl 命令访问 Restful API。

curl http://localhost:9600/test

咦?居然访问不通,这是为啥??

我们来排查下。先看下容器日志,执行命令 docker logs <容器id>,可以看到 Java 应用程序正常启动,也没有报错日志。

那说明可能是网络问题,比如容器的端口和我们本机的端口没有映射。果不其然。这里端口是否没有映射的,如下图所示。

那说明通过这种方式虽然能正常启动程序,但是程序不能提供服务,那就换一种方式。上面的方式是通过 Dockerfile 创建了一个镜像文件,然后 IDEA 工具帮我们启动了一个 Docker 容器,但是这种容器还缺少一些参数,比如端口映射没有做。要不我们就自己来启动一个容器看看?自己启动就是通过 docker run 命令即可,不过也可以通过创建一个 IDEA container 配置来启动一个容器。

3.5 IDEA 自定义容器

如下图所示,自定义一个容器跑配置。因为上面的步骤我们已经创建了镜像了,所以可以直接用这个镜像即可。

话不多说,直接运行起来看下。

再来看下端口映射,这次就映射好了,完美!

再来测试下是否能访问 API。还是用 curl 命令,返回结果如下,这次就成功了。

passjava,悟空聊架构

四、部署到服务器

4.1 部署思路

不过这都是在我们本地玩的,如何把它弄到服务器上呢??步骤如下:

  • 把镜像保存为一个压缩包,上传到服务器,服务器上用命令启动容器。

  • 如果有代码修改,把项目重新打成 JAR 包上传到挂载的目录就可以了。

如下图,和文章最开始看到的图相比,做了一些简化,思路是一致的。

4.2 部署

先在本地把 docker 镜像打成一个 tar 包。

docker save passjava-docker-demo-23.02 -o D:\passjava-demo.tar

然后把这个 tar 包拷贝到 Linux 服务器。

将镜像拷贝到服务器

接着将 tar 加载为 docker 镜像

docker load -i passjava-demo.tar

passjava-demo镜像包

然后就可以通过命令来启动容器了。命令里面包含了挂载的目录卷,端口映射,启动方式等。

docker run --name passjava-demo -d \
-v /nfs-data/service:/nfs-data/service \
-v /nfs-data/service/apps:/apps \
-v /nfs-data/service/logs:/nfs-data/service/logs \
--restart=always \
-p 9600:9600 \
passjava-docker-demo-23.02

咦,启动容器又报错了,查看日志提示找不到 jar 包。

启动报错,找不到 jar 包

哦,想起来了,挂载上面的 apps 目录后,容器会从容器里面的 apps 目录找 JAR 包,发现没有这个 jar 包,当然报错了呀!

运行命令

而这个 apps 目录正好是和宿主服务器的 /nfs-data/service/apps 目录做了映射的,这个目录没有 jar 包,容器里面的 apps 目录也就没有 jar 包。所以我们可以把 jar 包拷贝到这个目录就好了。

等等,为什么用 IDEA 启动容器时没有问题?因为当时没有 IDEA 做目录的映射。

启动完成后,我们来测试下部署的服务是否正常。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为什么stm32gpio引脚的翻转速度最大只有18Mhz

(1). GPIO 引脚速度&#xff1a;GPIO_Speed_2MHz (10MHz, 50MHz) ; 又称输出驱动电路的响应速度&#xff1a;&#xff08;芯片内部在I/O口的输出部分安排了多个响应速度不同的输出驱动电路&#xff0c;用户可以根据自己的需要选择合适的驱动电路&#xff0c;通过选择速度来选择…

史上最全测试开发工具视频教程详解(含自动化、性能、接口、抓包)

目录 一、UI自动化测试工具 1. uiautomator2 2. Appium 3. ATX-Test 4. Airtest 5. ATXServer2 6. STF 7. Appetizer 二、APP稳定性测试工具 8. UICrawler 9. Maxim 10. AppCrawler 三、APP性能测试工具 11. SoloPi 12. GT 四、抓包工具 13. AnyProxy …

pytorch安装教程(二)

一直用的pytorch1.2&#xff0c;有点老了&#xff0c;想换个新版本&#xff0c;换成了pytorch2.0. torch安装 安装过程最重要的就是cuda、cudnn的版本和pytorch对应。 因为要在GPU上跑代码。 删除老旧torch 我用的软件是anaconda&#xff0c;因为可以创建虚拟环境。 步骤&…

LAZADA将缩短履约时效,卖家发货倍感压力

Lazada的跨境卖家们&#xff0c;恐怕又要头疼了。 近日&#xff0c; Lazada官方宣布&#xff0c;为了提升消费者体验&#xff0c;平台将调整商家履约订单时效。从2023年5月4日起生成的订单履约时效将有所更新。 具体而言&#xff0c;内地、香港和Laz Go Global的履约节点为“点…

Qt Quick - MessageDialog 消息提示框

MessageDialog 使用总结一、概述二、使用1. 例子一2. 例子二三、常用属性一、概述 MessageDialog 最基本的用例是弹出警告框。它还允许用户根据启用的按钮以各种方式进行响应。对话框最初是不可见的。你需要首先按需设置属性&#xff0c;然后将visible设置为true或调用open()。…

FIFO设计笔记(双口RAM、同步FIFO、异步FIFO)Verilog及仿真

文章目录0、前言0.1、FIFO0.2、FIFO与RAM1、异步双口RAM1.1、原理1.2、Verilog代码1.3、tb仿真2、FIFO设计前瞻知识2.1、格雷码2.1.1、二进制转格雷码Verilog代码tb仿真2.1.2、格雷码转二进制Verilog代码tb仿真2.2、独热码3、同步FIFO3.1、同步FIFO设计原理3.1.1、设计原理3.1.…

SpringBoot中操作Redis通过所有可能的key查询存在的key并解析为对象实体的通用方法

场景 SpringBoot中操作Redis的特殊操作-批量查询(通过key的集合批量查杜绝模糊搜索)、查询并解析对象list&#xff1a; SpringBoot中操作Redis的特殊操作-批量查询(通过key的集合批量查杜绝模糊搜索)、查询并解析对象list_霸道流氓气质的博客-CSDN博客 在上面讲操作redis中特…

【未来已来】人人都说GPT,人人都怕GPT,人人都用GPT

文章目录前言一、GPT是什么&#xff1f;二、当GPT和AI遇到摄影总结前言 ChatGPT是由美国OpenAI研发的能够通过自然语言驱动的人工智能技术工具&#xff0c;因为它强大的执行力和任务处理能力&#xff0c;一经亮相就引起了极大的关注。与之类似&#xff0c;在图像智能生成方面&…

Java 自学 - 接口与继承 接口

设计 Java 的接口 在设计 LOL 的时候&#xff0c;进攻类英雄有两种&#xff0c;一种是进行物理系攻击&#xff0c;一种是进行魔法系攻击 这时候&#xff0c;就可以使用接口来实现这个效果。 接口就像是一种约定&#xff0c;我们约定某些英雄是物理系英雄&#xff0c;那么他们…

交接机的基本原理

第七章&#xff1a;交接机的基本原理 在网络中传输数据时需要遵循一些标准&#xff0c;以太网协议定义了数据帧在以太网上的传输标准&#xff0c;了解以太网协议是充分理解数据链路层通信的基础。以太网交换机是实现数据链路层通信的主要设备&#xff0c;了解以太网交换机的工作…

抽象轻松web

不管是求最大值&#xff0c;还是最小值&#xff0c;无论是整数还是小数&#xff0c;数据类型是不是一样的 它们的本质上都是判断&#xff0c;在判断的基础上不断的变换&#xff0c;增加判断条件&#xff0c;增加判断过程罢了 判断需要两个本质 1 &#xff1a;两个以上的元素…

Redis高可用高性能缓存的应用系列2 - 事务机制和IO多路复用、持久化

概述 Redis高可用高性能缓存的应用系列的第二篇&#xff0c;主要介绍Redis事务机制和IO多路复用、和持久化的知识点。 Redis事务机制 Redis事务机制&#xff0c;和Mysql有大的不同&#xff0c;分为4步进行执行&#xff1a; 1.事务提交前&#xff0c;先检查命令语法是否正确…

【2023版】基于部标JT808JT1078车载视频位置监控平台介绍-开源项目

演示地址&#xff1a;http://gps.lingx.com 账号&#xff1a;admin 密码&#xff1a;123456 部标/苏标设备入口 IP&#xff1a;47.100.112.218 &#xff1b; 端口&#xff1a;8808 1.项目背景 “GPS/GPRS车辆智能管理系统”具备车辆实时定位监控、远程监控调度、行驶路线偏移…

ChatGPT帮我和老板吵架,半分钟做了个思维导图...

大家好&#xff0c;我是小z&#xff0c;也可以叫我阿粥最近那个疑似成都电科的截图已经传疯了&#xff0c;贴一张图回味下&#xff1a;这种壮士断腕式的吵法&#xff0c;可以说几乎是单方面的虐杀。但是有朋友问了&#xff0c;在职场中还是有所顾忌&#xff0c;有没有更体面点的…

什么是浪涌保护器防雷过压保护

每年有数十万起雷击和过电压造成的损坏&#xff0c;造成的损失高达数千万元。过压保护装置是电气装置综合保护概念的一部分&#xff0c;可以可靠地防止过压造成的损坏。 过电压损坏 过电压是小于千分之一秒的短暂电压峰值&#xff0c;超过电气设备允许的设计工作电压的许多倍…

因为我没交周报,leader要罚款200元,怎么给他挖坑?能以敲诈勒索罪告他吗?...

没交周报就罚款&#xff0c;这种事你们遇到过吗&#xff1f;一位网友说&#xff1a;leader在群里通知不交周报就罚款&#xff0c;这周罚到他头上&#xff0c;要罚款200元&#xff0c;这种情况怎么办&#xff1f;能定他一个敲诈勒索罪或者抢劫罪吗&#xff1f;最差也要在离职后把…

paddle通过极简方案构建手写数字识别模型

参考&#xff1a; 飞桨PaddlePaddle-源于产业实践的开源深度学习平台 前提条件 在数据处理前&#xff0c;首先要加载飞桨平台与“手写数字识别”模型相关的类库&#xff0c;实现方法如下。 #加载飞桨和相关类库 import paddle from paddle.nn import Linear import paddle.nn…

Spring 之循环依赖

Spring 框架是一个流行的Java应用程序框架&#xff0c;它提供了许多强大的功能&#xff0c;如依赖注入和面向切面编程。然而在使用 Spring 框架时&#xff0c;我们可能会遇到循环依赖的问题。 这种情况发生在两个或多个 Bean 之间相互依赖的情况下&#xff0c;其中一个 Bean 依…

LT8711/LT8712 Type-C转HDMI设计方案|替代LT8711/LT8712芯片|GSV2201可完全替代兼容LT8711/LT8712

LT8711/LT8712 Type-C转HDMI设计方案|替代LT8711/LT8712芯片|GSV2201可完全替代兼容LT8711/LT8712 龙迅&#xff08;Lontium&#xff09;的LT8711/LT8712&#xff0c;是一款Type-C转HDMI 4K的视频转换芯片 通过USB Type-C连接器将DP RX视频信号转换为HDMI/DVI TX视频信号。DP…

【jvm系列-03】精通运行时数据区私有区域---虚拟机栈、程序计数器、本地方法栈

JVM系列整体栏目 内容链接地址【一】初识虚拟机与java虚拟机https://blog.csdn.net/zhenghuishengq/article/details/129544460【二】jvm的类加载子系统以及jclasslib的基本使用https://blog.csdn.net/zhenghuishengq/article/details/129610963【三】运行时私有区域之虚拟机栈…