RedHat9 | podman容器-续集

news2024/12/24 2:21:00

在这里插入图片描述

一、管理容器存储和网络资源

使用容器来运行简单的进程,然后退出。可以配置容连续运行特定服务,如数据库服务。如果持续运行服务,需要向容器添加更多的资源,如持久存储或对其他网络的访问权限。

  • 针对企业容器平台上的大型部署:使用复杂的存储解决方案为容器提供存储,而无需了解底层架构。
  • 针对单个容器主机的小型部署:通过在运行的容器上创建要挂载的目录,从容器主机创建持久存储。

当Web服务器或数据库服务器等容器需要为外部客户端提供服务时,需要客户端设置通信通道,以访问容器的内容。可以通过配置端口映射,以启用与容器的通信。通过端口映射,将容器主机上的端口球球转发到容器内的端口。

容器的环境变量

容器镜像允许在创建时传递环境变量以自定义容器。可以使用环境变量为容器设置相关参数,根据自己的环境进行定制,无需创建自己的自定义镜像。通常不会修改容器镜像,因为这会在镜像中添加层,使其更加难以维护。

当一个容器需要在创建时指定变量,直接创建容器时会启动失败

查看容器镜像,可以发现存在一个mariadb-105镜像

podman search registry.lab.example.com/

在这里插入图片描述

直接创建并运行容器,因为该镜像不在本地,podman会先下载镜像然后才创建容器

podman run -d --name db01 registry.lab.example.com/

在这里插入图片描述

查看容器db01的状态,可以看到状态为Exited

podman ps -a

在这里插入图片描述

查看容器的日志

podman logs db01
podman container logs db01
  • MYSQL_USER:要创建的MySQL账户的用户名
  • MYSQL_PASSEORD:用户账户的密码
  • MYSQL_DATABASE:数据库名称
  • MYSQL_ROOT_PASSWORD:root管理员密码

在这里插入图片描述

先删除刚刚创建的容器

podman rm -f db01

在这里插入图片描述

重新创建容器并传递环境变量

podman run -d --name db01 -e MYSQL_USER=user -e MYSQL_PASSWORD=redhat -e MYSQL_DATABASE=db1 -e MYSQL_ROOT_PASSWORD=redhat@123 registry.lab.example.com/rhel8/mariadb-105

在这里插入图片描述

二、容器持久存储

在默认情况下,运行容器时,存储的所有内容都基于容器的镜像。容器镜像的寿命比较短,用户或应用写入的所有的新数据都会在移除容器后丢失。如果要持久保存数据,通过将容器中的主机系统内容与–volume(-v)选项搭配使用。在容器中使用此卷类型时,必须考虑文件系统级别的权限。

在Mariadb容器镜像中,mysql用户必须拥有/var/lib/mysql目录,等同于Mariadb数据库在主机上运行。挂载到容器中的目录必须具有mysql作为用户或组所有者。如果以root运行容器,则主机上的UID和GID与容器内的UID和GID匹配。意思是,如果要将主机中的目录挂载到容器中,尽量保证内外的属主和属组一致。在Mariadb数据库中,数据的存储目录为/var/lib/mysql。

1、容器存储的SELinux上下文

如果要在本机上存储容器数据, 则必须要给主机文件夹设置安全上下文(container_file_t),然后才能将该目录作为持久存储挂载到容器中。如果主机目录没有设置安全上下文,则容器无法访问该目录。通过在-v选项中附加Z参数,可以自动设置SELinux上下文。
一共有两种参数,分别是:Z:z

  • :Z:选项用于将指定的安全上下文设置为挂载点或文件的值。当使用:Z时,Podman会更改挂载点或文件的安全上下文,以确保容器可以访问指定的主机文件系统路径,并具有正确的SELinux权限。会将文件或目录安全上下文更改为container_file_t
  • :z:这个选项用于将当前SELinux安全上下文传播给容器中的挂载点或文件。当使用:z时,Podman会将主机上的安全上下文直接传播到容器中的挂载点或文件,以确保容器内的进程具有与宿主机相同的安全上下文。

