在红帽企业 Linux 9.0(RHEL 9.0)系统中,容器技术是实现应用轻量化部署、环境隔离与资源高效利用的核心方案。

一、容器核心概念与技术原理

容器是 “与系统其他部分隔离的进程集合”,通过 Linux 内核技术实现资源隔离与限制,解决传统应用依赖冲突、部署复杂的问题,其核心特性与技术支撑如下:

(一)容器技术核心支撑

RHEL 9.0 通过三类内核技术构建容器隔离环境,确保容器间互不干扰:

  1. Control Groups(cgroups):限制容器的资源使用(如 CPU、内存、磁盘 I/O),避免单个容器占用过多主机资源;

  2. Namespaces:实现进程、网络、文件系统等资源的隔离(如容器内进程仅可见自身进程,无法访问主机或其他容器进程);

  3. SELinux 与 Seccomp:加强安全边界,SELinux 通过标签控制容器对主机文件的访问,Seccomp 限制容器进程可调用的系统调用,降低安全风险。

(二)容器与虚拟化的核心差异

容器与虚拟机(如 KVM、VMware)均能实现环境隔离,但架构与资源占用差异显著:

对比维度容器虚拟机
架构层级与主机共享内核,仅包含应用及依赖包含完整 Guest OS,通过 Hypervisor 虚拟硬件
资源占用轻量(MB 级),启动时间毫秒级重量级(GB 级),启动时间分钟级
隔离粒度进程级隔离,共享内核资源硬件级隔离,资源完全独立
适用场景微服务、轻量应用部署需完整 OS 环境的传统应用、跨内核架构场景

(三)容器运行模式:Rootful 与 Rootless

RHEL 9.0 支持两种容器运行模式,需根据安全性与功能需求选择:

  • Rootful 容器:以 root 用户运行,权限完整(如可使用 1024 以下特权端口),但安全性较低,适用于需高权限的服务(如数据库);

  • Rootless 容器:以普通用户运行,权限受限(如无法使用特权端口),但安全性更高,适用于普通应用(如 Web 服务),避免容器漏洞影响主机系统。

二、容器管理工具与镜像体系

RHEL 9.0 提供一套兼容 OCI(开放容器倡议)标准的工具集,用于镜像管理、容器部署与运维,核心工具与镜像存储体系如下:

(一)核心容器管理工具

工具功能常用命令
podman管理容器与镜像(创建、启动、停止、删除)podman run(运行容器)、podman pull(拉取镜像)、podman ps(查看容器)
skopeo检查、复制、签名镜像(无需下载完整镜像)skopeo inspect(查看镜像元数据)、skopeo copy(复制镜像)
buildah基于 ContainerFile 构建自定义镜像buildah bud(构建镜像)、buildah from(基于基础镜像创建容器)

安装方式:通过dnf安装container-tools包组,一次性获取所有工具:

[root@host-]# dnf install -y container-tools

(二)容器镜像与注册表

  1. 镜像本质:容器镜像是不可修改的 “应用蓝图”,包含应用及其依赖(系统库、运行时、配置文件),以分层方式存储(每一层对应构建指令,可复用);

  2. 注册表(Registry):存储镜像的仓库,分为公有与私有两类:

    • 公有注册表:红帽官方registry.redhat.io(提供认证镜像)、docker.io(通用镜像);

    • 私有注册表:企业自建的 Red Hat Quay 或 Harbor,用于内部镜像管理;

  3. 镜像拉取与认证

    • 拉取红帽官方镜像需先登录:podman login registry.redhat.io(输入红帽账号密码);

    • 拉取镜像:podman pull registry.redhat.io/ubi8/ubi:latest(拉取红帽通用基础镜像 UBI8);

    • 查看本地镜像:podman images

三、容器部署全流程

容器部署包含 “镜像获取→容器运行→状态管理→资源配置” 四个核心步骤,以下为详细操作:

(一)镜像获取与自定义构建

  1. 从注册表拉取镜像

    # 搜索镜像(如Python 3.8)
    [root@host-]# podman search registry.access.redhat.com/ubi8/python-38
    # 拉取镜像
    [root@host-]# podman pull registry.access.redhat.com/ubi8/python-38:latest
    
  2. 基于 ContainerFile 构建自定义镜像
    ContainerFile 是构建镜像的文本指令文件,示例如下(构建含 Python 3.6 的镜像):

    # 1. 创建ContainerFile
    [root@host-]# cat ContainerFile
    FROM registry.access.redhat.com/ubi8/ubi:latest  # 基础镜像
    RUN dnf install -y python36  # 安装依赖
    CMD ["/bin/bash", "-c", "sleep infinity"]  # 容器启动命令(防止退出)
    
    # 2. 构建镜像(-t指定名称与标签)
    [root@host-]# podman build -t python36:1.0 .
    # 3. 验证镜像
    [root@host-]# podman images | grep python36
    

