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
4
5
6
7
8
9
10
11
# 设置镜像搜索源
[registries.search]
registries = ['docker.io']

# 设置非安全仓库(如内网HTTP Harbor)
[registries.insecure]
registries = ['10.0.0.1']

# 配置镜像加速器(如阿里云)
[registries.search]
registries = ['https://l9h8fu9j.mirror.aliyuncs.com', 'docker.io']

2.3 配置存储驱动(推荐 fuse-overlayfs)

编辑 /etc/containers/storage.conf,确保普通用户模式性能更佳:

1
2
3
[storage]
driver = "overlay"
mount_program = "/usr/bin/fuse-overlayfs" # 取消注释此行

三、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
2
3
4
5
6
7
8
9
10
11
12
13
# 拉取并运行 Apache httpd 容器
podman run -d --name my_httpd docker.io/library/httpd

# 查看运行中的容器
podman ps
# CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 0492e405b9ec docker.io/library/httpd:latest httpd-foreground 2 minutes ago Up 2 minutes my_httpd

# 获取容器的 IP 地址并访问
podman inspect my_httpd | grep IPAddress
# “IPAddress”: “10.88.0.5”
curl 10.88.0.5
# It works!

4.2 构建自定义镜像

  1. 准备 Dockerfile
    1
    2
    3
    FROM docker.io/library/centos:7
    RUN yum -y install nginx && yum clean all
    CMD ["nginx", "-g", "daemon off;"]
  2. 构建镜像
    1
    podman build -t my-nginx:latest .

4.3 推送镜像到仓库

1
2
3
4
5
6
7
8
9
10
# 1. 为镜像打标签
podman tag my-nginx:latest docker.io/yourusername/my-nginx:latest

# 2. 登录 Docker Hub
podman login docker.io
# Username: yourusername
# Password: *******

# 3. 推送镜像
podman push docker.io/yourusername/my-nginx:latest

五、高级配置:Rootless(无根)模式

Podman 的核心优势之一是支持普通用户无需 sudo 即可运行容器。

5.1 系统级前提配置

管理员需要在主机上完成以下配置:

  1. 安装必要软件

    1
    sudo yum -y install slirp4netns fuse-overlayfs shadow-utils
  2. 配置用户子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:数量

  3. 调整内核参数(允许绑定低端口)

    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
2
3
4
5
6
7
# 1. 创建数据目录
mkdir ~/data

# 2. 运行容器并挂载卷(使用 keep-id 保持用户ID一致)
podman run -it -v "$HOME/data:/data" --userns=keep-id docker.io/library/busybox /bin/sh

# 在容器内创建的文件,在主机上查看属主将是 `tom` 用户

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
2
echo "alias docker=podman" >> ~/.bashrc
source ~/.bashrc

现在,你可以继续使用 docker 命令,但实际上调用的是 podman

6.2 用户镜像隔离

Root 用户和普通用户拥有独立的镜像和容器存储空间,互不可见。

1
2
3
4
5
6
# root 用户查看
sudo podman images

# 普通用户 tom 查看
podman images
# 输出为空,除非 tom 自己拉取或构建过镜像

6.3 查看容器进程树

利用 Podman 简洁的进程模型进行调试:

1
2
3
4
# 查看容器相关进程
pstree -p | grep -A 5 -B 5 podman
# 或
podman top <容器名>

七、总结

Podman 作为 Docker 的现代替代品,凭借其无需守护进程原生支持 Rootless 模式与 Docker CLI 高度兼容的特性,为容器运行提供了更安全、更灵活的解决方案。

迁移建议

  1. 对于新项目或新环境,优先考虑 Podman
  2. 对于现有 Docker 用户,可以通过设置别名 alias docker=podman 平滑过渡。
  3. 充分利用 Rootless 模式 提升安全性,特别是在多用户环境或 CI/CD 流水线中。

通过掌握 Podman 的核心概念、命令和配置,你可以在享受容器技术便利的同时,构建更安全、更高效的容器化工作流。