使用:Z实际上是指定了:z选项的默认值(container_file_t),将默认的SELinux安全上下文应用于挂载点或文件。

在大多数情况下,如果你只是想让容器能够访问主机上的目录或文件,并且不关心具体的安全上下文,那么使用:Z是一个简单而安全的选择。如果你需要更精细地控制安全上下文,或者需要确保容器内的进程具有与主机具有相同的安全上下文,那么可以使用:z选项。

2、用户命名空间的UID映射

podman unshare cat /proc/self/uid_map    	# 获取用户命名空间的UID映射
podman unshare cat /proc/self/gid_map    	# 获取用户命名空间的GID映射

可以看到,容器中的root用户(UID=GID=0)映射到主机计算机上的用户为(UID=GID=1000);容器中的UID=GID=1映射到主机计算机上为(UID=GID=100000)。

  • UID换算规则:容器的UID+99999
  • GID换算规则:容器的GID+99999

在这里插入图片描述

3、分配端口映射到容器

要提供对容器的网络访问权限,客户端必须连接到容器主机上的端口,这些端口将网络流量传递到容器中的端口。将容器主机上的网络端口映射到容器中的端口时,容器将接收发送到主机网络端口的网络流量。

4、容器中的网络配置

Podman4.0中支持两种容器网络后端,分别是Netavark和CNI。在RedHat9中,系统默认使用Netavark。

podman info --format {{.Host.NetworkBackend}}

在这里插入图片描述

创建容器网络

podman network create --gateway 192.168.10.254 --subnet 192.168.10.0/24 db_net
  • podman network create:创建网络
  • –gateway 192.168.10.254:指定网关
  • –subnet 192.168.10.0/24:指定网段
  • db_net:网络名称

列出容器网络

podman network ls

在这里插入图片描述

查看容器网络的详细信息

podman network inspect podman

在这里插入图片描述

容器持久化存储的步骤

  1. 主机建立目录
  2. 给主机目录设置UID和GID
  3. 创建虚拟网络
  4. 新建容器,指定容器的挂载目录和映射端口,自动调整主机目录的SELinux安全上下文
    在这里插入图片描述

先删除当前存在的所有容器

podman rm -f -a

先在本机新建存储目录

如果想要容器可以访问主机的目录,则首先需要容器中的用户具备对主机目录的访问权限

mkdir /home/student/mysql_db

在这里插入图片描述

先临时创建一个Mariadb数据库容器

podman run -d --name db01 -e MYSQL_USER=user -e MYSQL_PASSWORD=redhat -e MYSQL_DATABASE=db -e MYSQL_ROOT_PASSWORD=redhat@123 registry.lab.example.com/rhel8/mariadb-105

查看容器密码文件中的mysql用户的UID和GID,得出UID和GID都为27

podman exec -it db01 grep mysql /etc/passwd

在这里插入图片描述

查看容器中Mariadb服务的监听端口号

podman exec -it db01 ss -tlnp 

在这里插入图片描述

给主机目录设置属组和属主

podman unshare chown 27:27 /home/student/mysql_db

在这里插入图片描述

创建Mariadb容器的参考语句可以借鉴容器介绍中的usage字段

skopeo inspect docker://registry.lab.example.com/rhel8/mariadb-105 | grep usage

在这里插入图片描述

新建容器,指定容器的挂载目录和映射端口,自动调整主机目录的SELinux安全上下文

