Linux

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 / VMwarePodman / 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(速查)

操作PodmanDocker
看镜像podman imagesdocker images
后台跑podman run -ddocker run -d
看容器podman psdocker ps
进入运行中容器podman exec -it 名 bashdocker exec -it 名 bash
停/删podman stop/rmdocker stop/rm
拉镜像podman pulldocker 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 能看到 nginx
  • podman 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,只换域名端口,命令结构相同。

小结

  1. 镜像是模板,容器是实例;先 pull 再 run。
  2. 交互用 -it,服务用 -d;管理用 ps / stop / rm。
  3. 宿主机目录进容器用 -v,RHEL 上通常加 :Z。
  4. 考试先确认 内网 registry 与 podman login,再 pull。

系列第二部分(存储与服务)到此收尾。下一篇进入 Ansible:在 control 节点批量管机器。


系列导航:总目录 · 上一篇:httpd 与 SELinux · 下一篇:Ansible 快速上手

相关阅读

全部文章 →
← 返回列表更多「Linux」