【基于容器的部署、扩展和管理】 3.2 基于容器的应用程序部署和升级
往期回顾:
第一章:【云原生概念和技术】
第二章:【容器化应用程序设计和开发】
第三章:【3.1 容器编排系统和Kubernetes集群的构建】
3.2 基于容器的应用程序部署和升级
- 3.2 基于容器的应用程序部署和升级
3.2 基于容器的应用程序部署和升级
基于容器的应用程序部署和升级通常涉及以下步骤:
- 创建一个容器镜像:首先,需要创建一个容器镜像,该镜像将包含应用程序的所有依赖项和配置。这可以通过 Dockerfile或其他镜像构建工具来实现。
- 部署应用程序:在容器镜像中部署应用程序。这可以通过 Docker Compose 文件或 Docker Swarm mode 来实现。
- 配置容器:为应用程序配置容器,通常需要将应用程序的一些参数设置为默认值或环境变量。
- 启动应用程序:启动应用程序并在容器中运行。
- 监控应用程序:监控应用程序在容器中的运行状况,例如容器的健康状况、资源使用情况、应用程序的性能等。
以下是一个简单的基于容器的应用程序部署和升级的 Java 代码示例,假设我们有一个名为 “myapp” 的 Java 应用程序,它使用 Spring Boot 框架构建,并打包成一个 Docker 镜像:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;@SpringBootApplication
@RestController
public class MyApplication {public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); }@GetMapping("/hello") public String hello(@PathVariable("name") String name) { return "Hello, " + name + "!"; }
}
在上面的代码中,我们定义了一个名为 “MyApplication” 的 Spring Boot 应用程序,它使用@RestController 注解来处理 HTTP 请求,并使用@SpringBootApplication 注解来启用 Spring Boot 的自动配置。
现在我们想要将这个应用程序部署到一个 Kubernetes 集群中。我们可以使用 Docker Compose 文件来定义应用程序的部署方式,如下所示:
version: '3'
services:
#定义一个名为 "myapp" 的服务myapp: # 版本image: myapp:latest container_name: myapp environment: JAVA_OPTS: -Dspring.profiles.active=prod ports: - "8080:8080" volumes: - ./src/main/docker/myapp/data:/data networks: - myappnet myapp-web: image: myapp-web:latest container_name: myapp-web environment: JAVA_OPTS: -Dspring.profiles.active=web ports: - "8080:8080" volumes: - ./src/main/docker/myapp/data:/data networks: - myappnet myapp-db: image: myapp-db:latest container_name: myapp-db environment: JAVA_OPTS: -Dspring.profiles.active=db ports: - "3306:3306" volumes: - ./src/main/docker/myapp/data:/data networks: - myappnet
myappnet: name: myappnet priority: highest driver: bridge links: - myapp:myapp - myapp-web:myapp-web - myapp-db:myapp-db
在上面的 yml 文件中,我们定义了一个名为 “myapp” 的服务,它使用 latest 版本的容器镜像,并使用端口 8080 来暴露应用程序的 HTTP 服务。
我们还定义了一个名为 “myapp-web” 的服务,它使用 latest 版本的容器镜像,并使用端口 8080 来暴露 Web 应用程序的 HTTP 服务。我们还定义了一个名为 “myapp-db” 的服务,它使用 latest 版本的容器镜像,并使用端口 3306 来暴露数据库服务。
现在,我们可以使用 Docker Compose 文件来启动应用程序,如下所示:
docker-compose up -d
这个命令将启动所有定义的服务,并将它们部署到 Kubernetes 集群中。我们可以使用 kubectl 命令来查看应用程序的健康状况,如下所示:
kubectl get services
这个命令将列出所有定义的服务,我们可以使用 kubectl 命令来监控应用程序的性能,如下所示:
kubectl get svc -o wide
这个命令将列出所有定义的服务,并显示它们的性能指标。
最后,我们可以使用 Java 代码来实现的话,如下所示:
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.Map;public class DockerDeployment {public static void main(String[] args) throws IOException, URISyntaxException { // 创建应用程序的 Dockerfile Dockerfile dockerfile = new Dockerfile(); dockerfile.add("FROM", "openjdk:8-jdk-alpine"); dockerfile.add("COPY", "app.jar", "/app.jar"); dockerfile.add("ENTRYPOINT", "java -jar /app.jar"); dockerfile.add("CMD", "/bin/bash"); dockerfile.build();// 创建应用程序的容器镜像 Map<String, String> args = new HashMap<>(); args.put("APP_JAR", "/app.jar"); args.put("APP_NAME", "my-app"); args.put("JAVA_OPTS", "-Dapp.name=my-app -Dapp.version=1.0"); DockerImage dockerImage = new DockerImage(URI.create("dockerhub://my-app/my-app:latest"), args);// 部署应用程序到容器 InputStream inputStream = DockerDeployment.class.getResourceAsStream("docker-image.yml"); Map<String, Object> environment = new HashMap<>(); environment.put("APP_JAR", "/app.jar"); environment.put("APP_NAME", "my-app"); environment.put("APP_VERSION", "1.0"); Map<String, Object> argsEnvironment = new HashMap<>(); argsEnvironment.put("JAVA_OPTS", "-Dapp.name=my-app -Dapp.version=1.0"); DockerDeployment deployment = new DockerDeployment(dockerImage, environment, argsEnvironment); deployment.start();// 升级应用程序 String newVersion = "1.1"; InputStream inputStream2 = DockerDeployment.class.getResourceAsStream("docker-image.yml"); Map<String, Object> environment2 = new HashMap<>(); environment2.put("APP_JAR", "/app.jar"); environment2.put("APP_NAME", "my-app"); environment2.put("APP_VERSION", newVersion); Map<String, Object> argsEnvironment2 = new HashMap<>(); argsEnvironment2.put("JAVA_OPTS", "-Dapp.name=my-app -Dapp.version=" + newVersion); DockerDeployment deployment2 = new DockerDeployment(dockerImage, environment2, argsEnvironment2); deployment2.start(); }
}
相关文章:
【基于容器的部署、扩展和管理】 3.2 基于容器的应用程序部署和升级
往期回顾: 第一章:【云原生概念和技术】 第二章:【容器化应用程序设计和开发】 第三章:【3.1 容器编排系统和Kubernetes集群的构建】 3.2 基于容器的应用程序部署和升级 3.2 基于容器的应用程序部署和升级 3.2 基于容器的应用程…...
Jmeter 实现 grpc服务 压测
一、Jmeter安装与配置 网上有很多安装与配置文章,在此不做赘述 二、Jmeter gRPC Request 插件安装 插件下载地址:JMeter Plugins :: JMeter-Plugins.org 将下载文件解压后放到Jmeter安装目录下 /lib/ext 然后在终端输入Jmeter即可打开 Jmeter GUI界面…...
深入源码分析RecyclerView缓存复用原理
文章目录 前言四级缓存 源码分析缓存一级缓存(mChangedScrap和mChangedScrap)二级缓存(mCachedViews)三级缓存(ViewCacheExtension)四级缓存(mRecyclerPool)缓存池mRecyclerPool结构…...
内网隧道代理技术(一)之内网隧道代理概述
内网隧道代理技术 内网转发 在渗透测试中,当我们获得了外网服务器(如web服务器,ftp服务器,mali服务器等等)的一定权限后发现这台服务器可以直接或者间接的访问内网。此时渗透测试进入后渗透阶段,一般情况…...
设计图形用户界面的原则
1) 一般性原则:界面要具有一致性、常用操作要有快捷方式、 提供简单的错误处理、对操作人员的重要操作要有信息反馈、操作可 逆、设计良好的联机帮助、合理划分并高效地使用显示屏、保证信息 显示方式与数据输入方式的协调一致 2) 颜色的使用:颜色…...
1:操作系统导论
1.1操作系统的定义 •Anoperatingsystemactsanintermediarybetweenuserofacomputerandthecomputer hardware. ◦ 操作系统充当计算机⽤⼾和计算机硬件之间的中介 •Thepurposeofanoperatingsystemistoprovideanenvironmentinwhichausercanexecute programsinaconvenientandeff…...
什么是微软的 Application Framework?
我是荔园微风,作为一名在IT界整整25年的老兵,今天来看一下什么是微软的 Application Framework? 到底什么是 Application Framework? 还没有真正掌握任何一套Application Framework的使用之前,就来研究这个真的不是很…...
一个关于宏定义的问题,我和ChatGPT、NewBing、Google Bard、文心一言 居然全军覆没?
文章目录 一、问题重述二、AI 解题2.1 ChatGPT2.2 NewBing2.3 Google Bard2.4 文心一言2.5 小结 一、问题重述 今天在问答模块回答了一道问题,要睡觉的时候,又去看了一眼,发现回答错了。 问题描述:下面的z的值是多少。 #define…...
【服务器数据恢复】断电导致RAID无法找到存储设备的数据恢复案例
服务器数据恢复环境: HP EVA存储,6块SAS硬盘组建的raid5磁盘阵列。上层操作系统是WINDOWS SERVER。该存储为公司内部文件服务器使用。 服务器故障&分析: 在遭遇两次意外断电后,设备重启时raid提示“无法找到存储设备”。管理员…...
Windows上不可或缺的5款宝藏软件,工作效率拉满!
职场小白与大牛的区别:小白需要耗费大半天琢磨的事情,而大牛可以只花5分钟就能处理。 “牛人”,即拥有过人之处,专业、经验、技术等等,学会灵活运用高效率的工具也是关键的一点。工具找得好,运用得快&#…...
链表内指定区间反转
题目: 将一个节点数为 size 链表 m 位置到 n 位置之间的区间反转,要求时间复杂度 O(n),空间复杂度 O(1)。 例如: 给出的链表为 1→2→3→4→5→NULL,m2,n4 返回 1→4→3→2→5→NULL 数据范围ÿ…...
Vue中如何进行地图展示与交互(如百度地图、高德地图)?
Vue中如何进行地图展示与交互 随着移动互联网的普及,地图应用已经成为人们生活中不可或缺的一部分。在Vue.js中,我们可以使用第三方地图库(如百度地图、高德地图)来实现地图的展示和交互。本文将介绍如何在Vue.js中使用百度地图和…...
uni-app组件概述
1、组件 1.1、组件的含义 组件是视图层的基本组成单元。 组件是一个单独且可复用的功能模块的封装。 组件,包括:以组件名称为标记的开始标签和结束标签、组件内容、组件属性、组件属性值。 <component-name>是开始标签,</compon…...
什么是防火墙?它有什么作用?
作者:Insist-- 个人主页:insist--个人主页 作者会持续更新网络知识和python基础知识,期待你的关注 目录 一、什么是防火墙 二、防火墙的分类 1、软件防火墙 2、硬件防火墙 三、防火墙的作用 1、防止病毒 2、防止访问不安全内容 3、阻…...
基础工程(cubeide串口调试,printf实现,延时函数)
0.基础工程(cubeide串口调试,printf实现,延时函数) 文章目录 0.基础工程(cubeide串口调试,printf实现,延时函数)外部时钟源CLOCK(RCC)系统时钟SYS与DEBUG设置UART串口设置cubeide设置…...
大厂设计师都在用的9个灵感工具
每一件伟大的设计作品都离不开设计师灵感的爆发。设计师有很多灵感来源,比如精美的摄影图片、酷炫的网站设计、APP的特色功能、友好的用户体验动画,或者一篇文章。 设计师每天都需要收集灵感,把灵感收集当成日常生活。在这篇文章中ÿ…...
安全实现SpringBoot配置文件自动加解密
需求背景 应用程序开发的时候,往往会存在一些敏感的配置属性 数据库账号、密码第三方服务账号密码内置加密密码其他的敏感配置 对于安全性要求比较高的公司,往往不允许敏感配置以明文的方式出现。 通常做法是对这些敏感配置进行加密,然后在…...
数据结构--队列2--双端队列--java双端队列
介绍 双端队列,和前面学的队列和栈的区别在于双端队列2端都可以进行增删,其他2个都是只能一端可以增/删。 实现 链表 因为2端都需要可以操作所以我们使用双向链表 我们也需要一共头节点 所以节点设置 static class Node<E>{E value;Node<E…...
网络安全:信息收集专总结【社会工程学】
前言 俗话说“渗透的本质也就是信息收集”,信息收集的深度,直接关系到渗透测试的成败,打好信息收集这一基础可以让测试者选择合适和准确的渗透测试攻击方式,缩短渗透测试的时间。 一、思维导图 二、GoogleHacking 1、介绍 利用…...
Linux 命令总结
基本操作 Linux关机,重启 # 关机 shutdown -h now# 重启 shutdown -r now 查看系统,CPU信息 # 查看系统内核信息 uname -a# 查看系统内核版本 cat /proc/version# 查看当前用户环境变量 envcat /proc/cpuinfo# 查看有几个逻辑cpu, 包括cpu型号 cat /proc/cpuinfo | grep na…...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
