RedHat9 | podman容器
1、容器技术介绍
传统问题
- 应用程序和依赖需要一起安装在物理主机或虚拟机上的操作系统
- 应用程序版本比当前操作系统安装的版本更低或更新
- 两个应用程序可能需要某一软件的不同版本,彼此版本之间不兼容
解决方式
- 将应用程序打包并部署为容器
- 容器是与系统的其他部分隔离的一个或多个进程的集合
- 容器内容和其他容器内容是隔离的,不会相互影响
- 容器是打包应用程序以简化和管理的方式
2、容器和虚拟化的对比
虚拟化
- 可以在单一硬件设备上运行多个操作系统
- 通过虚拟化软件将硬件拆分成多个虚拟硬件,允许多个操作系统同时运行
- 需要完整的操作系统来支持应用允许
容器
- 容器可以在操作系统上直接运行,容器之间共享硬件和操作系统资源
- 容器中应用现对于虚拟化环境更轻量,运行速度更快速
- 容器共享操作系统的内核,将容器化的应用程序进程与系统的其余部分隔离开,可以使用与该内核兼容的任何软件
- 现对于虚拟化使用的硬件资源更少,可以快速启动和关闭,减少存储要求
- 可以保存容器的多个版本,根据需求快速访问特定版本
- 容器是临时的,可以将容器运行时产生的数据永久保存在持久存储中
3、Rootless和Rootful容器
在容器主机上,可以使用root用户或普通用户运行容器。其中由特权用户运行的容器称为Rootful容器,普通用户运行的容器称为Rootless容器。Rootless容器不允许使用给特权用户所保留的系统资源(访问受限目录、在受端口(1024以下)发布网络服务)。
容器管理工具与开放容器协议(OCI)兼容,意味着我们可以管理所有兼容OCI协议的Linux容器,如Docker
容器管理工具
- podman:直接管理容器和容器镜像
- skopep:检查、复制、删除和签名镜像
- buildah:创建新的容器镜像
4、容器镜像和注册表
运行容器必须使用容器镜像。容器镜像是包含编码步骤的静态文件,充当创建容器的蓝图。容器镜像会打包应用及其所有的依赖项,如系统库、编程语言运行时和库,以及其他配置设置。
镜像容器根据规范构建,遵循开放容器项目OCI镜像格式规范。这些规范定义容器镜像的格式,以及镜像支持的容器主机操作系统和硬件架构的元数据。
容器注册表是用于存储和检索容器镜像的存储库,通过将容器镜像推送或上传到容器注册表中,可以通过注册表中将这些容器镜像拉取或下载到本地系统,用于运行容器。有点类似于dnf。
可以使用第三方镜像的公共注册表,也可以使用私有注册表。需要注意容器镜像的来源,和dnf中的软件包一样,需要清楚容器镜像中的代码是否合规、安全。红帽通过两个主容器注册表来分发认证容器镜像,可以通过RedHat登录凭据来访问这个两个注册表。
红帽官方提供的注册表
- registry.redhat.io:适用于基于RedHat官方产品的容器
- registry.connect.redhat.com:适用于基础第三方产品的容器
- https://access.redhat.com/containers:基于Web的界面
5、红帽Quay镜像仓库
访问红帽中国官网
https://www.redhat.com/zh
在菜单栏中找到【产品】,随后单击【查看所有产品】
点击左侧【产品A-Z】,然后选择【Quay】
红帽Quay需要收费
在红帽提供的学员练习环境中,有一个utility虚拟机,内置Quay,提供了部分的容器镜像。
https://utility/
账号密码
账号 | 密码 |
---|---|
admin | redhat321 |
只提供了几个容器镜像
6、容器安装与登陆
安装podman容器(建议使用普通用户身份)
sudo dnf -y install container-tools
登陆podman
建议使用交互式登陆,避免遗留密码
# 登陆方式1:交互式
podman login registry.lab.example.com
> admin # 输入账号
> redhat321 # 输入密码# 登陆方式1:非交互式
podman login registry.lab.example.com -u admin -p redhat321
查看登陆
podman login --get-login
登出podman
podman logout registry.lab.example.com
搜索镜像仓库
podman serach registry.lab.example.com/ # 地址末尾需要加上/,代表访问仓库根目录
7、规模化容器管理
新应用越来越多的使用容器来实现功能组件,越来越多的容器难于管理。
在实际环境中部署容器需要一个强大的环境
- 平台必须确保必须服务容器的可靠性
- 通过增加或减少运行中的容器实例,对流量进行负载均衡,应对应用使用高峰
- 检测容器或主机的故障,并快速作出反应
Kubernetes(K8s,为什么叫K8s,是因为开头字母为K,结尾字母为s,中间8个字符)是一项编排服务,可以在容器集群中部署、管理和扩展基于容器的应用。通过负载均衡器将流量重定向到容器,以便扩展提供容器的数量。同时支持用户定义的健康性检查,以便监控容器,并在容器出现错误时将其自动重启。
RedHat提供了一个名为OpenShift的Kubernets发行版,是基于Kubernetes基础架构构建的一组模块化组件和服务。提供额外功能包括基于Web的远程管理、多租户、监控和审计、高级安全功能、应用生命周期管理和自助服务实例等。
8、部署容器
podman来自于container-tools元数据包的全功能容器引擎,用于管理开放容器计划(OCI)容器和镜像。podman的运行不使用守护进程,不需要使用root用户来启动或停止容器。
podman常用命令
参数 | 作用 |
---|---|
podman login | 登录 |
podman logout | 登出 |
podman search | 搜索镜像仓库内文件 |
podman login --get-login | 查看登录 |
–tls-verify | 不使用https验证 |
podman images | 查看当前系统中存在的镜像 |
podman ps | 查看系统中存在的容器 |
podman --version | 查看容器版本 |
podman build | 使用容器文件构建容器镜像 |
podman run | 在新容器中运行命令 |
podman images | 列出本地存储中的镜像 |
podman ps | 打印出有关容器的信息 |
podman inspect | 显示容器、镜像、卷、网络或容器基的配置 |
podman pull | 从注册表下载镜像 |
podman cp | 在容器和主机之间复制 |
podman exec | 在运行中的容器内执行命令 |
podman rm | 删除一个或多个容器 |
podman rmi | 删除1个或多个本地存储镜像 |
使用registries.conf文件中指定的注册表列表搜索匹配的名称镜像
podman search registry.lab.example.com/
拉取/下载指定镜像
podman pull registry.lab.example.com/ubi8/python-38
查看本地镜像
podman images
podman image ls
9、使用容器文件构建容器镜像
容器文件是一种文本文件,包含用于构建容器镜像的指令。容器文件通常具有定义其文件和目录所在路径的URL上下文。生成的容器镜像由只读层组成,每一层代表容器文件中的一条指令。
podman build构建容器镜像
podman build -t NAME:TAG DIR
- podman build:构建容器镜像
- -t NAME:指定生成镜像的名称
- TAG:新镜像的标签,默认值为latest
- DIR:工作目录路径
容器文件必须位于工作目录中,如果工作目录是当前目录,可以使用.
来指定。可以通过-f
指定与当前目录不同的目录。
Containerfile文件是构建镜像的命令参数脚本文件,构建容器镜像的步骤
- 编写一个Containerfile文件
- 使用podman build命令构建镜像
编写Containerfile文件,用于构建一个RedHat9并配置了YUM源,同时安装了Python3的镜像
vim Containerfile# 写入下列内容
FROM registry.lab.example.com/ubi9-beta/ubi:latest
RUN echo -e '[BaseOS]\nname=BaseOS\nbaseurl=http://content.example.com/rhel9.0/x86_64/dvd/BaseOS\nenable=1\ngpgcheck=0\n[AppStream]\nname=AppStream\nbaseurl=http://content.example.com/rhel9.0/x86_64/dvd/AppStream\nenable=1\ngpgcheck=0' > /etc/yum.repos.d/dvd.repo
RUN dnf install python3 -y
CMD ["/bin/bash","-c","sleep infinity"]
- FROM:代表所使用的镜像
- RUN:在构建镜像时执行的命令,该命令会依次执行(这里是创建一个YUM仓库文件)
- CMD:构建完镜像后指定的命令,注意CMD指令的语法是使用JSON数组格式(如果使用数组,则值需要使用双引号)
- sleep infinity:让容器在启动后保持运行状态
简单查看一下RUN命令的执行效果
echo -e '[BaseOS]\nname=BaseOS\nbaseurl=http://content.example.com/rhel9.0/x86_64/dvd/BaseOS\nenable=1\ngpgcheck=0\n[AppStream]\nname=AppStream\nbaseurl=http://content.example.com/rhel9.0/x86_64/dvd/AppStream\nenable=1\ngpgcheck=0'
需要先确保已经登陆podman
podman login --get-login
开始构建容器
podman build -t python3:1.0 .
- podman build:构建容器镜像
- -t python3:1.0:-t指定容器镜像的名称(镜像名称不允许大写),1.0为镜像标签(这里用1.0代表版本号)
- .:指定Containerfile文件的路径,
.
代表在当前路径下
验证本地镜像存储库,可以看到我们刚刚创建的镜像
podman images
查看镜像的相关信息
podman inspect localhost/python3:1.0 # 用于搜寻本地镜像的信息
skopeo inspect docker://xxxx # 在网上搜寻镜像信息
移除本地镜像
podman rmi registry.lab.example.com/ubi8/python-38
10、创建、运行、删除容器
容器的状态
状态 | 说明 |
---|---|
Created | 已创建好但未启动的容器 |
Runing | 与其进程一起运行的容器 |
Stop | 其进程停止的容器 |
Paused | 其进程已停止的容器,不支持Rootless容器 |
Deleted | 其进程已被杀死的容器 |
列出系统上正在运行的容器
podman ps # 查看当前正在运行的容器
podman ps -a # 查看计算机上的所有容器(已创建、停止、状态或在运行的)
创建容器
podman create --name python3-1 localhost/python3:1.0
- podman create:创建容器
- –name python3-1:指定容器的名称(容器名称需保持唯一)
- localhost/python3:1.0:创建容器所使用的容器镜像
- d4b569c51c440cd091cff994c649734ef6651e22212413e5bed0d900505150c2:返回容器的长ID值
podman create --name python3-2 7c85859a8381 # 可以使用容器镜像的IMAGE ID
运行容器
podman start python3-1 # 可以使用名称(可以自动补全)
podman start d4b569c51c44 # 也可以使用CONTAINER ID
删除容器
podman rm -f d4b569c51c44 # 删除指定容器
podman rm -rf python3-1 # 删除指定容器
podman rm -f -a # 删除所有容器
创建容器并在后台运行容器
podman run -d --name python3-1 localhost/python3:1.0 sleep infinity
podman run -di --name python3-1 localhost/python3:1.0 # 等同于上面
- podman run:创建容器并运行容器
- -d:在后台运行容器,容器的输出不会直接显示在终端上
- –name python3-1:指定容器的名称
- localhost/python3:1.0:使用的容器镜像
- sleep infinity:容器启动后执行的命令:保持容器运行
11、创建容器并与容器进行交互
创建一个RedHat7容器,并在终端与容器交互,在退出交互窗口后,容器状态会更改为退出
podman search registry.lab.example.com/ # 搜寻镜像
podman pull registry.lab.example.com/ubi7/ubi # 拉取镜像
podman images # 查看本地存储库中的镜像
podman run -ti --name redhat7 registry.lab.example.com/ubi7/ubi:latest # 保持容器的运行状态,并在终端交互
- podman run:创建容器并运行容器
- -t:分配一个伪终端,用于与容器交互
- -i:等同于sleep infinity,让容器保持运行
- –name python3-2:指定容器的名称
- localhost/python3:1.0:使用的容器镜像
新开一个终端然后查看运行状态
ssh student@servera
podman ps
退出与容器的交互
exit
然后继续查看容器的状态,可以看到容器状态变为退出
podman ps
12、创建容器并让容器持续运行
继续使用刚刚拉取的redhat7镜像创建容器
podman run -di --name redhat7-2 registry.lab.example.com/ubi7/ubi:latest
- -d:在后台运行
- -i:持续运行
查看容器的状态
podman ps -a
与容器进行交互,其实就是让容器执行/bin/bash命令,而/bin/bash会启动一个新的Bash shell会话
podman exec -ti redhat7-2 /bin/bash
退出会话,然后查看容器的状态
exit
podman ps -a
封装要在容器中执行的命令,可以避免特殊字符被转义
podman exec redhat7-2 sh -c 'echo HELLO > hello.txt;cat hello.txt'
- sh -c ‘xxx’:封装要在容器中执行的命令
13、容器中的环境隔离
容器隔离应用环境,每一个容器都有自己的文件系统、网络和进程。
在运行状态的容器中执行命令,可以看到我们容器的版本是Redhat7,而运行容器的系统版本是Redhat9,由此可以看出容器会隔离应用环境。
podman exec redhat7-2 cat /etc/redhat-release
14、容器中的文件系统隔离
首先在主机上创建一个脚本文件
echo "echo Hello!" > demo.sh
将脚本文件复制到容器中
podman cp demo.sh redhat7-2:/
运行容器中的脚本
podman exec redhat7-2 sh -c "chmod o+x demo.sh;./demo.sh"
15、删除容器和镜像
在删除容器镜像之前,必须先从该镜像移除任何现有运行的中的容器。
查看当前存在的容器
podman ps -a
当前存在容器,尝试删除镜像
podman rmi localhost/python3:1.0
先删除容器
podman rm -f python3-1
podman rm -f python3-2
再删除镜像
podman rmi localhost/python3
相关文章:

