Linux——K8S平台的权限规划

  1. Based ON ROLE Access Control  (BRAC)
    1. ROLE 角色 :对于平台中需要被访问的资源的权限集合
      • 管理员:对于平台具备完整的控制权限(admin)
      • 审计员: 可以查看平台运行的完整日志 操作记录等内容
      • 指定名称空间的管理员:
    2. 额外安装的自定义插件,可以使用自定义的角色进行管理

K8s: POD的调度

  1. 控制器
  2. Pod的弹性调度(HBA)
  3. Pod 使用资源的限制
  4. Pod的状态检查
  5. Pod的自动更新

K8S:网络管理

  1. 节点的地址 // 物理网卡物理网络设备的地址
  2. Pod的地址 // pod分配到的地址,逻辑地址
  3. 集群地址 // 逻辑地址,这个逻辑地址用来解决对于不同控制器或者不同名称空间下pod的通信

资源:

  1. 网络插件 (CNI)  // 主要负责pod网络的维护
  2. Coredns // K8S 平台的名称解析服务,为平台内所有的名称提供解析
  3. Service // 客户端对于pod内应用的访问入口
  4. Ingress
  5. 应用网关

K8S pod应用数据存储:

  1. 临时卷
  2. 持久卷
  3. 存储类== 不同的存储引擎  数据到底保存在哪里?

K8S:

  1. 云原生基础设施支持
    1. 云原生概念之下,除了传统的web应用
      • Springboot的延申架构 springcloud
      • AI
      • 大数据平台
  2. 基础设施级别的云平台(IaaS)
  3. 容器的调度平台

K8S 是一个用来进行应用部署的平台,基于以下特性支持:

  1. 弹性调度 (所有云基础设施的基本要求)
    1. 按照实际的需求进行应用架构的调整
  2. 随时随地的网络访问
    1. K8S 中使用的一些诸如:service 、ingress 、应用网关等资源,确保客户端对于应用的访问
    2. 以上的资源都可以设置为负载均衡,缓解访问压力
  3. 自愈
    1. K8S平台会尽可能保证应用的可用性,通过诸如重启容器、移除故障pod重新调度等方式
    2. 包括工作节点故障,K8S将故障节点中所有的pod调度到其他正常的工作节点上。
  4. 架构调整方便
    1. K8s平台扩展起来较为简单
    2. K8S 所有的基础组件都是通过容器运行,所以K8S 基础平台扩容就非常简单:
      • 增加新的工作节点
        1. Kubeadm join 的命令
      • 增加控制节点,主要目的是为提供控制节点冗余,避免控制节点的单节点故障
        1. K8S的基础功能组件基本都运行在控制节点之上,一旦控制节点出现问题,所有的核心组件都有可能停止,且无法恢复
        2. 按照部署K8S控制节点的方式,安装所有的软件
        3. 运行kubeadm join    同时指定节点角色为控制节点,
        4. 基于主从选举算法,决定主节点的IP
        5. 可以将保存K8S集群数据的数据库-edtd 组件新的集群
  5. 支持丰富的插件
    1. K8S的开发整体使用REST API 标准化接口,使K8S引入新的功能支持,就好像管道对接一样简单
  6. 对于应用实例的部署成熟且快速
    1. K8S 所有部署的应用都是的容器化方式运行,因此只需要在对应的工作节点上拉取镜像、启动容器即可。
    2. 基于容器化方式运行,将应用部署交付的最后一步集中在容器镜像的打包。