podman run -d --name db02 -e MYSQL_USER=user -e MYSQL_PASSWORD=redhat -e MYSQL_DATABASE=db -e MYSQL_ROOT_PASSWORD=redhat@123 -v /home/student/mysql_db:/var/lib/mysql:Z -p 13306:3306 registry.lab.example.com/rhel8/mariadb-105
  • -v /home/student/mysql_db:/var/lib/mysql:Z
    • -v:挂载目录
    • /home/student/mysql_db:主机的目录
    • /var/lib/mysql:容器中的目录
    • :Z:自动为主机目录添加安全上下文
    • -p 13306:3306:将主机的13306端口映射到容器中的3306端口
      在这里插入图片描述

查看主机挂载目录的安全上下文

ll -dZ /home/student/mysql_db

在这里插入图片描述

查看容器的端口映射关系

podman port -a

在这里插入图片描述

调整防火墙规则

sudo firewall-cmd --add-port=13306/tcp --permanent
sudo firewall-cmd --reload
sudo firewall-cmd --list-all

在这里插入图片描述

使用本地主机测试访问容器数据库服务

sudo dnf install mariadb -y		# 安装Mariadb软件
mysql -u user -predhat -h 127.0.0.1 -P 13306
  • mysql:登录数据库
  • -u user:指定登录用户名
  • -predhat:指定密码
  • -h localhost:指定登录主机
  • -P 13306:指定登录端口号
    在这里插入图片描述

使用异地主机远程访问容器数据库服务

sudo dnf install -y mariadb
mysql -u user -predhat -h 172.25.250.10 -P 13306

在这里插入图片描述

三、作为系统服务来管理容器

将容器配置为systemd服务,并将容器服务配置为在系统启动时自动启动。如果希望可以无限期运行服务的容器,如Web服务器或数据库,特权用户通常将这些服务配置为在系统启动时运行,使用systemctl命令进行管理。作为普通用户,可以通过创建systemd单元来配置Rootless容器。通过此配置,可以通过systemctl命令将容器作为常规系统服务进行管理。基于systemd单元管理容器主要用于不需要扩展的基本和小型部署。如果存在的容器过多和服务更加复杂,则可以使用Kubernetes的企业编排平台。

systemd服务分类

  • 普通用户使用systemctl命令来启动服务,服务会在打开会话时启动,在关闭最后一个会话时间停止。
  • 系统服务则会在系统启动时启动,在系统关闭时停止。

首先需要在用户家目录下创建单元文件目录,然后进入目录

mkdir -p ~/.config/systemd/user/
cd ~/.config/systemd/user/

使用podman generate systemd生成单元文件

podman generate systemd -n ConName -f
  • podman generate systemd:生成单元文件
  • -n ConName:容器名
  • -f:生成文件

使用普通用户来生成单元文件,如果用户从系统注销,systemd服务会在特定时间后停止容器。因为systemd服务单元是使用.user选项创建的,在用户登录时启动服务,并在用户注销时停止服务。可以通过运行loginctl enable-linger命令来更改此默认行为并强制已启用的服务在服务器启动时启动,并在服务器关闭时停止。

创建一个redhat9容器

podman run -d --name redhat9_con registry.lab.example.com/ubi9-beta/ubi:latest

进入用户家目录,创建容器服务

cd ~/.config/systemd/user
podman generate systemd -n redhat9_con -f

更改默认行为,为所配置服务的用户注销后服务保留

loginctl enable-linger
loginctl show-user student		# 验证命令是否配置成功

在这里插入图片描述

验证:注销当前student用户,再次使用student用户登陆,可以看到redhat9_con容器状态依旧是Up(我们没有将该容器你设置为开机自启)
在这里插入图片描述

四、临时使用容器

如果只是临时某个容器,在容器使用完就自动删除,可以添加–rm选项

创建一个redhat9容器,查看完容器的版本号就删除容器

podman run --rm registry.lab.example.com/ubi9-beta/ubi cat /etc/redhat-release

在这里插入图片描述

五、综合案例–Mariadb数据库服务

案例说明

在这里插入图片描述

1、登录podman

登录podman

podman login -u admin -p redhat321 registry.lab.example.com

验证:查看podman登录

podman login --get-login

