使用中间件自动化部署java应用
为了实现你在 IntelliJ IDEA 中打包项目并通过工具推送到两个 Docker 服务器(172.168.0.1 和 172.168.0.12),并在推送后自动或手动重启容器,我们可以按照以下步骤进行操作:
-
在 IntelliJ IDEA 中配置 Maven 或 Gradle 打包:
- 如果你使用的是 Maven,确保
pom.xml
文件中有正确的构建配置。 - 如果你使用的是 Gradle,确保
build.gradle
文件中有正确的构建配置。
- 如果你使用的是 Maven,确保
-
构建 Docker 镜像:
- 创建一个
Dockerfile
文件来定义如何构建你的应用程序镜像。
- 创建一个
-
配置 Docker 客户端:
- 在本地机器上安装 Docker 并配置好与远程 Docker 服务器的连接。
-
编写脚本来自动化整个流程:
- 使用 Bash 脚本或其他脚本语言来自动化构建、推送和重启容器的过程。
-
设置中间件:
- 可以使用 Jenkins、GitLab CI/CD、Ansible 等工具来管理自动化流程。
下面是一个详细的示例,假设你使用的是 Maven 和 Docker,并且使用 Jenkins 来管理自动化流程。
1. 配置 Maven 打包
确保 pom.xml
文件中包含以下内容:
xml
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>my-application</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>
2. 创建 Dockerfile
创建一个 Dockerfile
文件:
# 使用官方的 Java 基础镜像
FROM openjdk:11-jre-slim# 设置工作目录
WORKDIR /app# 复制构建好的 jar 文件到镜像中
COPY target/my-application-1.0-SNAPSHOT.jar my-application.jar# 暴露应用程序的端口
EXPOSE 8080# 运行应用程序
ENTRYPOINT ["java", "-jar", "my-application.jar"]
ENTRYPOINT ["java", "-jar", "my-application.jar"]
3. 配置 Docker 客户端
确保你的本地机器上有 Docker 安装并且可以连接到远程 Docker 服务器。你可以通过 SSH 连接到远程 Docker 服务器并配置 Docker 守护进程监听 TCP 端口。
编辑 /etc/docker/daemon.json
文件:
bash
{"hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"]
}
然后重启 Docker 服务:
bash
sudo systemctl restart docker
4. 编写 Jenkins Pipeline
在 Jenkins 中创建一个新的 Pipeline 项目,并添加以下 Groovy 脚本:
groovy
pipeline {agent anystages {stage('Build') {steps {sh 'mvn clean package'}}stage('Build Docker Image') {steps {script {def app = docker.build("my-application:${env.BUILD_ID}")app.push("172.168.0.1:5000/my-application:${env.BUILD_ID}")app.push("172.168.0.12:5000/my-application:${env.BUILD_ID}")}}}stage('Deploy to 172.168.0.1') {steps {script {// 登录到第一个 Docker 服务器sh 'ssh user@172.168.0.1 "docker pull 172.168.0.1:5000/my-application:${BUILD_ID} && docker stop my-application || true && docker rm my-application || true && docker run -d --name my-application -p 8080:8080 172.168.0.1:5000/my-application:${BUILD_ID}"'}}}stage('Deploy to 172.168.0.12') {steps {script {// 登录到第二个 Docker 服务器sh 'ssh user@172.168.0.12 "docker pull 172.168.0.12:5000/my-application:${BUILD_ID} && docker stop my-application || true && docker rm my-application || true && docker run -d --name my-application -p 8080:8080 172.168.0.12:5000/my-application:${BUILD_ID}"'}}}}
}
5. 设置中间件
在这个例子中,我们使用 Jenkins 来管理整个流程。Jenkins 可以自动触发构建过程,并在构建完成后自动执行部署和重启操作。
5.1 安装 Jenkins 插件
确保在 Jenkins 中安装了以下插件:
- Git Plugin
- Docker Pipeline Plugin
5.2 配置 Jenkins 凭证
在 Jenkins 中配置 SSH 凭证,以便 Jenkins 可以通过 SSH 访问远程 Docker 服务器。
6. 测试流程
- 提交代码到版本控制系统(如 Git)。
- 触发 Jenkins 构建(可以通过定时任务、手动触发或 Webhook 触发)。
- Jenkins 将会自动执行构建、打包、推送 Docker 镜像以及部署和重启容器的操作。
这样,你就完成了从 IntelliJ IDEA 到 Jenkins 自动化构建、打包、推送和部署 Docker 镜像的全过程。
另外一个案例介绍
使用中间件来管理和自动化 Docker 容器的部署和管理是一个很好的实践,可以帮助提高效率和一致性。我们将使用 Jenkins 作为中间件来管理 Docker 容器,并配置一个具体的案例。
案例概述
假设我们有一个简单的 Spring Boot 应用程序,我们需要将其打包成 Docker 镜像,并推送到两个 Docker 服务器(172.168.0.1
和 172.168.0.12
)。然后在每个服务器上自动或手动重启容器。
步骤
- 准备项目代码
- 创建 Dockerfile
- 安装并配置 Jenkins
- 配置 Jenkins Pipeline
- 设置 Docker Hub 或私有仓库
- 测试整个流程
1. 准备项目代码
假设你已经有一个 Spring Boot 项目,以下是项目的目录结构:
my-spring-boot-app/
├── src/
│ └── ...
├── pom.xml
└── Dockerfile
2. 创建 Dockerfile
在项目根目录下创建一个 Dockerfile
文件:
# 使用官方的 Java 基础镜像
FROM openjdk:11-jre-slim# 设置工作目录
WORKDIR /app# 复制构建好的 jar 文件到镜像中
COPY target/my-spring-boot-app-1.0-SNAPSHOT.jar my-spring-boot-app.jar# 暴露应用程序的端口
EXPOSE 8080# 运行应用程序
ENTRYPOINT ["java", "-jar", "my-spring-boot-app.jar"]
3. 安装并配置 Jenkins
3.1 安装 Jenkins
你可以通过多种方式安装 Jenkins,这里以 Ubuntu 为例:
bash
wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -
sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt-get update
sudo apt-get install jenkins
sudo systemctl start jenkins
sudo systemctl enable jenkins
访问 http://your_jenkins_server_ip_or_domain:8080
并完成初始设置。
3.2 安装必要的插件
在 Jenkins 管理界面中,导航到“Manage Jenkins” -> “Manage Plugins”,安装以下插件:
- Git Plugin
- Docker Pipeline Plugin
- SSH Agent Plugin
3.3 配置 SSH 凭证
- 导航到“Manage Jenkins” -> “Manage Credentials”。
- 添加全局凭证:
- 类型:SSH Username with private key
- ID:
jenkins-docker-server
- Description:
Credentials for accessing Docker servers
- Username:
user_on_docker_servers
- Private Key:粘贴你的私钥内容
4. 配置 Jenkins Pipeline
4.1 创建一个新的 Pipeline 项目
- 在 Jenkins 主页点击“New Item”。
- 输入项目名称,选择“Pipeline”,然后点击“OK”。
4.2 编写 Jenkins Pipeline 脚本
在 Pipeline 项目的配置页面中,找到“Pipeline”部分,将以下 Groovy 脚本粘贴进去:
groovy
pipeline {agent anyenvironment {DOCKER_IMAGE_NAME = 'my-spring-boot-app'VERSION = "${env.BUILD_ID}"DOCKER_SERVER_1 = '172.168.0.1'DOCKER_SERVER_2 = '172.168.0.12'SSH_CREDENTIALS_ID = 'jenkins-docker-server'}stages {stage('Checkout') {steps {git url: 'https://github.com/yourusername/my-spring-boot-app.git', branch: 'main'}}stage('Build') {steps {sh 'mvn clean package'}}stage('Build Docker Image') {steps {script {docker.build("${DOCKER_IMAGE_NAME}:${VERSION}")}}}stage('Push Docker Image to Server 1') {steps {sshagent([env.SSH_CREDENTIALS_ID]) {sh """docker save -o ${DOCKER_IMAGE_NAME}-${VERSION}.tar ${DOCKER_IMAGE_NAME}:${VERSION}scp ${DOCKER_IMAGE_NAME}-${VERSION}.tar user@${DOCKER_SERVER_1}:/home/user/${DOCKER_IMAGE_NAME}-${VERSION}.tarssh user@${DOCKER_SERVER_1} "docker load -i /home/user/${DOCKER_IMAGE_NAME}-${VERSION}.tar &&docker stop ${DOCKER_IMAGE_NAME} || true &&docker rm ${DOCKER_IMAGE_NAME} || true &&docker run -d --name ${DOCKER_IMAGE_NAME} -p 8080:8080 ${DOCKER_IMAGE_NAME}:${VERSION}""""}}}stage('Push Docker Image to Server 2') {steps {sshagent([env.SSH_CREDENTIALS_ID]) {sh """docker save -o ${DOCKER_IMAGE_NAME}-${VERSION}.tar ${DOCKER_IMAGE_NAME}:${VERSION}scp ${DOCKER_IMAGE_NAME}-${VERSION}.tar user@${DOCKER_SERVER_2}:/home/user/${DOCKER_IMAGE_NAME}-${VERSION}.tarssh user@${DOCKER_SERVER_2} "docker load -i /home/user/${DOCKER_IMAGE_NAME}-${VERSION}.tar &&docker stop ${DOCKER_IMAGE_NAME} || true &&docker rm ${DOCKER_IMAGE_NAME} || true &&docker run -d --name ${DOCKER_IMAGE_NAME} -p 8080:8080 ${DOCKER_IMAGE_NAME}:${VERSION}""""}}}}post {always {cleanWs()}}
}
5. 设置 Docker Hub 或私有仓库
在这个案例中,我们直接在 Jenkins 上构建和推送 Docker 镜像到远程服务器。如果你希望使用 Docker Hub 或私有仓库,可以进行相应的调整。
5.1 使用 Docker Hub
- 登录 Docker Hub 并创建一个仓库。
- 修改 Jenkins Pipeline 脚本中的推送步骤:
groovy
stage('Push Docker Image to Docker Hub') {steps {script {docker.withRegistry('https://index.docker.io/v1/', 'docker-hub-credentials-id') {def app = docker.build("${env.DOCKER_IMAGE_NAME}:${env.VERSION}")app.push()}}}
}
确保在 Jenkins 中配置了 Docker Hub 的凭据。
6. 测试整个流程
- 提交代码到版本控制系统(如 Git)。
- 手动触发 Jenkins 构建(可以在 Jenkins 项目主页点击“Build Now”)。
- Jenkins 将会自动执行以下操作:
- 从 Git 仓库拉取最新代码。
- 构建 Maven 项目并生成 JAR 文件。
- 构建 Docker 镜像。
- 推送 Docker 镜像到两个 Docker 服务器。
- 在每个服务器上停止并删除旧的容器,然后启动新的容器。
总结
通过上述步骤,我们成功地使用 Jenkins 作为中间件来管理和自动化 Docker 容器的部署和管理。Jenkins 自动化了从代码提交到应用部署的整个过程,提高了效率和一致性。
如果你有任何问题或需要进一步细化某个部分,请告诉我!
相关文章:
使用中间件自动化部署java应用
为了实现你在 IntelliJ IDEA 中打包项目并通过工具推送到两个 Docker 服务器(172.168.0.1 和 172.168.0.12),并在推送后自动或手动重启容器,我们可以按照以下步骤进行操作: 在 IntelliJ IDEA 中配置 Maven 或 Gradle 打…...
pytorch张量分块投影示例代码
张量的投影操作 背景 张量投影 是深度学习中常见的操作,将输入张量通过线性变换映射到另一个空间。例如: Y=W⋅X+b 其中: X: 输入张量(形状可能为 (B,M,K),即批量维度、序列维度、特征维度)。W: 权重矩阵((K,N),将 K 维投影到 N 维)。b: 偏置向量(可选,(N,))。Y:…...

Visual Studio 同一解决方案 同时运行 多个项目
方案一 方案二...
VMware中Ubuntu如何连接网络?安排!
一、设置NAT模式 1、关闭Ubuntu虚拟机: 确保Ubuntu已经完全关机,而不是挂起或休眠状态。 2、编辑虚拟网络设置: 在VMware主界面点击“编辑”菜单,选择“虚拟网络编辑器”。 如果需要,选择VMnet8 (NAT模式)并点击“更改…...

使用 Charles 调试 Flutter 应用中的 Dio 网络请求
为了成功使用 Charles 抓取并调试 Flutter 应用程序通过 Dio 发起的网络请求,需遵循特定配置步骤来确保应用程序能够识别 Charles 的 SSL 证书,并正确设置代理服务器。 配置 Charles 以支持 HTTPS 请求捕获 Charles 默认会拦截 HTTP 流量;…...
CMD批处理命令入门(6)——常用的特殊字符
CMD批处理命令入门(6)——特殊字符 本章内容主要学习要点:重定向符 >、>>命令管道符 |组合命令 &、&&、||转义字符 ^变量引导符 %界定符 "" 本章内容主要学习要点: >、>>重定向符| 命令…...

【跟着官网学技术系列之MySQL】第7天之创建和使用数据库1
前言 在当今信息爆炸的时代,拥有信息检索的能力很重要。 作为一名软件工程师,遇到问题,你会怎么办?带着问题去搜索引擎寻找答案?亦或是去技术官网,技术社区去寻找? 根据个人经验,一…...
next-auth v5 结合 Prisma 实现登录与会话管理
1. 安装依赖 npm install next-auth prisma prisma/client2. 配置 Prisma 模型 在 prisma/schema.prisma 文件中定义 User 和 Account 模型(next-auth v5 推荐使用自定义模型)。 model User {id String id default(uuid())email …...

WPS excel使用宏编辑器合并 Sheet工作表
使用excel自带的工具合并Sheet表,我们会发现需要开通WPS会员才能使用合并功能; 那么WPS excel如何使用宏编辑器进行合并 Sheet表呢? 1、首先我们要看excel后缀是 .xlsx 还是 .xls ;如果是.xlsx 那么 我们需要修改为 .xls 注…...

(即插即用模块-Attention部分) 四十四、(ICIP 2022) HWA 半小波注意力
文章目录 1、Half Wavelet Attention2、代码实现 paper:HALFWAVELET ATTENTION ON M-NET FOR LOW-LIGHT IMAGE ENHANCEMENT Code:https://github.com/FanChiMao/HWMNet 1、Half Wavelet Attention 传统的图像增强方法主要关注图像在空间域的特征信息&am…...

Linux第二课:LinuxC高级 学习记录day04
6、shell中的语句 6.3、结构性语句 6.3.1、if if…then…fi 1、结构 1)基本结构 if 表达式 then 命令表 fi if [ 表达式 ] // 【】两侧有空格 then 命令表 fi 2)分层结构 if 表达式 then 命令表1 else 命令表2 fi 3)嵌套结构 if …...

occ的开发框架
occ的开发框架 1.Introduction This manual explains how to use the Open CASCADE Application Framework (OCAF). It provides basic documentation on using OCAF. 2.Purpose of OCAF OCAF (the Open CASCADE Application Framework) is an easy-to-use platform for ra…...
Redis 如何解决大 key 问题
前言 嗨👋,大家好,我是雪荷。做为一个后端开发,Redis 是我们经常接触到的一个非关系行数据库。其对我们系统开发和优化有着举足轻重的作用,但是随着业务和用户迅速增长,也会滋生许多的问题,而大…...
驱动开发系列33 - Linux Graphics mesa Intel驱动介绍
一:概述 mesa 中的 Intel 驱动体系是为支持 Intel GPU 提供图形 API 的硬件实现部分,主要包括 OpenGL、Vulkan等图形接口,Intel驱动实现整体上分为四层: 第一层:API 层, 实现 OpenGL 和 Vulkan 接口, src/mesa/main、src/vulkan。 第二层:驱动层,实现 OpenGL 和 Vulkan…...
【华为OD-E卷 - 整数编码 100分(python、java、c++、js、c)】
【华为OD-E卷 - 整数编码 100分(python、java、c、js、c)】 题目 实现一种整数编码方法,使得待编码的数字越小,编码后所占用的字节数越小。 编码规则如下: 编码时7位一组,每个字节的低7位用于存储待编码数字的补码 字…...
vue3 uniapp封装一个瀑布流组件
新增组件m-waterfall 这样就可以在页面直接使用 不用在引入了 <template><view class"m-waterfall"><view id"m-left-column" class"m-column"><slot name"left" :leftList"leftList"></slot&…...
Android Room 持久化库的介绍及使用方法
Android Room 是 Android Jetpack 组件之一,是 Google 官方推出的用于简化 SQLite 数据库操作的持久化库。它提供了一个抽象层,允许开发者在 SQLite 数据库上执行常见的 CRUD 操作,同时处理数据库连接、数据迁移和查询优化等底层细节。 Andr…...
Go语言中http.Transport的Keep-Alive配置与性能优化方法
在Go语言中,http.Transport是一个用于发送HTTP或HTTPS请求的客户端工具,它提供了许多可配置的参数以优化性能。其中,Keep-Alive配置是性能优化的关键部分。以下是对http.Transport的Keep-Alive配置与性能优化方法的详细解释: 一、…...

设计模式03:行为型设计模式之策略模式的使用情景及其基础Demo
1.策略模式 好处:动态切换算法或行为场景:实现同一功能用到不同的算法时和简单工厂对比:简单工厂是通过参数创建对象,调用同一个方法(实现细节不同);策略模式是上下文切换对象,调用…...
C# 多线程 Task TPL任务并行
先总结一下 之前发展过程的要点 1: 为了保证多线程正确顺序执行 线程同步 2: 为了节省操作系统线程资源 线程池 异步 方式管理 正常来讲 使用这俩个要点 进行使用 多线程可以满足开发使用需求 但是 新的问题产生了 那就是 多个异步操作 需要编写大量的代…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...

基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...

【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...