web应用部署:

  1. 以一个系统服务的方式实现部署    
    1. 基于操作系统上的支持服务完成部署
      • Lamp/lnmp    运行phpweb 服务
      • Tomcat 专门用于基于java程序编写的serverlet应用调试和部署的服务软件
      • Python web应用 使用对应的web服务软件,来调用python 解释器,解析web应用程序
    2. 应用部署的步骤:大前提是 相关的软件服务已经部署调试完毕
      • 获取应用程序包(一般由开发人员打包完毕)
      • 解压文件包
      • 将文件包中的内容按照web程序规定的目录进行部署(即将文件放入指定目录)
      • 重启相关服务 (可以跳过)
    3. 适合的部署环境:
      • 直接部署到物理服务器(云计算时代基本已经淘汰)
      • 直接部署到仅安装操作系统的虚拟机实例,这个虚拟机实例可以运行在公司自建虚拟化平台,或者作为公有云的一个虚拟化实例
  2. 以容器化方式运行应用
    1. 基于不同的容器调度平台即可
      • docker
      • Kubectl run
      • podman
      • Isula
      • crictl
    2. 部署步骤:
      • 使用程序代码以及一些静态资源文件,制作容器镜像
        1. 主要是程序代码,静态资源文件可以使用存储卷提供容器
      • 使用制作的容器镜像,启动容器即可
    3. 适合的部署环境
      • 只要安装了任意的容器控制程序

应用的生命周期:

  1. 开发
  2. 测试
  3. 发布(应用的打包)    // 23 合并之后 可以称为应用的集成
  4. 部署

Python web项目发布和部署过程:

  1. 开发环境下,固定python 解释器运行环境: freeze
    1. Python 解释器的版本、硬件架构
    2. 项目所使用到的所有的模块
      • 模块的名称和版本 ( 公共仓库)
      • 指定自行开发的python 模块的仓库地址和版本信息
  2. 收集静态资源      collectstatics
    1. Web界面样式设置
    2. 图片文件
  3. 关闭开发环境下设置的应用调试等功能  修改settings文件
  4. 打包程序文件,以及静态资源文件包 和 运行环境说明文件 ,下一步开始部署

基于系统服务部署:

  1. 按照运行环境说明文件,安装对应的依赖关系
  2. 部署静态资源和程序文件到web程序目录下
  3. 基于python 解释器和web程序之间的调用网关(CGI),启动对应cgi协议服务

基于容器部署:

  1. 安装打包的程序文件包和环境说明文件,调整镜像的运行环境即可
  2. 使用调整后的镜像启动容器

Java web程序如何部署:

[student@harbor practice]$ ll demo.zip

-rw-r--r--. 1 student student 14092 Oct 12 17:08 demo.zip

// springboot的web项目初始化目录,web应用开发可以直接使用压缩包提供的项目目录结构进行开发。

实例项目包环境需求如下:

  1. Springboot: 3.3.
  2. Java:jdk17
  3. Maven: 3.6以上

Springboot: 一个类似python中的django、flask等的web开发框架,springboot 是一个java的web开发框架,阿里基于springboot设计了springcloud框架看,改良后的框架更加符合微服务的开发理念。

Springboot指定了项目开发的标准目录结构,在进行项目发布时,需要同时打包springboot的应用程序,程序即可基于springboot完成部署启动。

Maven: maven是一个java项目的依赖关系管理器。Maven的核心命令包括程序编译、测试、打包等。同时基于项目中定义的依赖关系,还提供不同依赖关系的控制指令。基于项目指定的pom.xml文件中规定的程序依赖包,将程序源码目录以及指定的依赖关系进行程序打包发布的工具。在进行打包之前,通常需要对程序进行测试、启动测试服务器等,maven也提供相关的功能。

[student@harbor practice]$ ll ~/jdk-17_linux-x64_bin.tar.gz

-rw-r--r--. 1 student student 182799609 Oct 15 17:23 /home/student/jdk-17_linux-x64_bin.tar.gz

// jdk的安装包

[student@harbor practice]$ ll ~/apache-maven-3.9.9-bin.tar.gz

-rw-r--r--. 1 student student 9102945 Oct 14 17:21 /home/student/apache-maven-3.9.9-bin.tar.gz

// maven工具安装包

在生产环境下,尽可能避免使用系统自带的安装包,一般存在环境变量未设置等bug,可能导致程序编译错误。

1、设置java环境

