进阶实战:Podman 探索
在 RHEL 8 和 Fedora 之后,Podman 取代了 Docker 成为红帽系的默认容器引擎。它最大的口号是:“如果你会 Docker,那你已经会了 Podman”。
1. 为什么选择 Podman?
视图分类:
架构差异
- Docker: 依赖一个巨大的 Root 权限守护进程 (Daemon)。一旦守护进程挂了,所有容器都会死掉。
- Podman: 无守护进程 (Daemonless)。容器直接通过 Linux 子进程启动,互不影响。
安全性:Rootless 模式
Podman 允许普通用户无需 sudo、无需加入任何组即可运行容器。即便容器被黑,攻击者也只能获得普通用户权限,无法破坏宿主机。
K8s 亲和性
Podman 支持通过一个简单的命令生成 Kubernetes 兼容的 YAML 文件。
2. 丝滑切换:Alias 技巧
由于 Podman 的命令参数与 Docker 几乎 100% 兼容,你完全可以进行“无痛迁移”:
# 在 .zshrc 或 .bashrc 中加入
alias docker=podman3. Podman 的核心特性
3.1 Pod (容器组) 概念
Podman 引入了 Kubernetes 的 Pod 概念。你可以将多个相关的容器放在同一个 Pod 中,它们共享同一个 IP(localhost 互通)。
▶ 实操:创建一个 Pod 并运行服务
# 1. 创建 Pod
podman pod create --name my-app-stack -p 8080:80
# 2. 向 Pod 中添加 Nginx
podman run -d --pod my-app-stack --name web nginx
# 3. 查看 Pod 状态
podman pod ps3.2 自动启动:生成 Systemd 服务
Podman 可以将容器直接转换为系统服务,实现开机自启。
podman generate systemd --name web --files --new4. 常见坑点
| 痛点 | 原因 | 解决方法 |
|---|---|---|
| 无法绑定 80 端口 | Rootless 模式无法绑定 1024 以下端口 | 使用 8080 端口,或修改 net.ipv4.ip_unprivileged_port_start |
| 拉取镜像慢 | 默认优先拉取 Quay.io | 修改 /etc/containers/registries.conf |
5. 结业练习
任务 1 模式切换
在 Fedora 系统中尝试使用 podman run 运行一个镜像,观察是否需要 sudo 权限。
练习 2 生成 YAML
运行一个复杂的容器,然后使用 podman generate kube <container_id> 看看生成的 K8s 配置文件长什么样。
练习 3 镜像迁移
了解 skopeo 工具。如何直接在两个镜像仓库(如 Docker Hub 和私有仓库)之间迁移镜像而无需下载到本地?
Tip
对于关注安全性的服务器运维人员,Podman + Rootless 是目前容器化的最优解。