在这里插入图片描述

2、创建容器网络

创建容器网络

podman network create --subnet 192.168.10.0/24 --gateway 192.168.10.254 ConNet

验证:查看容器网络的详细信息

podman network inspect ConNet

在这里插入图片描述

3、创建Mariadb数据库容器

主机上创建数据存储目录

mkdir /home/student/db_data
podman unshare chown 27:27 /home/student/db_data

验证:查看主机目录的权限

ll -d /home/student/db_data

在这里插入图片描述

查找创建容器模板

podman inspect registry.lab.example.com/rhel8/mariadb-105 | grep usage

在这里插入图片描述

创建数据库容器

podman run -di --name mariadb_con --network ConNet -e MYSQL_USER=mike -e MYSQL_PASSWORD=redhat -e MYSQL_DATABASE=db1 -p 13307:3306 -v /home/student/db_data:/var/lib/mysql:Z registry.lab.example.com/rhel8/mariadb-105

验证:-查看数据库容器状态

podman ps

在这里插入图片描述

验证:查看容器的网络信息

podman exec -it mariadb_con ip add show eth0

在这里插入图片描述

验证:查看容器的详细信息

podman inspect mariadb_con		# 查看Netwokrs字段内容

在这里插入图片描述

4、创建RedHat9容器

先查看容器镜像仓库中的容器镜像

podman search registry.lab.example.com/

在这里插入图片描述

创建RedHat9容器

podman会先下载容器镜像,然后才会创建容器,这里我们只需要容器具有仓库文件的读权限,而不需要有写权限,所以无需修改SELinux安全上下文。

podman run -di --name redhat9_con --network ConNet -v /etc/yum.repos.d/:/etc/yum.repos.d/ registry.lab.example.com/ubi9-beta/ubi

在这里插入图片描述

验证:查看容器状态

podman ps

在这里插入图片描述

查找相关命令的来源包

dnf provides ping
dnf provides ip

在这里插入图片描述

容器安装相关包

podman exec -it redhat9_con dnf install -y iputils iproute

验证:查看容器的网络信息

podman exec -it redhat9_con ip add show eth0
podman exec -it redhat9_con ping 192.168.10.1 -c3

在这里插入图片描述

验证:测试DNS解析

podman exec -it redhat9_con ping mariadb_con -c3

在这里插入图片描述

主机上调整防火墙策略

sudo firewall-cmd --add-port=13307/tcp --permanent
sudo firewall-cmd --reload

验证:查看当前防火墙策略

sudo firewall-cmd --list-ports

在这里插入图片描述

5、跨容器服务访问

先在redhat9_con容器中安装Mariadb服务

podman exec -it redhat9_con dnf install -y mariadb

在redhat9_con容器中访问mariadb_con容器中的mariadb服务

podman exec -it redhat9_con /bin/bash		# 开启伪终端
mysql -u mike -predhat -h 192.168.10.1

在这里插入图片描述

6、给Mariadb容器添加多一个容器网络

创建容器网络

podman network create --subnet 192.168.20.0/24 --gateway 192.168.20.254 ConNet2

验证:查看容器网络的详细信息

podman network inspect ConNet2

在这里插入图片描述

为Mariadb容器添加网络

podman network connect ConNet2 mariadb_con

验证:查看容器的网络信息

podman inspect mariadb_con

在这里插入图片描述

六、综合案例–Nginx数据库服务

案例拓扑

先将本地所有的容器删除

podman rm -f -a

在这里插入图片描述

1、登录podman

登录podman

podman login registry.lab.example.com

验证:查看登录

podman login --get-login

在这里插入图片描述

2、主机准备

创建主机的本地挂载目录

mkdir -p /home/student/appdev-adm/nginx_web

在挂载目录中添加索引页

echo nginx_web_page > /home/student/appdev-adm/nginx_web/index.html

3、创建nginx容器

查看容器镜像仓库

podman search 