[student@harbor ~]$ su root
Password:
[root@harbor student]# ll jdk-17_linux-x64_bin.tar.gz
-rw-r--r--. 1 student student 182799609 Oct 15 17:23 jdk-17_linux-x64_bin.tar.gz
[root@harbor student]# tar -xzf jdk-17_linux-x64_bin.tar.gz -C /usr/local/
[root@harbor student]# ll /usr/local/jdk-17.0.12/
total 24
drwxr-xr-x.  2 root  root  4096 Oct 17 11:09 bin
drwxr-xr-x.  5 root  root   123 Oct 17 11:09 conf
drwxr-xr-x.  3 root  root   132 Oct 17 11:09 include
drwxr-xr-x.  2 root  root  4096 Oct 17 11:09 jmods
drwxr-xr-x. 72 root  root  4096 Oct 17 11:09 legal
drwxr-xr-x.  5 root  root  4096 Oct 17 11:09 lib
lrwxrwxrwx.  1 10668 10668   23 Jun  5 13:45 LICENSE -> legal/java.base/LICENSE
drwxr-xr-x.  3 root  root    18 Oct 17 11:09 man
-rw-r--r--.  1 10668 10668  290 Jun  5 13:45 README
-rw-r--r--.  1 10668 10668 1273 Jun  5 13:45 release
[root@harbor student]# ll /usr/local/jdk-17.0.12/bin/
total 448
-rwxr-xr-x. 1 10668 10668 12384 Jun  5 13:45 jar
-rwxr-xr-x. 1 10668 10668 12392 Jun  5 13:45 jarsigner
-rwxr-xr-x. 1 10668 10668 12368 Jun  5 13:45 java
-rwxr-xr-x. 1 10668 10668 12416 Jun  5 13:45 javac
-rwxr-xr-x. 1 10668 10668 12424 Jun  5 13:45 javadoc
-rwxr-xr-x. 1 10668 10668 12384 Jun  5 13:45 javap
-rwxr-xr-x. 1 10668 10668 12384 Jun  5 13:45 jcmd
-rwxr-xr-x. 1 10668 10668 12456 Jun  5 13:45 jconsole
-rwxr-xr-x. 1 10668 10668 12384 Jun  5 13:45 jdb
-rwxr-xr-x. 1 10668 10668 12392 Jun  5 13:45 jdeprscan
-rwxr-xr-x. 1 10668 10668 12384 Jun  5 13:45 jdeps
-rwxr-xr-x. 1 10668 10668 12384 Jun  5 13:45 jfr
-rwxr-xr-x. 1 10668 10668 12384 Jun  5 13:45 jhsdb
-rwxr-xr-x. 1 10668 10668 12392 Jun  5 13:45 jimage
-rwxr-xr-x. 1 10668 10668 12416 Jun  5 13:45 jinfo
-rwxr-xr-x. 1 10668 10668 12416 Jun  5 13:45 jlink
-rwxr-xr-x. 1 10668 10668 12416 Jun  5 13:45 jmap
-rwxr-xr-x. 1 10668 10668 12384 Jun  5 13:45 jmod
-rwxr-xr-x. 1 10668 10668 12392 Jun  5 13:45 jpackage
-rwxr-xr-x. 1 10668 10668 12384 Jun  5 13:45 jps
-rwxr-xr-x. 1 10668 10668 12424 Jun  5 13:45 jrunscript
-rwxr-xr-x. 1 10668 10668 12392 Jun  5 13:45 jshell
-rwxr-xr-x. 1 10668 10668 12424 Jun  5 13:45 jstack
-rwxr-xr-x. 1 10668 10668 12384 Jun  5 13:45 jstat
-rwxr-xr-x. 1 10668 10668 12392 Jun  5 13:45 jstatd
-rwxr-xr-x. 1 10668 10668 12392 Jun  5 13:45 keytool
-rwxr-xr-x. 1 10668 10668 12392 Jun  5 13:45 rmiregistry
-rwxr-xr-x. 1 10668 10668 12392 Jun  5 13:45 serialver
[root@harbor student]# mv /usr/local/jdk-17.0.12/ /usr/local/java
[root@harbor student]# vim /etc/bashrc
[root@harbor student]# vim +90 /etc/bashrc
##文件末尾新增下面两行即可
export JAVA_HOME=/usr/local/java
export PATH=$PATH:$JAVA_HOME/bin[root@harbor student]# source  /etc/bashrc  // 刷新环境变量
[root@harbor student]# java -version
java version "17.0.12" 2024-07-16 LTS
Java(TM) SE Runtime Environment (build 17.0.12+8-LTS-286)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.12+8-LTS-286, mixed mode, sharing)

