当前位置: 首页 > article >正文

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.zip
   creating: demo/
  inflating: demo/pom.xml
  inflating: demo/mvnw.cmd
   creating: demo/.mvn/
   creating: demo/.mvn/wrapper/
  inflating: demo/.mvn/wrapper/maven-wrapper.properties
  inflating: demo/.gitignore
  inflating: demo/HELP.md
   creating: 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.java
   creating: 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.java
   creating: demo/src/main/resources/
  inflating: demo/src/main/resources/application.properties
  inflating: 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.java

12 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);
        }

        @Bean
        public 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 {

        @Autowired
        private MockMvc mvc;

        @Test
        public 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 {

        @Autowired
        private TestRestTemplate template;

    @Test
    public 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-slim

ADD target/demo-0.0.1-SNAPSHOT.jar   /app/demo.jar

ENTRYPOINT ["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.kler.cn/news/356756.html

相关文章:

  • connect 的断线重连设计
  • .cwsp勒索病毒:了解最新变种,以及如何保护您的数据
  • ubuntu24.0离线安装Ollama和纯cpu版本以及对接Spring AI
  • Missing classes detected while running R8报错解决方案
  • 博客|基于springBoot的精简博客系统设计与实现(附项目源码+论文+数据库)
  • [机器视觉]basler相机使用SN编号打开相机和采集
  • Android中的MVP模式
  • 【LeetCode】每日一题 2024_10_16 最小元素和最大元素的最小平均值(排序、模拟)
  • Android 开发 TabLayout 自定义指示器长度
  • 深入学习二叉树(BinaryTree)(纯小白进)
  • SpringBoot智能推荐:健康生活新体验
  • Lua表(Table)
  • MySQL程序介绍<一>
  • 侏罗纪公园不再是电影了吗?
  • 快速了解K8S几种网络实现
  • 代码复现(五):GCPANet
  • 高数导数积分知识点归纳
  • 使用Javascript实现一个Cron表达式的函数
  • 【Tinymce】富文本编辑器在vue项目中的使用;引入付费格式刷,上传视频、图片
  • IE11删除hao360主页