RedHat9 | podman容器
1、容器技术介绍 传统问题 应用程序和依赖需要一起安装在物理主机或虚拟机上的操作系统应用程序版本比当前操作系统安装的版本更低或更新两个应用程序可能需要某一软件的不同版本,彼此版本之间不兼容 解决方式 将应用程序打包并部署为容器容器是与系统的其他部分…...
边缘计算项目有哪些
边缘计算项目在多个领域得到了广泛的应用,以下是一些典型的边缘计算项目案例: 1. **智能交通系统**:通过在交通信号灯、监控摄像头等设备上部署边缘计算,可以实时分析交通流量,优化交通信号控制,减少拥堵&…...
计算fibonacci数列每一项时所需的递归调用次数
斐波那契数列是一个经典的数列,其中每一项是前两项的和,定义为: [ F(n) F(n-1) F(n-2) ] 其中,( F(0) 0 ) 和 ( F(1) 1 )。 对于计算斐波那契数列的第 ( n ) 项,如果使用简单的递归方法,其时间复杂度是…...

【教学类65-05】20240627秘密花园涂色书(中四班练习)
【教学类65-03】20240622秘密花园涂色书03(通义万相)(A4横版1张,一大 68张纸136份)-CSDN博客 背景需求: 打印以下几款秘密花园样式(每款10份)给中四班孩子玩一下,看看效果 【教学类…...
Python 学习之基础语法(一)
Python的语法基础主要包括以下几个方面,下面将逐一进行分点表示和归纳: 一、基本语法 1. 注释 a. 单行注释:使用#开头,例如# 这是一个单行注释。 b. 多行注释:使用三引号(可以是三个单引号或三个双引号&…...

