- Based ON ROLE Access Control (BRAC)
- ROLE 角色 :对于平台中需要被访问的资源的权限集合
- 管理员:对于平台具备完整的控制权限(admin)
- 审计员: 可以查看平台运行的完整日志 操作记录等内容
- 指定名称空间的管理员:
- 额外安装的自定义插件,可以使用自定义的角色进行管理
- ROLE 角色 :对于平台中需要被访问的资源的权限集合
K8s: POD的调度
- 控制器
- Pod的弹性调度(HBA)
- Pod 使用资源的限制
- Pod的状态检查
- Pod的自动更新
K8S:网络管理
- 节点的地址 // 物理网卡物理网络设备的地址
- Pod的地址 // pod分配到的地址,逻辑地址
- 集群地址 // 逻辑地址,这个逻辑地址用来解决对于不同控制器或者不同名称空间下pod的通信
资源:
- 网络插件 (CNI) // 主要负责pod网络的维护
- Coredns // K8S 平台的名称解析服务,为平台内所有的名称提供解析
- Service // 客户端对于pod内应用的访问入口
- Ingress
- 应用网关
K8S pod应用数据存储:
- 卷
- 临时卷
- 持久卷
- 存储类== 不同的存储引擎 数据到底保存在哪里?
K8S:
- 云原生基础设施支持
- 云原生概念之下,除了传统的web应用
- Springboot的延申架构 springcloud
- AI
- 大数据平台
- 云原生概念之下,除了传统的web应用
- 基础设施级别的云平台(IaaS)
- 容器的调度平台
K8S 是一个用来进行应用部署的平台,基于以下特性支持:
- 弹性调度 (所有云基础设施的基本要求)
- 按照实际的需求进行应用架构的调整
- 随时随地的网络访问
- K8S 中使用的一些诸如:service 、ingress 、应用网关等资源,确保客户端对于应用的访问
- 以上的资源都可以设置为负载均衡,缓解访问压力
- 自愈
- K8S平台会尽可能保证应用的可用性,通过诸如重启容器、移除故障pod重新调度等方式
- 包括工作节点故障,K8S将故障节点中所有的pod调度到其他正常的工作节点上。
- 架构调整方便
- K8s平台扩展起来较为简单
- K8S 所有的基础组件都是通过容器运行,所以K8S 基础平台扩容就非常简单:
- 增加新的工作节点
- Kubeadm join 的命令
- 增加控制节点,主要目的是为提供控制节点冗余,避免控制节点的单节点故障
- K8S的基础功能组件基本都运行在控制节点之上,一旦控制节点出现问题,所有的核心组件都有可能停止,且无法恢复
- 按照部署K8S控制节点的方式,安装所有的软件
- 运行kubeadm join 同时指定节点角色为控制节点,
- 基于主从选举算法,决定主节点的IP
- 可以将保存K8S集群数据的数据库-edtd 组件新的集群
- 增加新的工作节点
- 支持丰富的插件
- K8S的开发整体使用REST API 标准化接口,使K8S引入新的功能支持,就好像管道对接一样简单
- 对于应用实例的部署成熟且快速
- K8S 所有部署的应用都是的容器化方式运行,因此只需要在对应的工作节点上拉取镜像、启动容器即可。
- 基于容器化方式运行,将应用部署交付的最后一步集中在容器镜像的打包。
web应用部署:
- 以一个系统服务的方式实现部署
- 基于操作系统上的支持服务完成部署
- Lamp/lnmp 运行phpweb 服务
- Tomcat 专门用于基于java程序编写的serverlet应用调试和部署的服务软件
- Python web应用 使用对应的web服务软件,来调用python 解释器,解析web应用程序
- 应用部署的步骤:大前提是 相关的软件服务已经部署调试完毕
- 获取应用程序包(一般由开发人员打包完毕)
- 解压文件包
- 将文件包中的内容按照web程序规定的目录进行部署(即将文件放入指定目录)
- 重启相关服务 (可以跳过)
- 适合的部署环境:
- 直接部署到物理服务器(云计算时代基本已经淘汰)
- 直接部署到仅安装操作系统的虚拟机实例,这个虚拟机实例可以运行在公司自建虚拟化平台,或者作为公有云的一个虚拟化实例
- 基于操作系统上的支持服务完成部署
- 以容器化方式运行应用
- 基于不同的容器调度平台即可
- docker
- Kubectl run
- podman
- Isula
- crictl
- 部署步骤:
- 使用程序代码以及一些静态资源文件,制作容器镜像
- 主要是程序代码,静态资源文件可以使用存储卷提供容器
- 使用制作的容器镜像,启动容器即可
- 使用程序代码以及一些静态资源文件,制作容器镜像
- 适合的部署环境
- 只要安装了任意的容器控制程序
- 基于不同的容器调度平台即可
应用的生命周期:
- 开发
- 测试
- 发布(应用的打包) // 23 合并之后 可以称为应用的集成
- 部署
Python web项目发布和部署过程:
- 开发环境下,固定python 解释器运行环境: freeze
- Python 解释器的版本、硬件架构
- 项目所使用到的所有的模块
- 模块的名称和版本 ( 公共仓库)
- 指定自行开发的python 模块的仓库地址和版本信息
- 收集静态资源 collectstatics
- Web界面样式设置
- 图片文件
- 关闭开发环境下设置的应用调试等功能 修改settings文件
- 打包程序文件,以及静态资源文件包 和 运行环境说明文件 ,下一步开始部署
基于系统服务部署:
- 按照运行环境说明文件,安装对应的依赖关系
- 部署静态资源和程序文件到web程序目录下
- 基于python 解释器和web程序之间的调用网关(CGI),启动对应cgi协议服务
基于容器部署:
- 安装打包的程序文件包和环境说明文件,调整镜像的运行环境即可
- 使用调整后的镜像启动容器
Java web程序如何部署:
[student@harbor practice]$ ll demo.zip
-rw-r--r--. 1 student student 14092 Oct 12 17:08 demo.zip
// springboot的web项目初始化目录,web应用开发可以直接使用压缩包提供的项目目录结构进行开发。
实例项目包环境需求如下:
- Springboot: 3.3.
- Java:jdk17
- 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!