在这里插入图片描述

创建nginx容器并运行

需要在-v选项中指定:Z,为挂载目录添加SELinux安全上下文,否则SELinux 会阻止容器访问挂载的主机目录

podman run -d --name nginx_con -v /home/student/appdev-adm/nginx_web/:/usr/share/nginx/html:Z -p 8080:80 registry.lab.example.com/library/nginx

验证:查看容器状态

podman ps

在这里插入图片描述

验证:本地访问nginx_con容器中的nginx服务

curl localhost:8080

在这里插入图片描述

4、容器即服务

**新建用户systemd单元文件存储目录 **

mkdir -p ~/.config/systemd/user
cd ~/.config/systemd/user

创建容器单元文件

podman generate systemd -n nginx_con -f

验证:查看当前目录下生成的单元文件
在这里插入图片描述

验证:将容器暂停,然后通过systemctl启动

podman stop nginx_con
systemctl --user start container.nginx_con.service		# --user:用户级别启动

在这里插入图片描述

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

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

相关文章

江协科技51单片机学习- p23 DS1302实时时钟

🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝​…

#笔记# 写给自己用的小爬虫

最近完成了一个文旅行业信息聚合的小应用,实现仅从一个入口了解全行业的信息动态,不用一个一个翻看各网站,节省了不少检索时间。 一、基本思路 明确数据来源。基于前述目标,确定数据源为文化和旅游部管理部门官网,比…

万界星空科技公司推出AI低代码MES,引领制造业智能化新潮流

随着科技的不断进步和制造业的快速发展,传统生产管理模式正面临前所未有的挑战。在这个背景下,万界星空科技公司凭借其前瞻性的技术洞察力和强大的研发实力,推出了AI低代码MES(制造执行系统),该系统凭借其独…

【深度学习】调整加/减模型用于体育运动评估

摘要 一种基于因果关系的创新模型,名为调整加/减模型,用于精准量化个人在团队运动中的贡献。该模型基于明确的因果逻辑,将个体运动员的价值定义为:在假设情景下,用一名价值为零的球员替换该球员后,预期比赛…

2024免费的股票数据接口API

沧海数据 # Restful API https://tsanghi.com/api/fin/stock/{exchange_code}/realtime?token5dbb47113a4a43a6be1755673ce854db&ticker{ticker} 数据来源:沧海数据 请求方式:Get 数据格式:标准Json格式[{},...{}]

一篇文章学会【node.js安装以及Vue-Cli脚手架搭建】

一.为什么搭建Vue-Cli (1).传统的前端项目结构: 一个项目中有许多html文件,每一个html文件都是相互独立的, 如果需要在页面中导入一些外部依赖的组件,就需要在每一个html文件中都需要导入,非常麻烦 (2).现在的前端…

【Python函数编程实战】:从基础到进阶,打造代码复用利器

