Linux 系统容器运行
在红帽企业 Linux 9.0(RHEL 9.0)系统中,容器技术是实现应用轻量化部署、环境隔离与资源高效利用的核心方案。
一、容器核心概念与技术原理
容器是 “与系统其他部分隔离的进程集合”,通过 Linux 内核技术实现资源隔离与限制,解决传统应用依赖冲突、部署复杂的问题,其核心特性与技术支撑如下:
(一)容器技术核心支撑
RHEL 9.0 通过三类内核技术构建容器隔离环境,确保容器间互不干扰:
-
Control Groups(cgroups):限制容器的资源使用(如 CPU、内存、磁盘 I/O),避免单个容器占用过多主机资源;
-
Namespaces:实现进程、网络、文件系统等资源的隔离(如容器内进程仅可见自身进程,无法访问主机或其他容器进程);
-
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
(二)容器镜像与注册表
-
镜像本质:容器镜像是不可修改的 “应用蓝图”,包含应用及其依赖(系统库、运行时、配置文件),以分层方式存储(每一层对应构建指令,可复用);
-
注册表(Registry):存储镜像的仓库,分为公有与私有两类:
-
公有注册表:红帽官方
registry.redhat.io(提供认证镜像)、docker.io(通用镜像); -
私有注册表:企业自建的 Red Hat Quay 或 Harbor,用于内部镜像管理;
-
-
镜像拉取与认证:
-
拉取红帽官方镜像需先登录:
podman login registry.redhat.io(输入红帽账号密码); -
拉取镜像:
podman pull registry.redhat.io/ubi8/ubi:latest(拉取红帽通用基础镜像 UBI8); -
查看本地镜像:
podman images。
-
三、容器部署全流程
容器部署包含 “镜像获取→容器运行→状态管理→资源配置” 四个核心步骤,以下为详细操作:
(一)镜像获取与自定义构建
-
从注册表拉取镜像:
# 搜索镜像(如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 -
基于 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
(二)容器运行与状态管理
-
容器状态:包含 Created(已创建)、Running(运行中)、Stopped(已停止)、Paused(已暂停)四种状态,通过
podman ps查看:-
查看运行中容器:
podman ps; -
查看所有容器:
podman ps -a。
-
-
核心运行命令:
# 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 上下文” 问题:
-
权限匹配:容器内用户 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 -
挂载目录与 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
(二)网络配置
-
端口映射:将主机端口映射到容器端口,实现外部访问(如主机 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 -
容器间 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 容器服务化(普通用户管理)
-
创建专用用户:
[root@host-]# useradd appdev-adm [root@host-]# passwd appdev-adm # 设置密码 -
生成 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 -
启用服务并设置开机启动:
# 重载配置 [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
总结
工具选型:
podman用于日常容器管理,skopeo用于镜像元数据检查,buildah用于自定义镜像构建;安全最佳实践:优先使用 Rootless 容器,避免 root 权限泄露;挂载目录时添加
:z选项,确保 SELinux 上下文正确;持久化关键:通过
podman unshare调整主机目录权限,匹配容器内用户 UID/GID;服务化核心:Rootless 容器需开启
loginctl enable-linger,确保系统启动时自动运行;Rootful 容器直接使用系统级 systemd 服务。
更多推荐




所有评论(0)