2、设置maven工具包    // maven 基于java语言编写,所以先配java 再配maven

[student@harbor ~]$ java -version
java version "17.0.12" 2024-07-16 LTS
Java(TM) SE Runtime Environment (build 17.0.12+8-LTS-286)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.12+8-LTS-286, mixed mode, sharing)
[student@harbor ~]$ tail -2 /etc/bashrc
export JAVA_HOME=/usr/local/java
export PATH=$PATH:$JAVA_HOME/bin
[student@harbor ~]$ pwd
/home/student
[student@harbor ~]$ ll apache-maven-3.9.9-bin.tar.gz
-rw-r--r--. 1 student student 9102945 Oct 14 17:21 apache-maven-3.9.9-bin.tar.gz
[student@harbor ~]$ su root
Password:
[root@harbor student]# pwd
/home/student
[root@harbor student]# ll apache-maven-3.9.9-bin.tar.gz
-rw-r--r--. 1 student student 9102945 Oct 14 17:21 apache-maven-3.9.9-bin.tar.gz
[root@harbor student]# tar -xzf apache-maven-3.9.9-bin.tar.gz  -C /usr/local/
[root@harbor student]# ls /usr/local/apache-maven-3.9.9/
bin  boot  conf  lib  LICENSE  NOTICE  README.txt
[root@harbor student]# ls /usr/local/apache-maven-3.9.9/bin/
m2.conf  mvn  mvn.cmd  mvnDebug  mvnDebug.cmd  mvnyjp
[root@harbor student]# vim +93 /etc/bashrc
[student@harbor ~]$ tail -4 /etc/bashrc
# vim:ts=4:sw=4
export JAVA_HOME=/usr/local/java
export MAVEN_HOME=/usr/local/maven		# 新增
export PATH=$PATH:$MAVEN_HOME/bin:$JAVA_HOME/bin # 修改[root@harbor student]# mv /usr/local/apache-maven-3.9.9/ /usr/local/maven
[root@harbor student]# source /etc/bashrc
[root@harbor student]# mvn --version
Apache Maven 3.9.9 (8e8579a9e76f7d015ee5ec7bfcdc97d260186937)
Maven home: /usr/local/maven
Java version: 17.0.12, vendor: Oracle Corporation, runtime: /usr/local/java
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "5.14.0-474.el9.x86_64", arch: "amd64", family: "unix"
[root@harbor student]# java -version
java version "17.0.12" 2024-07-16 LTS
Java(TM) SE Runtime Environment (build 17.0.12+8-LTS-286)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.12+8-LTS-286, mixed mode, sharing)
[root@harbor student]# exit
exit
[student@harbor ~]$ exit	// 推出当前终端,重新登录系统,测试变更的环境变量是否再重新登录后,依然有效。
logout

3、开始应用打包

