Podman 操作命令完全指南:镜像、容器、网络、卷、日志全解析

以下是一份系统性、结构清晰、深度详尽、面向实战的《Podman 操作命令完全指南》,专为 Fedora Workstation 42 用户Java 后端开发者设计,全面覆盖 Podman 所有核心命令,按功能模块分类组织,并与 Docker 命令逐一对比,确保你不仅“会用”,更能“理解差异、迁移无缝、安全高效”。


📘 Podman 操作命令完全指南:镜像、容器、网络、卷、日志全解析

适用对象:Fedora Workstation 42 用户、Java 后端开发者(Spring Boot、Maven、PostgreSQL)
目标:掌握 Podman 所有核心命令,实现从 Docker 到 Podman 的平滑迁移,构建安全、高效、可维护的本地开发环境
结构:按功能模块分类,每条命令含语法、作用、参数详解、实战示例、Docker 对比、开发建议


🧩 总览:Podman 命令分类体系

模块功能关键命令
1. 镜像管理拉取、构建、查看、删除镜像podman pull, podman images, podman build, podman rmi
2. 容器生命周期管理创建、启动、停止、删除容器podman run, podman start, podman stop, podman rm, podman ps
3. Pod 管理创建和管理容器组(K8s Pod 模型)podman pod create, podman pod start, podman pod rm
4. 网络管理创建、查看、连接网络podman network create, podman network ls, podman network inspect
5. 数据卷管理持久化存储数据(如数据库、配置)podman volume create, podman volume ls, podman volume rm
6. 日志与检查查看容器日志、元数据、资源使用podman logs, podman inspect, podman top, podman stats
7. 容器交互与调试进入容器、执行命令、复制文件podman exec, podman cp
8. 系统级管理清理、信息查看、服务生成podman system df, podman system prune, podman generate systemd
9. 镜像构建(Buildah 集成)使用 Buildah 构建更灵活的镜像buildah from, buildah run, buildah commit
10. 镜像传输与安全(Skopeo 集成)跨仓库复制、验证签名skopeo copy, cosign verify

提示:所有 Podman 命令无需 sudo(默认 rootless),除非你主动启用 rootful 模式。


1. 镜像管理(Image Management)

podman images —— 列出本地镜像

podman images [OPTIONS] [REPOSITORY[:TAG]]
参数说明
-a, --all显示所有镜像(包括中间层)
-q, --quiet只显示镜像 ID
--digests显示镜像摘要(digest)
--no-trunc不截断长字段
📌 实战示例:
# 列出所有镜像(含中间层)
podman images -a

# 只看 PostgreSQL 镜像
podman images postgres

# 只显示 ID 和标签
podman images -q --no-trunc
🔁 Docker 对比:
docker images                    # 等价
docker images -a                 # 等价
docker images --digests          # 等价

开发建议:定期清理无用镜像,节省磁盘空间。使用 podman image prune(见第8节)。


podman pull —— 从远程仓库拉取镜像