(二)容器运行与状态管理

  1. 容器状态:包含 Created(已创建)、Running(运行中)、Stopped(已停止)、Paused(已暂停)四种状态,通过podman ps查看:

    • 查看运行中容器:podman ps

    • 查看所有容器:podman ps -a

  2. 核心运行命令

    # 1. 创建容器但不启动(--name指定名称)
    [root@host-]# podman create --name python36-container python36:1.0
    # 2. 启动容器
    [root@host-]# podman start python36-container
    # 3. 直接创建并启动容器(-d后台运行)
    [root@host-]# podman run -d --name python38-container registry.access.redhat.com/ubi8/python-38 sleep infinity
    # 4. 进入运行中容器(-it交互模式)
    [root@host-]# podman exec -it python38-container /bin/bash
    # 5. 停止与删除容器
    [root@host-]# podman stop python38-container
    [root@host-]# podman rm python38-container
    

四、容器存储与网络配置

默认情况下,容器存储临时(删除容器后数据丢失)、网络隔离(无法与外部通信),需通过配置实现持久化与网络连通:

(一)持久存储配置

通过 “主机目录挂载” 实现容器数据持久化,核心是解决 “权限匹配” 与 “SELinux 上下文” 问题:

  1. 权限匹配:容器内用户 UID/GID 与主机映射不同(如容器内 mysql 用户 UID=27,对应主机 UID=100026),需通过podman unshare调整主机目录权限:

    # 1. 创建主机目录
    [root@host-]# mkdir /home/user/db_data
    # 2. 调整目录权限(匹配容器内mysql用户UID=27)
    [root@host-]# podman unshare chown 27:27 /home/user/db_data
    
  2. 挂载目录与 SELinux 配置
    使用podman run -v挂载目录,添加:z选项自动设置 SELinux 上下文(container_file_t):

    [root@host-]# podman run -d --name mariadb-container \
    -e MYSQL_ROOT_PASSWORD=redhat \  # 环境变量(设置root密码)
    -v /home/user/db_data:/var/lib/mysql:z \  # 挂载目录
    registry.lab.example.com/rhel8/mariadb-105
    

(二)网络配置

  1. 端口映射:将主机端口映射到容器端口,实现外部访问(如主机 13306→容器 3306):

    [root@host-]# podman run -d --name mariadb-container \
    -p 13306:3306 \  # 端口映射
    registry.lab.example.com/rhel8/mariadb-105
    # 查看端口映射
    [root@host-]# podman port mariadb-container
    
  2. 容器间 DNS 通信
    默认网络不支持 DNS,需创建自定义网络实现容器间通过名称通信:

    # 1. 创建支持DNS的网络(db_net)
    [root@host-]# podman network create --subnet 10.87.0.0/16 db_net
    # 2. 运行容器并加入网络
    [root@host-]# podman run -d --name db01 --network db_net registry.lab.example.com/rhel8/mariadb-105
    [root@host-]# podman run -d --name client01 --network db_net registry.access.redhat.com/ubi8/ubi sleep infinity
    # 3. 测试DNS(client01 ping db01)
    [root@host-]# podman exec -it client01 ping -c 3 db01
    

五、容器的 systemd 服务化管理

为确保容器随系统启动自动运行,可将其配置为 systemd 服务,支持 Rootful 与 Rootless 两种模式:

(一)Rootless 容器服务化(普通用户管理)

  1. 创建专用用户

    [root@host-]# useradd appdev-adm
    [root@host-]# passwd appdev-adm  # 设置密码
    
  2. 生成 systemd 服务文件

    # 1. 切换到普通用户(需SSH登录,避免su/sudo)
    [root@host-]# ssh appdev-adm@host-
    # 2. 运行容器(示例:httpd服务)
    [appdev-adm@host-]$ podman run -d --name webserver -p 8080:8080 -v ~/app:/var/www/html:z registry.access.redhat.com/ubi8/httpd-24
    # 3. 生成systemd服务文件(--new表示启动时创建、停止时删除)
    [appdev-adm@host-]$ podman generate systemd --name webserver --new > ~/.config/systemd/user/container-webserver.service
    
  3. 启用服务并设置开机启动

    # 重载配置
    [appdev-adm@host-]$ systemctl --user daemon-reload
    # 启动服务
    [appdev-adm@host-]$ systemctl --user start container-webserver.service
    # 设置开机启动(需开启linger,允许用户无会话时启动服务)
    [appdev-adm@host-]$ loginctl enable-linger
    [appdev-adm@host-]$ systemctl --user enable container-webserver.service
    

(二)Rootful 容器服务化(root 用户管理)

与 Rootless 模式类似,差异在于服务文件路径与命令(无需--user选项):

# 1. 生成服务文件到系统目录
[root@host-]# podman generate systemd --name webserver --new > /etc/systemd/system/container-webserver.service
# 2. 启用并启动服务
[root@host-]# systemctl daemon-reload
[root@host-]# systemctl enable --now container-webserver.service

总结

  1. 工具选型podman用于日常容器管理,skopeo用于镜像元数据检查,buildah用于自定义镜像构建;

  2. 安全最佳实践:优先使用 Rootless 容器,避免 root 权限泄露;挂载目录时添加:z选项,确保 SELinux 上下文正确;

  3. 持久化关键:通过podman unshare调整主机目录权限,匹配容器内用户 UID/GID;

  4. 服务化核心:Rootless 容器需开启loginctl enable-linger,确保系统启动时自动运行;Rootful 容器直接使用系统级 systemd 服务。

    Logo

    码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

    更多推荐