[student@harbor ~]$ cd practice/
[student@harbor practice]$ pwd
/home/student/practice
[student@harbor practice]$ ls
demo.zip  pom.xml
[student@harbor practice]$ unzip demo.zip
Archive:  demo.zipcreating: demo/inflating: demo/pom.xmlinflating: demo/mvnw.cmdcreating: demo/.mvn/creating: demo/.mvn/wrapper/inflating: demo/.mvn/wrapper/maven-wrapper.propertiesinflating: demo/.gitignoreinflating: demo/HELP.mdcreating: demo/src/creating: demo/src/test/creating: demo/src/test/java/creating: demo/src/test/java/com/creating: demo/src/test/java/com/example/creating: demo/src/test/java/com/example/demo/inflating: demo/src/test/java/com/example/demo/DemoApplicationTests.javacreating: demo/src/main/creating: demo/src/main/java/creating: demo/src/main/java/com/creating: demo/src/main/java/com/example/creating: demo/src/main/java/com/example/demo/inflating: demo/src/main/java/com/example/demo/DemoApplication.javacreating: demo/src/main/resources/inflating: demo/src/main/resources/application.propertiesinflating: demo/mvnw
[student@harbor practice]$ ls
demo  demo.zip  pom.xml
[student@harbor practice]$ cd demo/
[student@harbor demo]$ ls
HELP.md  mvnw  mvnw.cmd  pom.xml  src
[student@harbor demo]$ pwd
/home/student/practice/demo
[student@harbor demo]$ which tree
/usr/bin/tree
[student@harbor demo]$ tree .
.
├── HELP.md
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src├── main│   ├── java│   │   └── com│   │       └── example│   │           └── demo│   │               └── DemoApplication.java│   └── resources│       └── application.properties└── test└── java└── com└── example└── demo└── DemoApplicationTests.java12 directories, 7 files
[student@harbor demo]$ pwd
/home/student/practice/demo
[student@harbor demo]$ rm -f src/main/
java/      resources/
[student@harbor demo]$ rm -f src/main/java/com/example/demo/DemoApplication.java
[student@harbor demo]$ rm -f src/test/java/com/example/demo/DemoApplicationTests.java
[student@harbor demo]$ vim src/main/java/com/example/demo/HelloController.java
[student@harbor demo]$ vim src/main/java/com/example/demo/Application.java
[student@harbor demo]$ cat src/main/java/com/example/demo/HelloController.java
package com.example.springboot;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class HelloController {@GetMapping("/")public String index() {return "Greetings from Spring Boot!";}}
[student@harbor demo]$ cat src/main/java/com/example/demo/Application.java
package com.example.springboot;import java.util.Arrays;import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}@Beanpublic CommandLineRunner commandLineRunner(ApplicationContext ctx) {return args -> {System.out.println("Let's inspect the beans provided by Spring Boot:");String[] beanNames = ctx.getBeanDefinitionNames();Arrays.sort(beanNames);for (String beanName : beanNames) {System.out.println(beanName);}};}}
[student@harbor demo]$ vim src/test/java/com/example/demo/HelloControllerTest.jav
[student@harbor demo]$ mv src/test/java/com/example/demo/HelloControllerTest.jav src/test/java/com/example/demo/HelloControllerTest.java
[student@harbor demo]$ vim src/test/java/com/example/demo/HelloControllerITest.java
[student@harbor demo]$ cat src/test/java/com/example/demo/HelloControllerTest.java
package com.example.springboot;import static org.hamcrest.Matchers.equalTo;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;@SpringBootTest
@AutoConfigureMockMvc
public class HelloControllerTest {@Autowiredprivate MockMvc mvc;@Testpublic void getHello() throws Exception {mvc.perform(MockMvcRequestBuilders.get("/").accept(MediaType.APPLICATION_JSON)).andExpect(status().isOk()).andExpect(content().string(equalTo("Greetings from Spring Boot!")));}
}
[student@harbor demo]$ cat src/test/java/com/example/demo/HelloControllerITest.java
package com.example.springboot;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.http.ResponseEntity;import static org.assertj.core.api.Assertions.assertThat;@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class HelloControllerITest {@Autowiredprivate TestRestTemplate template;@Testpublic void getHello() throws Exception {ResponseEntity<String> response = template.getForEntity("/", String.class);assertThat(response.getBody()).isEqualTo("Greetings from Spring Boot!");}
}
[student@harbor demo]$ cp ../pom.xml ./
[student@harbor demo]$ cat pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.10</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>demo</artifactId>					// 打包的文件名<version>0.0.1-SNAPSHOT</version>				// 包版本<name>demo</name>					//项目名称<description>Demo project for Spring Boot</description>	// 描述<url/><licenses><license/></licenses><developers><developer/></developers><scm><connection/><developerConnection/><tag/><url/></scm><properties><java.version>17</java.version>		// 项目的java版本</properties><dependencies>		// 项目的依赖关系<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId>  // springboot 初始化插件</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>	// web初始化插件</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId>  // 测试插件<scope>test</scope></dependency></dependencies><build>				// 构建包的环境<plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.13.0</version> <!-- 请确保版本支持 Java 17 --><configuration><source>17</source><target>17</target></configuration></plugin></plugins></build></project># 测试项目是否可以运行
[student@harbor demo]$ pwd
/home/student/practice/demo
[student@harbor demo]$ mvn spring-boot:run在另一个终端测试当前启动的程序
[student@harbor ~]$ curl 127.0.0.1:8080
Greetings from Spring Boot![student@harbor ~]$
[student@harbor ~]$ curl 127.0.0.1:8080
Greetings from Spring Boot![student@harbor ~]$打包应用
[student@harbor demo]$ mvn clean package
[student@harbor demo]$ ls target/demo-0.0.1-SNAPSHOT.jar
target/demo-0.0.1-SNAPSHOT.jar