日志分析-windows系统日志分析
日志分析-windows系统日志分析 使用事件查看器分析Windows系统日志 cmd命令 eventvwr 筛选 清除日志、注销并重新登陆,查看日志情况 Windows7和Windowserver2008R2的主机日志保存在C:\Windows\System32\winevt\Logs文件夹下,Security.evtx即为W…...

【ARM】MDK工程切换高版本的编译器后出现error A1137E报错
【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 解决工程从Compiler 5切换到Compiler 6进行编译时出现一些非语法问题上的报错。 2、 问题场景 对于一些使用Compiler 5进行编译的工程,要切换到Compiler 6进行编译的时候,原本无任何报错警告…...

深入 SSH:解锁本地转发、远程转发和动态转发的潜力
文章目录 前言一、解锁内部服务:SSH 本地转发1.1 什么是 SSH 本地转发1.2 本地转发应用场景 二、打开外部访问大门:SSH 远程转发2.1 什么是 SSH 远程转发2.2 远程转发应用场景 三、动态转发:SSH 让你拥有自己的 VPN3.1 什么是 SSH 动态转发3.…...
python如何把一个函数的返回值,当成这个函数的参数值
python如何把一个函数的返回值,当成这个函数的参数值 1. 递归调用 递归是一种函数自己调用自己的方法。在递归调用中,你可以将前一次调用的返回值作为下一次调用的参数。 def recursive_function(x):# 函数逻辑if 条件满足:return 结果else:return rec…...

