Podman 容器
RHEL 9 用 Podman 拉镜像、跑容器、挂目录,并处理 SELinux 的 :Z;附与 Docker 命令对照。
本页目录
容器是「轻量虚拟机」:不像 VMware 那样完整装一台系统,而是直接跑一个进程和它需要的环境。RHEL 9 考试与日常更常用 Podman(命令和 Docker 几乎一样,但默认无守护进程)。
系列:从 RHCSA 到 RHCE · 第 13 / 17 篇 上一篇:httpd 与 SELinux 下一篇:Ansible 快速上手 总目录:系列索引
环境说明
- 系统:RHEL 9
- 身份:建议用普通用户跑 Podman(rootless);部分操作也可 root
- 网络:公网实验可访问 docker.io / quay.io;考试通常是内网 registry
- 前置:基础命令、用户权限;SELinux 概念见 httpd 与 SELinux
1. 容器和虚拟机差在哪
| 虚拟机 | 容器 | |
|---|---|---|
| 启动的东西 | 整套 OS + 内核 | 应用进程 + 依赖库 |
| 体积 | 常常几个 GB | 常常几十~几百 MB |
| 隔离 | 更强 | 共享宿主机内核,较轻 |
| 典型工具 | KVM / VMware | Podman / Docker |
一句话:虚拟机像整栋房子,容器像拎包入住的房间。
2. 安装 Podman
dnf -y install podman
podman version
podman info | head
3. 镜像仓库:到哪里下载
「镜像」是容器的安装包模板;「容器」是按镜像跑起来的实例。
公网(自学)
不改配置时,Podman 会去公共仓库找镜像(如 docker.io/library/nginx)。
考试 / 内网(常见)
考场会提供内网 registry,例如:
registry.lab.example.com:5000
配置文件(RHEL 9 推荐写 drop-in,避免和主配置格式混在一起):
vim /etc/containers/registries.conf.d/exam.conf
内容示例(地址、端口以题面为准):
unqualified-search-registries = ['registry.lab.example.com:5000']
[[registry]]
location = 'registry.lab.example.com:5000'
insecure = true
| 配置项 | 含义 |
|---|---|
| unqualified-search-registries | 写 nginx 这类不完整名字时,去哪里搜 |
| location | 仓库地址 |
| insecure = true | 允许 HTTP / 非权威证书(考场常见) |
说明:旧教程里的
[registries.search]/[registries.insecure]属于 V1 写法,RHEL 9 仍可能认,但新环境请优先上面的 V2 +registries.conf.d。 练习环境:课堂机往往已经配好,考试也常预置;配错时能看懂即可。
4. 登录、搜索、下载镜像
podman images # 本地已有镜像(刚装时多半为空)
podman search nginx # 搜索(公网常见;内网源可能受限)
考试常见:先登录内网仓库。
podman login registry.lab.example.com:5000
# Username: (题面给的,或回车)
# Password: (题面给的,或回车)
拉取镜像:
# 公网示例
podman pull docker.io/library/nginx
# 内网示例(路径以题面为准)
podman pull registry.lab.example.com:5000/library/nginx
查看:
podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.lab.example.com:5000/library/nginx latest 4bb46517cac3 ... 137 MB
易错:仓库地址、路径写错 → pull 失败。先
podman login成功再 pull。 易错:考试无公网却按公网教程拉docker.io,会超时。
5. 跑第一个容器
交互进入(适合「进容器里看看」)
podman run -it nginx bash
| 选项 | 含义 |
|---|---|
| -i | 保持标准输入打开 interactive |
| -t | 分配伪终端 terminal |
| 合起来 -it | 像 SSH 一样进容器 shell |
进去后:
ls /
cat /etc/os-release
exit
exit 后容器通常也就结束了(前台进程退出)。
后台跑(适合当服务)
podman run -d --name myweb nginx
| 选项 | 含义 |
|---|---|
| -d | 放后台 detached |
| --name myweb | 给容器起名(不写则随机名) |
若还要从宿主机浏览器/curl 访问容器里的 80 端口,需要再加端口映射,例如:
podman run -d --name myweb -p 8080:80 nginx
curl http://127.0.0.1:8080/
-p 宿主机端口:容器端口。本篇后面目录挂载实验不强制加 -p,用 podman exec 验证即可。
podman ps # 正在跑的容器
podman ps -a # 所有容器(含已退出)
停止 / 删除:
podman stop myweb
podman ps -a
podman rm myweb
也可以用容器 ID 前缀(podman ps 第一列):
podman stop 9f9c
podman rm 9f9c
6. 把宿主机目录挂进容器
场景:改宿主机上的网页文件,容器里立刻能看到。
mkdir -p ~/webdata
echo 'hello from host' > ~/webdata/index.html
podman run -d --name web2 \
-v /home/你的用户名/webdata:/usr/share/nginx/html:Z \
nginx
| 部分 | 含义 |
|---|---|
| -v 宿主机路径:容器路径 | 目录映射 |
| :Z | 让 SELinux 重新打标签,容器进程可访问(RHEL 必懂) |
查看并验证:
podman ps
podman exec web2 cat /usr/share/nginx/html/index.html
# 或在宿主机:
cat ~/webdata/index.html
改宿主机文件再看:
echo 'v2' >> ~/webdata/index.html
podman exec web2 cat /usr/share/nginx/html/index.html
为什么需要 :Z
RHEL 默认 SELinux 开启。宿主机目录标签可能不允许容器进程读取,导致挂载后容器里看不到文件或报权限错误。:Z 会给该挂载打上容器可访问的私有标签。
考点:RHEL 上
-v常要加:Z(或题面指定的:z共享标签)。 易错:只写-v 路径:路径不加:Z,在 Enforcing 下访问失败。
7. Podman vs Docker(速查)
| 操作 | Podman | Docker |
|---|---|---|
| 看镜像 | podman images | docker images |
| 后台跑 | podman run -d | docker run -d |
| 看容器 | podman ps | docker ps |
| 进入运行中容器 | podman exec -it 名 bash | docker exec -it 名 bash |
| 停/删 | podman stop/rm | docker stop/rm |
| 拉镜像 | podman pull | docker pull |
差异点(了解即可):
- Podman 默认 rootless(普通用户即可跑),无常驻 daemon
- 命令行几乎兼容 Docker,学习资料可互用
- 部分编排/网络细节不同;考试以 Podman 题面为准
8. 推荐完整练习(约 25 分钟)
公网机器:
dnf -y install podman
podman pull docker.io/library/nginx
podman images
podman run -d --name lab-web nginx
podman ps
podman exec lab-web nginx -v
podman stop lab-web
podman rm lab-web
podman ps -a
mkdir -p ~/webdata
echo 'hello from host' > ~/webdata/index.html
podman run -d --name lab-vol \
-v $HOME/webdata:/usr/share/nginx/html:Z \
nginx
podman exec lab-vol cat /usr/share/nginx/html/index.html
考试/内网: 把 pull 地址换成题面 registry,先 podman login。
期望
podman images能看到 nginxpodman ps有 lab-web- 挂载后
cat能看到宿主机写的hello from host
9. 速查表
| 目标 | 命令 |
|---|---|
| 安装 | dnf -y install podman |
| 配仓库 | /etc/containers/registries.conf |
| 登录 | podman login 仓库地址 |
| 拉镜像 | podman pull 镜像 |
| 看镜像/容器 | podman images / podman ps / podman ps -a |
| 后台运行 | podman run -d --name 名 镜像 |
| 交互进入 | podman run -it 镜像 bash |
| 进入已运行容器 | podman exec -it 名 bash |
| 停止/删除 | podman stop 名 / podman rm 名 |
| 挂目录 | -v 宿主机:容器:Z |
考点与易错
考点:login → pull →
run -d→ps;卷挂载加:Z。 易错:考试用公网地址 pull,超时失败。 易错:忘记--name,后面 stop/rm 不知道叫什么(用podman ps看随机名或 ID)。 易错:SELinux 下卷挂载不加:Z。 易错:podman run -it里exit后以为容器还在——前台容器会随主进程退出;服务用-d。 练习环境:课堂 registry 若是registry.lab.example.com:5000,只换域名端口,命令结构相同。
小结
- 镜像是模板,容器是实例;先
pull再run。 - 交互用
-it,服务用-d;管理用ps/stop/rm。 - 宿主机目录进容器用
-v,RHEL 上通常加:Z。 - 考试先确认 内网 registry 与
podman login,再 pull。
系列第二部分(存储与服务)到此收尾。下一篇进入 Ansible:在 control 节点批量管机器。
系列导航:总目录 · 上一篇:httpd 与 SELinux · 下一篇:Ansible 快速上手