4.部署应用

(1)直接运行jar包
[student@harbor demo]$ ls target/demo-0.0.1-SNAPSHOT.jar
target/demo-0.0.1-SNAPSHOT.jar
[student@harbor demo]$ java -jar target/demo-0.0.1-SNAPSHOT.jar在另一个终端访问验证
[student@harbor ~]$ ss -anput | grep 8080
tcp   LISTEN 0      100                           *:8080                       *:*     users:(("java",pid=99401,fd=9))
[student@harbor ~]$ curl 127.0.0.1:8080
Greetings from Spring Boot![student@harbor ~]$
[student@harbor ~]$ curl 127.0.0.1:8080
Greetings from Spring Boot![student@harbor ~]$(2)容器运行
[student@harbor demo]$ vim Dockerfile
FROM openjdk:17-jdk-slimADD target/demo-0.0.1-SNAPSHOT.jar   /app/demo.jarENTRYPOINT ["java", "-jar", "/app/demo.jar" ][student@harbor demo]$ docker build -t demo-app:latest .
[+] Building 0.4s (7/7) FINISHED                                                                                                                       docker:default=> [internal] load build definition from Dockerfile                                                                                                             0.0s=> => transferring dockerfile: 220B                                                                                                                             0.0s=> [internal] load metadata for docker.io/library/openjdk:17-jdk-slim                                                                                           0.0s=> [internal] load .dockerignore                                                                                                                                0.0s=> => transferring context: 2B                                                                                                                                  0.0s=> [internal] load build context                                                                                                                                0.2s=> => transferring context: 19.84MB                                                                                                                             0.2s=> CACHED [1/2] FROM docker.io/library/openjdk:17-jdk-slim                                                                                                      0.0s=> [2/2] ADD target/demo-0.0.1-SNAPSHOT.jar   /app/demo.jar                                                                                                     0.1s=> exporting to image                                                                                                                                           0.1s=> => exporting layers                                                                                                                                          0.1s=> => writing image sha256:7d8cf98bd1de3fcccccd1d750560f180cca60e2229373013f3e5d2ba04d6c651                                                                     0.0s=> => naming to docker.io/library/demo-app:latest                                                                                                               0.0s
[student@harbor demo]$ docker images
REPOSITORY                                           TAG           IMAGE ID       CREATED         SIZE
demo-app                                             latest        7d8cf98bd1de   6 seconds ago   428MB
[student@harbor demo]$ su - root
Password:
[root@harbor ~]# docker run --name java-app -p 8080:8080 -d demo-app:latest
fa6da8bc366915b8bf118af0b93afe4305eee98125b4d3db4ec5efe784dbf144
[root@harbor ~]# ss -anput | grep 8080
tcp   LISTEN 0      4096                    0.0.0.0:8080                 0.0.0.0:*     users:(("docker-proxy",pid=102919,fd=4))
tcp   LISTEN 0      4096                       [::]:8080                    [::]:*     users:(("docker-proxy",pid=102924,fd=4))
[root@harbor ~]# curl 127.0.0.1:808
curl: (7) Failed to connect to 127.0.0.1 port 808: Connection refused
[root@harbor ~]# curl 127.0.0.1:8080
Greetings from Spring Boot![root@harbor ~]# curl 127.0.0.1:8080
Greetings from Spring Boot![root@harbor ~]# curl 127.0.0.1:8080
Greetings from Spring Boot!

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

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

相关文章