【融合ChatGPT等AI模型】Python-GEE遥感云大数据分析、管理与可视化及多领域案例应用
随着航空、航天、近地空间遥感平台的持续发展,遥感技术近年来取得显著进步。遥感数据的空间、时间、光谱分辨率及数据量均大幅提升,呈现出大数据特征。这为相关研究带来了新机遇,但同时也带来巨大挑战。传统的工作站和服务器已无法满足大区域…...

SpringBoot: Eureka入门
1. IP列表 公司发展到一定的规模之后,应用拆分是无可避免的。假设我们有2个服务(服务A、服务B),如果服务A要调用服务B,我们能怎么做呢?最简单的方法是让服务A配置服务B的所有节点的IP,在服务A内部做负载均衡调用服务B…...

Typescript 【实用教程】(2024最新版)含类型声明,类型断言,函数,接口,泛型等
简介 TypeScript 是 JavaScript 的超集,是 JavaScript(弱类型语言) 的强类型版本。 拥有类型机制文件后缀 .tsTypescript type ES6TypeScript 和 JavaScript 的关系类似 less 和 css 的关系TypeScript对 JavaScript 添加了一些扩展&#x…...

智慧校园-实训管理系统总体概述
智慧校园实训管理系统,专为满足高等教育与职业教育的特定需求而设计,它代表了实训课程管理领域的一次数字化飞跃。此系统旨在通过革新实训的组织结构、执行流程及评估标准,来增强学生的实践操作技能和教师的授课效率,为社会输送具…...

