RedHat9 | podman容器-续集

admin2024-07-02  38

RedHat9 | podman容器-续集,在这里插入图片描述,第1张

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

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

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

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

容器的环境变量

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

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

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

podman search registry.lab.example.com/

RedHat9 | podman容器-续集,在这里插入图片描述,第2张

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

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

RedHat9 | podman容器-续集,在这里插入图片描述,第3张

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

podman ps -a

RedHat9 | podman容器-续集,在这里插入图片描述,第4张

查看容器的日志

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

RedHat9 | podman容器-续集,在这里插入图片描述,第5张

先删除刚刚创建的容器

podman rm -f db01

RedHat9 | podman容器-续集,在这里插入图片描述,第6张

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

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

RedHat9 | podman容器-续集,在这里插入图片描述,第7张

二、容器持久存储

在默认情况下,运行容器时,存储的所有内容都基于容器的镜像。容器镜像的寿命比较短,用户或应用写入的所有的新数据都会在移除容器后丢失。如果要持久保存数据,通过将容器中的主机系统内容与–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

RedHat9 | podman容器-续集,在这里插入图片描述,第8张

3、分配端口映射到容器

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

4、容器中的网络配置

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

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

RedHat9 | podman容器-续集,在这里插入图片描述,第9张

创建容器网络

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

RedHat9 | podman容器-续集,在这里插入图片描述,第10张

查看容器网络的详细信息

podman network inspect podman

RedHat9 | podman容器-续集,在这里插入图片描述,第11张

容器持久化存储的步骤

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

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

podman rm -f -a

先在本机新建存储目录

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

mkdir /home/student/mysql_db

RedHat9 | podman容器-续集,在这里插入图片描述,第13张

先临时创建一个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

RedHat9 | podman容器-续集,在这里插入图片描述,第14张

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

podman exec -it db01 ss -tlnp 

RedHat9 | podman容器-续集,在这里插入图片描述,第15张

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

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

RedHat9 | podman容器-续集,在这里插入图片描述,第16张

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

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

RedHat9 | podman容器-续集,在这里插入图片描述,第17张

新建容器,指定容器的挂载目录和映射端口,自动调整主机目录的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端口
      RedHat9 | podman容器-续集,在这里插入图片描述,第18张

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

ll -dZ /home/student/mysql_db

RedHat9 | podman容器-续集,在这里插入图片描述,第19张

查看容器的端口映射关系

podman port -a

RedHat9 | podman容器-续集,在这里插入图片描述,第20张

调整防火墙规则

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

RedHat9 | podman容器-续集,在这里插入图片描述,第21张

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

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:指定登录端口号
    RedHat9 | podman容器-续集,在这里插入图片描述,第22张

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

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

RedHat9 | podman容器-续集,在这里插入图片描述,第23张

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

将容器配置为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		# 验证命令是否配置成功

RedHat9 | podman容器-续集,在这里插入图片描述,第24张

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

四、临时使用容器

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

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

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

RedHat9 | podman容器-续集,在这里插入图片描述,第26张

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

案例说明

RedHat9 | podman容器-续集,在这里插入图片描述,第27张

1、登录podman

登录podman

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

验证:查看podman登录

podman login --get-login

RedHat9 | podman容器-续集,在这里插入图片描述,第28张

2、创建容器网络

创建容器网络

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

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

podman network inspect ConNet

RedHat9 | podman容器-续集,在这里插入图片描述,第29张

3、创建Mariadb数据库容器

主机上创建数据存储目录

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

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

ll -d /home/student/db_data

RedHat9 | podman容器-续集,在这里插入图片描述,第30张

查找创建容器模板

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

RedHat9 | podman容器-续集,在这里插入图片描述,第31张

创建数据库容器

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

RedHat9 | podman容器-续集,在这里插入图片描述,第32张

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

podman exec -it mariadb_con ip add show eth0

RedHat9 | podman容器-续集,在这里插入图片描述,第33张

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

podman inspect mariadb_con		# 查看Netwokrs字段内容

RedHat9 | podman容器-续集,在这里插入图片描述,第34张

4、创建RedHat9容器

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

podman search registry.lab.example.com/

RedHat9 | podman容器-续集,在这里插入图片描述,第35张

创建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

RedHat9 | podman容器-续集,在这里插入图片描述,第36张

验证:查看容器状态

podman ps

RedHat9 | podman容器-续集,在这里插入图片描述,第37张

查找相关命令的来源包

dnf provides ping
dnf provides ip

RedHat9 | podman容器-续集,在这里插入图片描述,第38张

容器安装相关包

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

RedHat9 | podman容器-续集,在这里插入图片描述,第39张

验证:测试DNS解析

podman exec -it redhat9_con ping mariadb_con -c3

RedHat9 | podman容器-续集,在这里插入图片描述,第40张

主机上调整防火墙策略

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

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

sudo firewall-cmd --list-ports

RedHat9 | podman容器-续集,在这里插入图片描述,第41张

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

RedHat9 | podman容器-续集,在这里插入图片描述,第42张

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

创建容器网络

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

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

podman network inspect ConNet2

RedHat9 | podman容器-续集,在这里插入图片描述,第43张

为Mariadb容器添加网络

podman network connect ConNet2 mariadb_con

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

podman inspect mariadb_con

RedHat9 | podman容器-续集,在这里插入图片描述,第44张

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

案例拓扑

先将本地所有的容器删除

podman rm -f -a

RedHat9 | podman容器-续集,在这里插入图片描述,第45张

1、登录podman

登录podman

podman login registry.lab.example.com

验证:查看登录

podman login --get-login

RedHat9 | podman容器-续集,在这里插入图片描述,第46张

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 

RedHat9 | podman容器-续集,在这里插入图片描述,第47张

创建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

RedHat9 | podman容器-续集,在这里插入图片描述,第48张

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

curl localhost:8080

RedHat9 | podman容器-续集,在这里插入图片描述,第49张

4、容器即服务

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

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

创建容器单元文件

podman generate systemd -n nginx_con -f

验证:查看当前目录下生成的单元文件
RedHat9 | podman容器-续集,在这里插入图片描述,第50张

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

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

RedHat9 | podman容器-续集,在这里插入图片描述,第51张

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明原文出处。如若内容造成侵权/违法违规/事实不符,请联系SD编程学习网:675289112@qq.com进行投诉反馈,一经查实,立即删除!