Go语言基础学习(Go安装配置、基础语法)·

一、简介及安装教程 1、为什么学习Go&#xff1f; 简单好记的关键词和语法&#xff1b;更高的效率&#xff1b;生态强大&#xff1b;语法检查严格&#xff0c;安全性高&#xff1b;严格的依赖管理&#xff0c; go mod 命令&#xff1b;强大的编译检查、严格的编码规范和完整的…

Flink 06 聚合操作入门学习,真不难

抛砖引玉 让你统计1小时内每种商品的销售额&#xff0c;用Flink 该怎么实现。 还是让你统计1小时内每种商品的销售额&#xff0c;但是要过滤掉退款的订单&#xff0c;用Flink 该怎么实现。 学了本文两个操作&#xff0c;不信你还不会。 AggregateFunction ❝ 通常用于对数据…

Android从上帝视角来看PackageManagerService

戳蓝字“牛晓伟”关注我哦&#xff01; 用心坚持输出易读、有趣、有深度、高质量、体系化的技术文章&#xff0c;技术文章也可以有温度。 前言 阅读该篇之前&#xff0c;建议先阅读下面的系列文章&#xff1a; Android深入理解包管理–PackageManagerService和它的“小伙伴…

HTB:Bashed[WriteUP]

目录 连接至HTB服务器并启动靶机 1.How many open TCP ports are listening on Bashed? 2.What is the relative path on the webserver to a folder that contains phpbash.php? 3.What user is the webserver running as on Bashed? 执行命令&#xff1a;whoami 4.S…

GraphRAG 与 RAG 的比较分析,收藏这一篇就够了!!!

检索增强生成&#xff08;RAG&#xff09;技术概述 检索增强生成&#xff08;Retrieval-Augmented Generation&#xff0c;简称 RAG&#xff09;是一种旨在提升大型语言模型&#xff08;Large Language Models&#xff0c;LLMs&#xff09;性能的技术方法。其核心思想是通过整…

5 -《本地部署开源大模型》在Ubuntu 22.04系统下ChatGLM3-6B高效微调实战

在Ubuntu 22.04系统下ChatGLM3-6B高效微调实战 无论是在单机单卡&#xff08;一台机器上只有一块GPU&#xff09;还是单机多卡&#xff08;一台机器上有多块GPU&#xff09;的硬件配置上启动ChatGLM3-6B模型&#xff0c;其前置环境配置和项目文件是相同的。如果大家对配置过程还…

如何给手机换ip地址

在当今数字化时代&#xff0c;IP地址作为设备在网络中的唯一标识&#xff0c;扮演着举足轻重的角色。然而&#xff0c;有时出于隐私保护、网络访问需求或其他特定原因&#xff0c;我们可能需要更改手机的IP地址。本文将详细介绍几种实用的方法&#xff0c;帮助您轻松实现手机IP…

一元n次多项式乘法【数据结构-链表】

一元n次多项式定义如下&#xff1a; 其中Ai​为实数&#xff0c;i为不小于0的整数。在完成“一元n次多项式输入输出”题目的基础上实现一元n次多项式的乘法。要求使用链表实现上述运算。 输入格式: 有两个一元n次多项式&#xff0c;格式分别为&#xff1a; f(X)3X2 X1 g(X)−…

MySQL 知识点_01

1、DISTINCT select DISTINCT EMPLOYEE_ID ,FIRST_NAME from employees 按照ID去重&#xff0c;DISTINCT的字段要放在前面&#xff0c;不会再继续在FIRST_NAME上去重判断&#xff1b; 如果需要多字段去重&#xff0c;需要用到group by&#xff0c;这个后面讲&#xff1b; …

一次恶意程序分析

首先F12shift查看字符表 字符表发现可疑字符串 双击进入 再tab 进入这里 推测为main函数 可见一些可疑的api FindResourceW推测该木马使用了资源加载 VirtualAlloc申请内存 然后sub_1400796E0 有 dwSize 参数 推测为 拷贝内存 memcpy类似函数 、 然后sub_140078CB0函数 跟进函…

HarmonyOS NEXT 应用开发实战(五、页面的生命周期及使用介绍)

