使用中间件自动化部署java应用

为了实现你在 IntelliJ IDEA 中打包项目并通过工具推送到两个 Docker 服务器(172.168.0.1 和 172.168.0.12),并在推送后自动或手动重启容器,我们可以按照以下步骤进行操作:

  1. 在 IntelliJ IDEA 中配置 Maven 或 Gradle 打包

    • 如果你使用的是 Maven,确保 pom.xml 文件中有正确的构建配置。
    • 如果你使用的是 Gradle,确保 build.gradle 文件中有正确的构建配置。
  2. 构建 Docker 镜像

    • 创建一个 Dockerfile 文件来定义如何构建你的应用程序镜像。
  3. 配置 Docker 客户端

    • 在本地机器上安装 Docker 并配置好与远程 Docker 服务器的连接。
  4. 编写脚本来自动化整个流程

    • 使用 Bash 脚本或其他脚本语言来自动化构建、推送和重启容器的过程。
  5. 设置中间件

    • 可以使用 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 any

    stages {
        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. 测试流程

  1. 提交代码到版本控制系统(如 Git)。
  2. 触发 Jenkins 构建(可以通过定时任务、手动触发或 Webhook 触发)。
  3. Jenkins 将会自动执行构建、打包、推送 Docker 镜像以及部署和重启容器的操作。

这样,你就完成了从 IntelliJ IDEA 到 Jenkins 自动化构建、打包、推送和部署 Docker 镜像的全过程。

另外一个案例介绍

使用中间件来管理和自动化 Docker 容器的部署和管理是一个很好的实践,可以帮助提高效率和一致性。我们将使用 Jenkins 作为中间件来管理 Docker 容器,并配置一个具体的案例。

案例概述

假设我们有一个简单的 Spring Boot 应用程序,我们需要将其打包成 Docker 镜像,并推送到两个 Docker 服务器(172.168.0.1172.168.0.12)。然后在每个服务器上自动或手动重启容器。

步骤

  1. 准备项目代码
  2. 创建 Dockerfile
  3. 安装并配置 Jenkins
  4. 配置 Jenkins Pipeline
  5. 设置 Docker Hub 或私有仓库
  6. 测试整个流程

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 凭证
  1. 导航到“Manage Jenkins” -> “Manage Credentials”。
  2. 添加全局凭证:
    • 类型: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 项目
  1. 在 Jenkins 主页点击“New Item”。
  2. 输入项目名称,选择“Pipeline”,然后点击“OK”。
4.2 编写 Jenkins Pipeline 脚本

在 Pipeline 项目的配置页面中,找到“Pipeline”部分,将以下 Groovy 脚本粘贴进去:

groovy

pipeline {
    agent any

    environment {
        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}.tar
                        ssh 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}.tar
                        ssh 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
  1. 登录 Docker Hub 并创建一个仓库。
  2. 修改 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. 测试整个流程

  1. 提交代码到版本控制系统(如 Git)。
  2. 手动触发 Jenkins 构建(可以在 Jenkins 项目主页点击“Build Now”)。
  3. Jenkins 将会自动执行以下操作:
    • 从 Git 仓库拉取最新代码。
    • 构建 Maven 项目并生成 JAR 文件。
    • 构建 Docker 镜像。
    • 推送 Docker 镜像到两个 Docker 服务器。
    • 在每个服务器上停止并删除旧的容器,然后启动新的容器。

总结

通过上述步骤,我们成功地使用 Jenkins 作为中间件来管理和自动化 Docker 容器的部署和管理。Jenkins 自动化了从代码提交到应用部署的整个过程,提高了效率和一致性。

如果你有任何问题或需要进一步细化某个部分,请告诉我!

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

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

相关文章

JavaScript动态渲染页面爬取之Splash

Splash是一个 JavaScript渲染服务,是一个含有 HTTP API的轻量级浏览器,它还对接了 Python 中的 Twisted 库和 OT库。利用它&#xff0c;同样可以爬取动态渲染的页面。 功能介绍 利用 Splash&#xff0c;可以实现如下功能&#xff1a; 异步处理多个网页的渲染过程:获取渲染后…

Thrustmaster Hotas Warthog飞行操作杆开发

目录 0 摘 要 &#xff1a;简单说一下这篇文章在搞啥 1 背 景 &#xff1a;什么需求以及对开发的背景调查 2 环境配置 &#xff1a;具体需要什么环境&#xff0c;对软件层面的需求 3 硬件测试 &#xff1a;测试遥感器…

算法-查找数组对角线上最大的质数

力扣题目&#xff1a;2614. 对角线上的质数 - 力扣&#xff08;LeetCode&#xff09; 给你一个下标从 0 开始的二维整数数组 nums 。 返回位于 nums 至少一条 对角线 上的最大 质数 。如果任一对角线上均不存在质数&#xff0c;返回 0 。 注意&#xff1a; 如果某个整数大于…

电梯系统的UML文档02

现在我们来回答用UML 设计电梯系统的实践中遇到的问题&#xff1a;“UML 是一种适合于实时系统的建模语言吗?”我们发现基于上段提到的特征&#xff0c;UML 是适合的但有不足。用UML 设计实时系统有以下问题&#xff1a; •特定硬件及它们特征的定义。 •在对象、任务和硬件层…

mysql set age=‘0‘ 和 set age=0的区别?

select case when(t1.business_transfer‘source’)then 0 else t1.settlement_tyy_cash_amount end as tyy from t_settlement_waybill t1 where waybill_sn in (‘2025010700001’); select case when(t1.business_transfer‘source’)then (t1.settlement_tyy_cash_amount‘…

利用Java爬虫按图搜索1688商品(拍立淘)的实践指南

在当今数字化时代&#xff0c;网购已成为人们生活中不可或缺的一部分。而1688作为国内领先的B2B电商平台&#xff0c;汇聚了海量的商品资源。然而&#xff0c;在面对众多商品时&#xff0c;传统的文字搜索方式有时难以满足我们的需求。比如&#xff0c;当我们看到一件心仪的商品…

达梦8-DMSQL程序设计学习笔记1-DMSQL程序简介

1、DMSQL程序简介 DMSQL程序是达梦数据库对标准SQL语言的扩展&#xff0c;是一种过程化SQL语言。在DMSQL程序中&#xff0c;包括一整套数据类型、条件结构、循环结构和异常处理结构等&#xff0c;DMSQL程序中可以执行SQL语句&#xff0c;SQL语句中也可以使用DMSQL函数。 DMSQ…

使用 WPF 和 C# 将纹理应用于三角形

此示例展示了如何将纹理应用于三角形,以使场景比覆盖纯色的场景更逼真。以下是为三角形添加纹理的基本步骤。 创建一个MeshGeometry3D对象。像往常一样定义三角形的点和法线。通过向网格的TextureCoordinates集合添加值来设置三角形的纹理坐标。创建一个使用想要显示的纹理的 …

Git版本控制 - 创建使用Repository

Git版本控制 – 创建使用Repository Version Control with Git - Create and Use Repository By JacksonML 上文提到&#xff0c;Git是一种分布式版本控制系统。作为全球范围内广泛使用的工具&#xff0c;如何将项目分步骤运用到其中呢&#xff1f; 本文简要介绍如何用Git工…

WINFORM - DevExpress -> devexpress版--报表(report)

devexpress report模板 1.安装devexpress(DevExpress 总结【安装、案例】_caoyanchao1的博客-CSDN博客_devexpress) 2.新建vs项目且添加standarReportDesigner控件 涛神设计器注意 3.运行后步骤 点击New Report DetailReport 涛神设计器checkbox(3.复选框只认boolean类型的 b…

【Redis】初识Redis

目录 Redis简介 Redis在内存中存储数据 Redis数据库中的应用 Redis缓存中的应用 Redis消息中间件 尾言 Redis简介 如下是Redis官网中&#xff0c;对Redis的一段描述 在这段描述中&#xff0c;我们提取如下关键要点&#xff1a; Redis主要用于在内存中存储数据Redis可…

YOLOv9改进,YOLOv9自研检测头融合HAttention用于图像修复的混合注意力检测头

参考文章 完成本篇内容,首先完成这篇文章,并把代码添加到 YOLOv9 中: YOLOv9改进,YOLOv9引入HAttention注意机制用于图像修复的混合注意力转换器,CVPR2023,超分辨率重建 下文都是手把手教程,跟着操作即可添加成功 目录 参考文章🎓一、YOLOv9原始版本代码下载🍀🍀…

[读书日志]8051软核处理器设计实战(基于FPGA)第七篇:8051软核处理器的测试(verilog+C)

6. 8051软核处理器的验证和使用 为了充分测试8051的性能&#xff0c;我们需要测试每一条指令。在HELLO文件夹中存放了整个测试的C语言工程文件。主函数存放在指令被分为五大类&#xff0c;和上面一样。 打开后是这样的文件结构。HELLO.c是主文件&#xff0c;这是里面的代码&am…

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…

python识别图片中指定颜色的图案并保存为图片

示例代码&#xff1a; def chuli(color):import cv2import numpy as np# 定义颜色名称到HSV阈值范围的映射color_thresholds {red: ([0, 100, 100], [10, 255, 255], [160, 100, 100], [180, 255, 255]),yellow: ([20, 100, 100], [30, 255, 255]),blue: ([90, 100, 100], [1…

《利用深度神经网络在广角小口径望远镜中实现天文目标的检测与分类》论文精读

摘要 大口径小口径望远镜被广泛应用于光学瞬态观测&#xff0c;对观测图像中的天文目标进行检测和分类是最重要也是最基础的步骤。本文提出了一种基于深度神经网络的天文目标检测与分类框架。该框架采用了Faster R-CNN的概念&#xff0c;以改进的Resnet-50为主干网络&#xff…

Redis数据结构服务器

Redis数据结构服务器 什么是Redis数据结构服务器 的概念和特点 是一个开源&#xff08;BSD许可&#xff09;&#xff0c;内存中的数据结构存储服务器&#xff0c;可用作数据库、缓存和消息中间件。它支持多种类型的数据结构&#xff0c;如字符串&#xff08;strings&#xff09…

逻辑测试题

https://blog.csdn.net/qq_39081315/article/details/121393597 先生成一个点&#xff0c;每生成一个点判断距离&#xff0c;角度&#xff0c;满足加入存点的容器&#xff0c;直到容器大小为4。 随机生成点&#xff1a; 分区域&#xff1a;最大距离20&#xff0c;以20为正方形…

【UE5 C++课程系列笔记】27——多线程基础——ControlFlow插件的基本使用

目录 步骤 一、搭建基本同步框架 二、添加委托 三、添加蓝图互动框架 四、修改为异步框架 完整代码 通过一个游戏初始化流程的示例来介绍“ControlFlows”的基本使用。 步骤 一、搭建基本同步框架 1. 勾选“ControlFlows”插件 2. 新建一个空白C类&#xff0c;这里…

前端性能优化方面

页面加载过程 网页资源的加载通常需要以下基本步骤&#xff1a; 地址栏输入网页服务器地址 浏览器获取网页html文件 解析html文件中存在的js、css、图片等资源&#xff0c;通过网络线程加载 在特定时机执行js代码&#xff0c;可以在js中动态加载需要的静态资源 执行js里存在的f…