文章目录 🚋前言🚀一、认识函数🌈二、函数定义❤️三、函数调用⭐四、实参与形参💥1. 形式参数🚲2. 实际参数🔥1. 位置参数☔2. 关键字参数🎬3. 默认参数🔥4. 可变数量参数(不定长参…

SpringBoot实现图片添加水印

提示&#xff1a;今日完成图片添加水印功能 后续可能还会继续完善这个功能 文章目录 目录 文章目录 前端部分 后端 Xml Controller层 Sercive层 Service实现层 Config配置层 application.properties 文件后缀名获取 常量定义 前端部分 <!DOCTYPE html> <htm…

MD5算法详解

哈希函数 是一种将任意输入长度转变为固定输出长度的函数。 一些常见哈希函数有&#xff1a;MD5、SHA1、SHA256。 MD5算法 MD5算法是一种消息摘要算法&#xff0c;用于消息认证。 数据存储方式&#xff1a;小段存储。 数据填充 首先对我们明文数据进行处理&#xff0c;使其…

ARCGIS python 裁剪栅格函数 arcpy.management.Clip

ARCGIS python 裁剪栅格函数 arcpy.management.Clip 1 功能 裁剪掉栅格数据集、镶嵌数据集或图像服务图层的一部分。 2 使用情况 基于模板范围提取部分栅格数据集&#xff0c;输出与模板范围相交的所有像素使用以 x 和 y 坐标的最小值和最大值确定的包络矩形或使用输出范围文…

全国产化飞腾模块BIOS下修复系统启动文件

1、背景介绍 全国产飞腾模块采用麒麟信安操作系统&#xff0c;当系统下面的grub.cfg文件被用户误操作导致无法启动时&#xff0c;可以在BIOS下通过U盘中备份的grub.cfg替换硬盘上原来的grub.cfg文件&#xff0c;从而实现启动。 2、操作步骤 首先进入BIOS命令行模式&#xff…

使用 Rustup 管理 Rust 版本

文章目录 安装 Rustup配置镜像源安装 Rustup 安装 RustVS Code插件创建项目代码示例 Rust 官网&#xff1a;https://www.rust-lang.org/zh-CN/Crates 包管理&#xff1a;https://crates.io/Rust 程序设计语言&#xff1a;https://kaisery.github.io/trpl-zh-cn/通过例子学 Rust…

七人互助拼团模式的深度剖析与互助精神的价值

在当下电商的浪潮中&#xff0c;七人互助拼团模式以其独特的运作方式和互助精神&#xff0c;赢得了广大消费者和商家的青睐。这一模式不仅为用户提供了优惠的购物体验&#xff0c;更在无形中培养了用户间的互助与协作精神。 一、激励机制的细致解读 七人互助拼团模式中&#x…

GPT-4o文科成绩超一本线,理科为何表现不佳?

目录 01 评测榜单 02 实际效果 什么&#xff1f;许多大模型的文科成绩竟然超过了一本线&#xff0c;还是在竞争激烈的河南省&#xff1f; 没错&#xff0c;最近有一项大模型“高考大摸底”评测引起了广泛关注。 河南高考文科今年的一本线是521分&#xff0c;根据这项评测&…

notepad++安装并打开json文件

1、notepad安装 1、首先下载Notepad.exe 2、选择简体中文安装 点击下一步 点击“我接受” 选择安装目录&#xff0c;进行下一步安装 默认下一步 选择安装 等待安装完成 点击完成 2、保存json文件 复制返回结果 先把返回结果复制出来。保存到text里面 把文件另存为json格式 3、…

代码随想录-Day44

322. 零钱兑换 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1 。 你可以认为每种硬币的数…

Qt:8.QWidget属性介绍(focuspolicy属性-控件焦点、stylesheet属性-为控件设置样式)

目录 一、focuspolicy属性-控件焦点&#xff1a; 1.1focuspolicy属性介绍&#xff1a; 1.2设置焦点策略——setFocusPolicy()&#xff1a; 1.3获取控件的焦点策略——focusPolicy()&#xff1a; 二、stylesheet属性——为控件设置样式&#xff1a; 2.1 stylesheet属性介绍…

虚拟机网络配置(静态网络)

解决问题&#xff1a;VMware中创建centOS虚拟机后使用ifconfig没有ip地址&#xff0c;但我想在主机&#xff08;Windows&#xff09;系统下使用shell连接虚拟机从而方便后续交互。 VMware中编辑->虚拟网络编辑器 &#xff08;注意需要管理员身份不然会无法修改&#xff09;…

Python容器 之 列表--定义

1.什么是列表呢&#xff1f; 列表(list)是 Python 中使用最频繁的数据类型, 在其他语言中通常叫做数组, 专门用来存储一组数据 列表,list, 使用 [ ] 列表可以存放任意多个数据 列表中可以存放任意类型的数据 列表中数据之间 使用 逗号隔开 2.列表如何定义&#xff1f; &#…