podman pull [OPTIONS] IMAGE[:TAG|@DIGEST]
参数说明
--authfile PATH指定认证文件(如登录私有仓库)
--platform指定架构(如 linux/amd64, linux/arm64
--tls-verify=false跳过 TLS 验证(仅测试用)
📌 实战示例(Java 开发者常用):
# 从阿里云加速拉取(推荐)
podman pull registry.aliyuncs.com/library/postgres:16

# 拉取特定架构(适用于 Apple Silicon / ARM64)
podman pull --platform linux/arm64 registry.aliyuncs.com/library/openjdk:17-jre-slim

# 拉取带 digest 的精确版本(生产推荐)
podman pull nginx@sha256:abc123...def456
🔁 Docker 对比:
docker pull postgres:16                  # 等价
docker pull --platform linux/arm64 ...   # 等价

开发建议

  • 始终使用 registry.aliyuncs.com 替代 docker.io,加速拉取。
  • 生产环境使用 digest(哈希值)锁定镜像版本,避免意外升级。

podman build —— 使用 Dockerfile 构建镜像

podman build [OPTIONS] PATH | URL | -
参数说明
-t, --tag指定镜像名称和标签
-f, --file指定 Dockerfile 路径
--no-cache不使用缓存,强制重新构建
--platform指定目标架构
--squash将所有层合并为单层(减小体积)
📌 实战示例(Java Spring Boot 应用):
# 在项目根目录下执行(假设 Dockerfile 在当前目录)
podman build -t insurance-app:latest .

# 使用自定义 Dockerfile
podman build -f ./docker/Dockerfile.prod -t insurance-app:prod .

# 不使用缓存,强制重建(调试依赖问题时)
podman build --no-cache -t myapp:debug .
📄 示例 Dockerfile(优化版):
# 多阶段构建:构建阶段与运行阶段分离
FROM registry.aliyuncs.com/library/maven:3.9-openjdk-17 AS builder
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn package -DskipTests

# 运行阶段:极小镜像
FROM registry.aliyuncs.com/library/openjdk:17-jre-slim
WORKDIR /app
COPY --from=builder /app/target/app.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
🔁 Docker 对比:
docker build -t myapp .     # 完全一致
docker build --no-cache ... # 完全一致

开发建议

  • 使用多阶段构建,避免将 Maven、JDK 等构建工具打包进最终镜像。
  • 优先使用 registry.aliyuncs.com 基础镜像,提升构建速度。
  • 避免在容器内执行 mvn package —— 构建应在宿主机完成,容器仅运行。

podman rmi —— 删除镜像

podman rmi [OPTIONS] IMAGE...
参数说明
-f, --force强制删除(即使有容器依赖)
📌 实战示例:
# 删除单个镜像
podman rmi insurance-app:latest

# 删除多个镜像
podman rmi postgres:16 redis:7-alpine

# 删除所有未被使用的镜像(推荐)
podman image prune

# 删除所有镜像(慎用!)
podman rmi $(podman images -q)
🔁 Docker 对比:
docker rmi myapp:latest         # 等价
docker image prune              # 等价
docker rmi $(docker images -aq) # 等价

开发建议

  • 每周执行 podman image prune 清理无用镜像。
  • 使用 podman images --filter "dangling=true" 查看悬空镜像(中间层)。

2. 容器生命周期管理(Container Lifecycle)

podman run —— 创建并启动容器(最核心命令)

podman run [OPTIONS] IMAGE [COMMAND] [ARG...]
参数说明实战示例
-d, --detach后台运行podman run -d nginx
-p, --publish端口映射-p 8080:80
-v, --volume挂载卷-v ./config:/app/config
-e, --env设置环境变量-e SPRING_PROFILES_ACTIVE=dev
--name指定容器名--name myapp
--rm容器停止后自动删除podman run --rm alpine echo "hello"
--network指定网络--network mynet
--restart重启策略--restart unless-stopped
--user指定用户(rootless 默认)--user 1000
--platform指定架构--platform linux/arm64
📌 实战示例(Java 开发者典型场景):
# 启动 PostgreSQL(带持久化卷、环境变量)
podman run -d \
  --name postgres \
  -p 5432:5432 \
  -v pgdata:/var/lib/postgresql/data \
  -e POSTGRES_DB=insurance \
  -e POSTGRES_USER=dev \
  -e POSTGRES_PASSWORD=dev123 \
  registry.aliyuncs.com/library/postgres:16

# 启动 Redis
podman run -d \
  --name redis \
  -p 6379:6379 \
  -v redisdata:/data \
  registry.aliyuncs.com/library/redis:7-alpine

# 启动 Spring Boot 应用(挂载本地 JAR)
podman run -d \
  --name insurance-app \
  -p 8080:8080 \
  -e SPRING_PROFILES_ACTIVE=dev \
  -v $HOME/myapp/target/app.jar:/app.jar \
  registry.aliyuncs.com/library/openjdk:17-jre-slim \
  java -jar /app.jar

# 临时运行并自动删除(测试)
podman run --rm -it alpine sh
🔁 Docker 对比:
docker run -d -p 8080:8080 ...   # 完全一致
docker run --rm -it alpine sh    # 完全一致

开发建议

  • 始终使用 --name,避免使用随机容器名。
  • 生产环境使用 --restart unless-stopped,确保服务自愈。
  • 避免使用 --privileged,Podman 的 rootless 模式已足够安全。

podman ps —— 查看运行中的容器

podman ps [OPTIONS]
参数说明
-a, --all显示所有容器(包括已停止)
-q, --quiet只显示容器 ID
--no-trunc显示完整 ID
--filter过滤(如 status=running
📌 实战示例:
# 查看所有容器(含停止的)
podman ps -a

# 只看正在运行的
podman ps

# 查看特定名称的容器
podman ps --filter "name=postgres"

# 只显示 ID(用于脚本)
podman ps -q
🔁 Docker 对比:
docker ps           # 等价
docker ps -a        # 等价
docker ps -q        # 等价

podman start / podman stop / podman restart —— 控制容器状态

podman start CONTAINER...
podman stop [OPTIONS] CONTAINER...
podman restart CONTAINER...
参数(stop)说明
-t, --time停止前等待秒数(默认 10)
📌 实战示例:
# 启动已停止的容器
podman start postgres

# 停止容器(等待15秒后强制杀)
podman stop -t 15 postgres

# 重启
podman restart redis
🔁 Docker 对比:
docker start postgres   # 等价
docker stop -t 15 ...   # 等价
docker restart redis    # 等价

podman rm —— 删除容器

podman rm [OPTIONS] CONTAINER...
参数说明
-f, --force强制删除运行中的容器
📌 实战示例:
# 删除单个容器
podman rm myapp

# 删除多个
podman rm postgres redis

# 删除所有已停止的容器(推荐)
podman container prune

# 删除所有容器(慎用!)
podman rm $(podman ps -aq)
🔁 Docker 对比:
docker rm myapp          # 等价
docker container prune   # 等价

开发建议

  • 使用 --rm 启动临时容器,避免残留。
  • 定期执行 podman container prune 清理无用容器。

3. Pod 管理(Pod —— 容器组)

Pod 是 Podman 的核心进阶特性,模拟 Kubernetes 中的“一组共享网络的容器”,用于本地开发微服务组合。

podman pod create —— 创建 Pod

podman pod create [OPTIONS] [NAME]
参数说明
-p, --publish映射端口到 Pod(非容器)
--name指定 Pod 名称
📌 实战示例:创建一个包含 Java 应用 + Nginx 的 Pod
# 创建 Pod,暴露 8080 端口
podman pod create --name myapp-pod -p 8080:8080

# 在 Pod 中启动 Java 应用
podman run -d \
  --pod=myapp-pod \
  --name java-app \
  -v $HOME/myapp/target/app.jar:/app.jar \
  registry.aliyuncs.com/library/openjdk:17-jre-slim \
  java -jar /app.jar

# 在 Pod 中启动 Nginx(反向代理)
podman run -d \
  --pod=myapp-pod \
  --name nginx \
  -v $HOME/myapp/nginx.conf:/etc/nginx/nginx.conf:Z \
  registry.aliyuncs.com/library/nginx:alpine

💡 关键点

  • 所有容器共享同一个 IP、端口空间。
  • nginx 可通过 localhost:8080 访问 java-app,无需端口映射。

podman pod start / podman pod stop / podman pod rm

podman pod start myapp-pod
podman pod stop myapp-pod
podman pod rm myapp-pod
🔁 Docker 对比:

Docker 无原生 Pod 概念,需用 docker-compose 模拟。

开发建议

  • 所有本地微服务组合(Spring Boot + Redis + Nginx + Logstash)都应放在一个 Pod 中,模拟生产环境。
  • 使用 podman pod inspect myapp-pod 查看网络配置。

4. 网络管理(Network Management)

podman network create —— 创建自定义网络

podman network create [OPTIONS] NAME
参数说明
--driver驱动类型(默认 bridge
--subnet指定子网
--gateway指定网关
📌 实战示例:
# 创建私有网络
podman network create myapp-net

# 启动容器加入该网络
podman run -d \
  --name postgres \
  --network myapp-net \
  -e POSTGRES_DB=insurance \
  registry.aliyuncs.com/library/postgres:16

podman run -d \
  --name java-app \
  --network myapp-net \
  -v app.jar:/app.jar \
  openjdk:17-jre-slim \
  java -jar /app.jar

关键优势

  • java-app 可通过 postgres:5432 直接访问数据库,无需端口映射。
  • 网络隔离,避免端口冲突。

podman network ls / podman network inspect

podman network ls
podman network inspect myapp-net
🔁 Docker 对比:
docker network ls             # 等价
docker network inspect ...    # 等价

开发建议

  • 每个项目创建独立网络,避免不同项目间服务互相干扰。
  • 使用 podman network rm myapp-net 清理不再使用的网络。

5. 数据卷管理(Volume Management)

卷(Volume) 是 Podman 中用于持久化数据的机制,推荐用于数据库、配置文件、日志等。

podman volume create —— 创建卷

podman volume create [OPTIONS] [VOLUME_NAME]
📌 实战示例:
# 创建卷(推荐命名清晰)
podman volume create pgdata
podman volume create redisdata
podman volume create app-config

# 查看所有卷
podman volume ls

✅ 挂载卷到容器

podman run -d \
  -v pgdata:/var/lib/postgresql/data \
  postgres:16

关键区别

  • podman volumePodman 管理的持久化存储(推荐)
  • bind mount-v /host/path:/container/path(宿主机路径挂载,用于开发调试)
📌 实战建议:
场景推荐方式
数据库持久化podman volume create pgdata-v pgdata:/data
配置文件开发-v ./config:/app/config(bind mount)
日志输出-v logs:/app/logs(volume)

podman volume rm / podman volume prune

podman volume rm pgdata
podman volume prune     # 删除所有未使用的卷
🔁 Docker 对比:
docker volume create ...      # 等价
docker volume prune           # 等价

开发建议

  • 永远不要将数据库数据挂载到宿主机目录(权限、路径、SELinux 问题)。
  • 使用命名卷,便于迁移和备份。

6. 日志与检查(Logging & Inspection)

podman logs —— 查看容器日志

podman logs [OPTIONS] CONTAINER
参数说明
-f, --follow实时追踪日志
-t, --timestamps显示时间戳
--tail N显示最后 N 行
📌 实战示例(Java 应用调试):
# 实时查看 Spring Boot 启动日志
podman logs -f insurance-app

# 查看最后 100 行带时间戳
podman logs --tail 100 --timestamps insurance-app
🔁 Docker 对比:
docker logs -f myapp   # 等价

开发建议

  • 日志默认输出到 journald,也可通过 journalctl -u container-insurance-app 查询。
  • 在生产环境中,建议将日志输出到文件或集中日志系统(如 Loki)。

podman inspect —— 查看容器/镜像/网络/卷的详细元数据

podman inspect [OPTIONS] NAME|ID
📌 实战示例:
# 查看容器详细信息(IP、端口、挂载、环境变量)
podman inspect insurance-app

# 查看镜像配置
podman inspect registry.aliyuncs.com/library/postgres:16

# 查看网络配置
podman inspect myapp-net

# 只提取某个字段(JSONPath)
podman inspect --format='{{.NetworkSettings.IPAddress}}' insurance-app

开发建议

  • 调试网络不通时,用 podman inspect 查看容器 IP 和端口映射。
  • jq 解析 JSON(需安装):
    podman inspect insurance-app | jq '.[0].NetworkSettings.Ports'
    

podman top —— 查看容器内运行的进程

podman top CONTAINER [COLUMNS...]
📌 实战示例:
# 查看 Java 应用内部进程
podman top insurance-app

# 查看特定列(PID, USER, CMD)
podman top insurance-app pid,comm,user
🔁 Docker 对比:
docker top myapp   # 等价

podman stats —— 实时查看容器资源使用(CPU、内存)

podman stats [OPTIONS] [CONTAINER...]
📌 实战示例:
# 实时监控 Java 应用内存
podman stats insurance-app

# 监控多个容器
podman stats postgres redis insurance-app
🔁 Docker 对比:
docker stats myapp   # 等价

开发建议

  • Java 应用常因堆内存溢出导致 OOM。使用 podman stats 监控内存增长趋势。
  • 可结合 -c 10 限制刷新次数:podman stats --no-stream -c 10

7. 容器交互与调试(Execution & Copy)

podman exec —— 在运行中的容器内执行命令

podman exec [OPTIONS] CONTAINER COMMAND [ARG...]
参数说明
-it交互式终端
-u指定用户
📌 实战示例:
# 进入 PostgreSQL 容器查看数据库
podman exec -it postgres psql -U dev -d insurance

# 查看 Java 应用配置文件
podman exec insurance-app cat /app/application-dev.yml

# 在容器内安装调试工具(临时)
podman exec -it insurance-app apk add curl

⚠️ 注意:修改容器内文件是临时的,重启后丢失。仅用于调试。

🔁 Docker 对比:
docker exec -it myapp sh   # 等价

podman cp —— 在宿主机与容器间复制文件

podman cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
podman cp SRC_PATH CONTAINER:DEST_PATH
📌 实战示例:
# 从容器复制日志到宿主机
podman cp insurance-app:/app/logs/app.log ./debug/app.log

# 从宿主机推送配置到容器
podman cp ./config/application.yml insurance-app:/app/config/
🔁 Docker 对比:
docker cp myapp:/app/log.txt .   # 等价

开发建议

  • 用于调试时临时导出日志、配置。
  • 正式部署应使用 卷挂载镜像内嵌配置

8. 系统级管理(System Management)

podman system df —— 查看磁盘使用情况

podman system df

输出示例:

TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          12        8         5.2GB     2.1GB (40%)
Containers      10        4         1.8GB     1.2GB (66%)
Local Volumes   6         4         3.4GB     1.1GB (32%)

开发建议:每月检查一次,清理无用资源。


podman system prune —— 清理无用资源

podman system prune [OPTIONS]
参数说明
-a, --all清理所有未使用的镜像、容器、卷、网络
--volumes清理未使用的卷
📌 实战示例:
# 清理所有未使用的资源(安全)
podman system prune

# 清理所有(含未使用的镜像)
podman system prune -a

# 清理卷(谨慎!)
podman system prune --volumes
🔁 Docker 对比:
docker system prune          # 等价
docker system prune -a       # 等价

开发建议

  • 每周执行一次 podman system prune,保持系统整洁。
  • 不要轻易使用 --volumes,可能删除数据库数据!

podman generate systemd —— 生成 systemd 服务文件(生产级必备)

podman generate systemd --new --files --name CONTAINER
参数说明
--new生成新服务(非更新)
--files输出文件到当前目录
--name指定容器名
📌 实战示例(让 PostgreSQL 自启动):
# 生成服务文件
podman generate systemd --new --files --name postgres

# 移动到用户服务目录
mv container-postgres.service ~/.config/systemd/user/

# 启用并启动
systemctl --user daemon-reload
systemctl --user enable container-postgres
systemctl --user start container-postgres

# 查看状态
systemctl --user status container-postgres

开发建议

  • 所有中间件(PostgreSQL、Redis、MQ)都应设为 systemd 服务
  • 重启后自动恢复,无需手动启动,符合企业运维规范

9. 镜像构建(Buildah 集成)

Podman 底层使用 Buildah 构建镜像,功能更强、更灵活。

buildah from —— 创建容器(镜像层)

buildah from registry.aliyuncs.com/library/openjdk:17-jre-slim

buildah run —— 在容器中执行命令

buildah run mycontainer -- mkdir /app
buildah run mycontainer -- cp /tmp/app.jar /app/

buildah commit —— 提交为镜像

buildah commit mycontainer insurance-app:latest
📌 实战:脚本化构建(无 Dockerfile)
#!/bin/bash
ctr=$(buildah from registry.aliyuncs.com/library/openjdk:17-jre-slim)
buildah run $ctr -- mkdir /app
buildah copy $ctr ./target/app.jar /app/
buildah config --entrypoint '["java","-jar","/app/app.jar"]' $ctr
buildah commit $ctr insurance-app:latest
buildah rm $ctr
echo "镜像构建完成:insurance-app:latest"

优势

  • 可动态注入环境变量、条件判断。
  • 不依赖 Dockerfile 语法,更像编程。

10. 镜像传输与安全(Skopeo & Cosign)

skopeo copy —— 跨仓库复制镜像

skopeo copy docker://docker.io/nginx:latest docker://registry.aliyuncs.com/myrepo/nginx:latest

cosign verify —— 验证镜像签名(安全合规)

# 安装 cosign
sudo dnf install -y cosign

# 验证镜像是否由可信方签名
cosign verify --key cosign.pub registry.aliyuncs.com/myapp:latest

企业级建议

  • 在团队中推行 镜像签名策略,只允许运行已签名镜像。
  • 使用 cosign + rekor 实现供应链透明。

✅ 总结:Podman 命令速查表(Java 开发者专属)

目标Podman 命令Docker 对比
拉取镜像podman pull registry.aliyuncs.com/library/postgres:16docker pull ...
构建镜像podman build -t myapp .docker build ...
启动容器podman run -d --name app -p 8080:8080 ...docker run ...
启动 Podpodman pod create --name mypod -p 8080:8080❌ 无原生支持
查看容器podman ps -adocker ps -a
查看日志podman logs -f appdocker logs -f ...
进入容器podman exec -it app shdocker exec -it ...
挂载卷podman run -v pgdata:/data ...docker run -v ...
创建网络podman network create mynetdocker network create ...
清理资源podman system prune -adocker system prune -a
生成服务podman generate systemd --files --name app❌ 无此功能
检查元数据podman inspect appdocker inspect ...
镜像签名cosign verify ...需 Notary(第三方)

🎯 最终建议:你的 Podman 命令使用规范

场景推荐做法
日常开发使用 podman-compose 管理多服务,podman build 构建,podman logs -f 调试
数据库使用 podman volume create pgdata,不使用 bind mount
网络每个项目创建独立 podman network create
服务部署使用 podman generate systemd 生成服务,systemctl --user enable
镜像安全使用 registry.aliyuncs.com,避免 docker.io,生产环境使用 digest
CI/CD所有脚本统一使用 podman,不写 docker
团队协作提供 start-dev.sh 脚本,包含 podman-compose up + systemctl --user start

📌 附录:Podman 命令别名设置(一键兼容 Docker)

# 添加别名到 ~/.bashrc
echo "alias docker=podman" >> ~/.bashrc
echo "alias docker-compose='podman-compose'" >> ~/.bashrc
source ~/.bashrc

# 验证
docker --version   # 输出 podman 版本
docker-compose up  # 自动调用 podman-compose

好处:你现有的所有 Docker 脚本、CI/CD 流水线、IDE 配置,无需修改即可运行


✅ 结语:你已掌握 Podman 命令的全部核心

你不再是“会用容器的人”,而是理解容器如何工作、如何安全运行、如何与系统集成的现代开发者

下一步建议

  1. 编写你的 start-dev.sh 脚本,一键启动 PostgreSQL、Redis、Java 应用。
  2. 将你的 PostgreSQL 服务设为 systemd 自启动。
  3. 为你的 Spring Boot 应用构建一个多阶段、使用阿里云镜像、带健康检查的 Dockerfile。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙茶清欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值