Podman常用命令总结
一、Podman 简介:Docker 的现代替代品
1.1 什么是 Podman?
Podman 是一个开源的容器运行时工具,可在大多数 Linux 平台上使用。它旨在提供与 Docker 相似的功能,但采用了更现代、更安全的架构。
1.2 Podman 与 Docker 的核心区别
| 特性 | Docker | Podman |
|---|---|---|
| 守护进程 | 需要 dockerd 守护进程以 root 权限运行 |
无需守护进程,直接与 OCI 运行时交互 |
| 运行权限 | 通常需要 root 权限 | 支持无根(rootless)模式,普通用户可直接运行 |
| 进程模型 | 复杂:dockerd -> containerd -> containerd-shim -> runc |
简洁:podman -> conmon -> runc |
| 安全性 | root 守护进程存在潜在安全风险 | 无 root 守护进程,安全性更高 |
架构对比图:
Podman 直接调用 OCI 运行时(如 runc),通过 conmon(容器监控器)管理容器进程,无需 dockerd 这类以 root 身份运行的守护进程。
1.3 兼容性
Podman 的命令行接口与 Docker 高度兼容,大多数 Docker 命令可以直接替换为 podman。它支持管理和运行任何符合 OCI(开放容器倡议) 规范的容器和镜像,并能无缝使用 Docker Hub 等镜像仓库。
官网:podman.io
二、安装与基础配置
2.1 安装 Podman
在 CentOS/RHEL 8 及更高版本上,Podman 通常是预装的。如需安装:
1 | sudo yum -y install podman |
2.2 配置镜像仓库与加速器
编辑配置文件 /etc/containers/registries.conf:
1 | # 设置镜像搜索源 |
2.3 配置存储驱动(推荐 fuse-overlayfs)
编辑 /etc/containers/storage.conf,确保普通用户模式性能更佳:
1 | [storage] |
三、Podman 常用命令速查
Podman 命令与 Docker 命令高度相似,以下是对照表:
3.1 容器生命周期管理
| 功能 | Docker 命令 | Podman 命令 |
|---|---|---|
| 创建并运行容器 | docker run |
podman run |
| 启动已停止容器 | docker start |
podman start |
| 停止运行中容器 | docker stop |
podman stop |
| 重启容器 | docker restart |
podman restart |
| 终止容器 | docker kill |
podman kill |
| 删除容器 | docker rm |
podman rm |
| 列出容器 | docker ps |
podman ps |
3.2 镜像管理
| 功能 | Docker 命令 | Podman 命令 |
|---|---|---|
| 拉取镜像 | docker pull |
podman pull |
| 列出镜像 | docker images |
podman images |
| 删除镜像 | docker rmi |
podman rmi |
| 构建镜像 | docker build |
podman build |
| 导出镜像 | docker save |
podman save |
| 导入镜像 | docker load |
podman load |
3.3 容器交互与诊断
| 功能 | Docker 命令 | Podman 命令 |
|---|---|---|
| 进入容器 | docker exec |
podman exec |
| 查看日志 | docker logs |
podman logs |
| 检查容器 | docker inspect |
podman inspect |
| 查看进程 | docker top |
podman top |
| 复制文件 | docker cp |
podman cp |
便捷参数:许多命令支持 --latest 或 -l 参数来操作最近创建的容器,避免输入冗长的容器ID。
四、实战操作示例
4.1 运行一个 Web 服务器容器
1 | # 拉取并运行 Apache httpd 容器 |
4.2 构建自定义镜像
- 准备 Dockerfile:
1
2
3FROM docker.io/library/centos:7
RUN yum -y install nginx && yum clean all
CMD ["nginx", "-g", "daemon off;"] - 构建镜像:
1
podman build -t my-nginx:latest .
4.3 推送镜像到仓库
1 | # 1. 为镜像打标签 |
五、高级配置:Rootless(无根)模式
Podman 的核心优势之一是支持普通用户无需 sudo 即可运行容器。
5.1 系统级前提配置
管理员需要在主机上完成以下配置:
安装必要软件:
1
sudo yum -y install slirp4netns fuse-overlayfs shadow-utils
配置用户子UID/GID:
Podman 要求用户在/etc/subuid和/etc/subgid文件中拥有唯一的 UID/GID 范围。1
2
3
4
5
6# 查看现有分配
cat /etc/subuid
cat /etc/subgid
# 为用户 `tom` 分配 UID/GID 范围(管理员操作)
sudo usermod --add-subuids 100000-165535 --add-subgids 100000-165535 tom文件格式为:
用户名:起始UID:数量调整内核参数(允许绑定低端口):
1
2
3
4
5
6# 允许非特权用户绑定 80 及以上端口
echo 'net.ipv4.ip_unprivileged_port_start=80' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
# 允许非特权用户使用 ping(ICMP)
sudo sysctl -w "net.ipv4.ping_group_range=0 2000000"
5.2 用户级配置
普通用户 tom 登录后,可以创建个人配置文件 ~/.config/containers/ 来覆盖系统默认设置。
5.3 Rootless 模式下的卷挂载
在 rootless 模式下挂载卷时,容器内的文件属主会映射到主机用户的子UID。使用 --userns=keep-id 选项可以让容器内的进程以与主机用户相同的 UID 运行,简化文件权限管理。
1 | # 1. 创建数据目录 |
5.4 Rootless 模式下的端口映射
- 默认:非特权用户只能映射 1024 及以上 的端口。
- 配置后:通过修改
net.ipv4.ip_unprivileged_port_start=80,可以映射 80 及以上 的端口。1
2
3
4
5# 映射 8080 端口(始终允许)
podman run -d -p 8080:80 docker.io/library/httpd
# 映射 80 端口(需上述内核配置)
podman run -d -p 80:80 docker.io/library/httpd
六、故障排除与技巧
6.1 设置命令别名
如果习惯 Docker 命令,可以为 Podman 设置别名实现无缝切换:
1 | echo "alias docker=podman" >> ~/.bashrc |
现在,你可以继续使用 docker 命令,但实际上调用的是 podman。
6.2 用户镜像隔离
Root 用户和普通用户拥有独立的镜像和容器存储空间,互不可见。
1 | # root 用户查看 |
6.3 查看容器进程树
利用 Podman 简洁的进程模型进行调试:
1 | # 查看容器相关进程 |
七、总结
Podman 作为 Docker 的现代替代品,凭借其无需守护进程、原生支持 Rootless 模式和与 Docker CLI 高度兼容的特性,为容器运行提供了更安全、更灵活的解决方案。
迁移建议:
- 对于新项目或新环境,优先考虑 Podman。
- 对于现有 Docker 用户,可以通过设置别名
alias docker=podman平滑过渡。 - 充分利用 Rootless 模式 提升安全性,特别是在多用户环境或 CI/CD 流水线中。
通过掌握 Podman 的核心概念、命令和配置,你可以在享受容器技术便利的同时,构建更安全、更高效的容器化工作流。