如何用GPT开发一个基于 GPT 的应用?
原文发自博客:GPT应用开发小记 如何开发一个基于 GPT 的应用?答案就在问题里,那就是用 GPT 来开发基于 GPT 的应用。本文以笔者的一个开源项目 myGPTReader 为例,分享我是如何基于 GPT 去开发这个系统的,这个系统的功能…...
大数据生态体系中各组件的区别面试题(更新)
一、MapReduce与Spark有什么区别? 1、处理方式: MapReduce基于磁盘处理数据,将中间结果保存到磁盘中,减少了内存占用,计算速度慢。 基于内存处理数据,将计算的中间结果保存到内存中,计算速度快。2、资源申请方式&…...

数字信号处理实验一(离散信号及离散系统的MATLAB编程实现)
实验要求: 离散信号及离散系统的MATLAB编程实现(2学时) 要求: 编写一程序,输出一定长度(点数),具有一定幅度、(角)频率和初始相位的实(或复&…...
数字图像处理专栏——introduction
Introduction: 数字图像处理技术是我在深入学习研究的方向之一。本科期间跟随导师做基于AndroidOpenCV的病虫识别app,因此入门,我也对该部分知识有进一步探索的欲望,但更多的是因该脚踏实地一步步记录,一步步成长。 本篇从数字图…...

Django 模版继承
1,设计母版页 Test/templates/6/base.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><!-- 修正了模板标签的全角字符问题 -->{% block title %}<title>这个是母版页</title>{…...
Apipost接口测试工具的原理及应用详解(一)
本系列文章简介: 随着软件行业的快速发展,API(应用程序编程接口)作为不同软件组件之间通信的桥梁,其重要性日益凸显。API的质量直接关系到软件系统的稳定性、性能和用户体验。因此,对API进行严格的测试成为…...

一款轻量级的通信协议---MQTT (内含Linux环境搭建)
目录 MQTT MQTT的关键特点: 应用场景 Linux环境搭建: 1. 安装mosquitto 2. Linux下客户端进行通信 3. PC端和Linux下进行通信 安装MQTT. fx 4. MQTT.fx的使用 1. 点击连接 编辑 2. 连接成功 3. 订阅主题或者给别的主题发送消息 遇到的问…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

【1】跨越技术栈鸿沟:字节跳动开源TRAE AI编程IDE的实战体验
2024年初,人工智能编程工具领域发生了一次静默的变革。当字节跳动宣布退出其TRAE项目(一款融合大型语言模型能力的云端AI编程IDE)时,技术社区曾短暂叹息。然而这一退场并非终点——通过开源社区的接力,TRAE在WayToAGI等…...

Win系统权限提升篇UAC绕过DLL劫持未引号路径可控服务全检项目
应用场景: 1、常规某个机器被钓鱼后门攻击后,我们需要做更高权限操作或权限维持等。 2、内网域中某个机器被钓鱼后门攻击后,我们需要对后续内网域做安全测试。 #Win10&11-BypassUAC自动提权-MSF&UACME 为了远程执行目标的exe或者b…...