HarmonyOS NEXT是华为推出的最新操作系统&#xff0c;arkUI是其提供的用户界面框架。arkUI的页面生命周期管理对于开发者来说非常重要&#xff0c;因为它涉及到页面的创建、显示、隐藏、销毁等各个阶段。以下是arkUI页面生命周期的介绍及使用举例。 页面的生命周期的作用 页面…

【正点原子K210连载】第四十六章 车牌识别实验 摘自【正点原子】DNK210使用指南-CanMV版指南

第四十六章 车牌识别实验 在上一章节中&#xff0c;介绍了利用maix.KPU模块实现了通过提取图像中人脸的特征进行人脸识别&#xff0c;本章将继续介绍利用maix.KPU模块实现的车牌识别。通过本章的学习&#xff0c;读者将学习到车牌识别应用在CanMV上的实现。 本章分为如下几个小…

视觉识别技术:开启智能视觉新时代

引言 在数字化时代&#xff0c;信息的获取和处理变得前所未有的重要。视觉识别技术&#xff0c;作为人工智能领域的一个重要分支&#xff0c;正在逐渐改变我们与数字世界的互动方式。它通过模拟人类视觉系统&#xff0c;使计算机能够识别和理解图像和视频中的内容&#xff0c;…

Shell案例之一键部署mysql

1.问题 我认为啊学习就是一个思考的过程&#xff0c;思考问题的一个流程应该是&#xff1a;提出问题&#xff0c;分析问题&#xff0c;解决问题 在shell里部署mysql服务时&#xff0c;我出现一些问题&#xff1a; 1.安装mysql-server时&#xff0c;没有密钥&#xff0c;安装…

普通java web项目集成spring-session

之前的老项目&#xff0c;希望使用spring-session管理会话&#xff0c;存储到redis。 项目环境&#xff1a;eclipse、jdk8、jetty嵌入式启动、非spring项目。 实现思路&#xff1a; 1.添加相关依赖jar。 2.配置redis连接。 3.配置启动spring。 4.配置过滤器&#xff0c;拦…

L1练习-鸢尾花数据集处理(分类/聚类)

背景 前文&#xff08;《AI 自学 Lesson1 - Sklearn&#xff08;开源Python机器学习包&#xff09;》&#xff09;以鸢尾花数据集的处理为例&#xff0c;本文将完善其代码&#xff0c;在使用 sklearn 的部分工具包基础上&#xff0c;增加部分数据预处理、数据分析和数据可视化…

QUIC 协议的优势

QUIC 协议的优势包括&#xff1a; 快速建立连接&#xff1a;将传输层和加密层的握手合并&#xff0c;减少了连接建立的延迟。QUIC 建连时间大约为 0~1RTT&#xff0c;相比 HTTPS 的 3RTT 建连&#xff0c;具有极大的优势。客户端第一次建连的握手协商需 1RTT&#xff0c;而已建…

Linux 和Windows创建共享文件夹实现文件共享

直接开整 1.Windows下创建共享文件夹share右击-》属性—》共享-》选择所有人-》点击共享 2.共享创建完成后可以使他的共享网络地址或者Windows ip地址-推荐使用Windows ip地址有时候 不知道什么原因他Linux解析不了网络地址 共享网络地址 —共享文件夹share 右击-》属性—》共…

扫普通链接二维码打开小程序

1. 2.新增规则&#xff08;注意下载文件到跟目录下&#xff0c;需要建个文件夹放下载的校验文件&#xff09; 3.发布 ps&#xff1a;发布后&#xff0c;只能访问正式版本。体验版本如果加了 测试链接http://xxx/xsc/10 那么http://xxx/xsc/aa.....应该都能访问 例如aa101 aa…

CMOS晶体管的串联与并联

CMOS晶体管的串联与并联 前言 对于mos管的串联和并联&#xff0c;一直没有整明白&#xff0c;特别是设计到EDA软件中&#xff0c;关于MOS的M和F参数&#xff0c;就更困惑了&#xff0c;今天看了许多资料以及在EDA软件上验证了电路结构与版图的对应关系&#xff0c;总算有点收…