Podman 容器管理完全指南 🐳
📋 目录
📖 简介
Podman 是一个开源的容器运行时工具,用于管理容器、镜像和容器编排。它与 Docker 兼容但无需守护进程,提供了更安全的容器管理方式。Podman 支持 rootless 容器运行,是 Docker 的优秀替代品。
🎯 Podman 主要特性
- 无守护进程架构: 不需要长期运行的守护进程
- Rootless 容器: 允许普通用户运行容器,提高安全性
- Docker 兼容: 支持 Docker CLI 命令和镜像格式
- Pod 支持: 原生支持 Kubernetes 风格的 Pod
- 系统集成: 与 systemd 集成良好
🔄 Podman vs Docker
特性 |
Podman |
Docker |
架构 |
无守护进程 |
客户端-服务器架构 |
权限 |
支持 rootless |
通常需要 root 权限 |
安全性 |
更高,无需守护进程 |
守护进程可能存在安全风险 |
兼容性 |
兼容 Docker 命令 |
原生 Docker 生态 |
👀 容器查看命令
1. 查看运行中的容器
1
2
3
4
5
6
7
8
9
10
11
|
# 查看运行中的容器(简洁格式)
podman ps
# 查看运行中的容器(自定义格式)
podman ps --format '{{.ID}}: {{.Names}} - {{.Status}}'
# 查看运行中的容器(显示端口映射)
podman ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Ports}}"
# 查看运行中的容器(显示镜像)
podman ps --format "table {{.Names}}\t{{.Image}}\t{{.Status}}"
|
2. 查看所有容器状态
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
# 查看所有容器(包括停止的)
podman ps -a
# 查看已停止的容器
podman ps -a --filter "status=exited"
# 查看已停止的容器(仅显示ID和名称)
podman ps -a --filter "status=exited" --format "{{.ID}} {{.Names}}"
# 按状态过滤容器
podman ps -a --filter "status=created" # 已创建
podman ps -a --filter "status=running" # 运行中
podman ps -a --filter "status=paused" # 已暂停
podman ps -a --filter "status=exited" # 已退出
podman ps -a --filter "status=removing" # 删除中
|
3. 高级查看选项
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
# 查看最近创建的容器
podman ps -l
# 查看最后创建的n个容器
podman ps -n 5
# 查看容器大小(磁盘占用)
podman ps -s
# 查看容器并排序
podman ps --sort=name # 按名称排序
podman ps --sort=status # 按状态排序
podman ps --sort=created # 按创建时间排序
# 使用自定义过滤条件
podman ps --filter "name=web" # 名称包含web
podman ps --filter "label=env=prod" # 标签过滤
podman ps --filter "ancestor=nginx" # 使用nginx镜像的容器
|
⚡ 容器生命周期管理
4. 启动和停止容器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
# 启动容器
podman start mytest
# 停止容器
podman stop mytest
# 强制停止容器(SIGKILL)
podman stop -t 0 mytest # 立即停止
podman kill mytest # 发送信号
# 重启容器
podman restart mytest
# 优雅重启(先停止再启动)
podman restart -t 30 mytest # 30秒超时
|
5. 创建和运行容器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 创建但不启动容器
podman create --name mycontainer nginx:alpine
# 运行容器(后台模式)
podman run -d --name mytest nginx:alpine
# 运行容器(交互模式)
podman run -it --name mytest ubuntu:20.04 bash
# 运行容器并自动删除
podman run --rm -it alpine:latest sh
# 运行容器并设置重启策略
podman run -d --restart=always --name myapp myapp:latest
|
6. 删除容器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 删除已停止的容器
podman rm mytest
# 强制删除运行中的容器
podman rm -f mytest
# 删除容器并关联的匿名卷
podman rm -v mytest
# 删除所有已停止的容器
podman container prune
# 删除容器前先停止
podman rm -f mytest || podman stop mytest && podman rm mytest
|
📊 容器日志和监控
8. 查看容器日志
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
# 查看最新日志
podman logs mytest
# 实时查看日志(跟随模式)
podman logs -f mytest
# 查看最后n行日志
podman logs --tail 100 mytest
# 查看带时间戳的日志
podman logs -t mytest
# 查看特定时间后的日志
podman logs --since 2023-01-01T00:00:00 mytest
# 查看最近时间段的日志
podman logs --since 1h mytest # 最近1小时
podman logs --since 30m mytest # 最近30分钟
# 组合使用日志选项
podman logs -f --tail 50 --since 10m mytest
|
9. 容器资源监控
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 查看实时资源使用情况
podman stats mytest
# 查看一次性资源统计
podman stats --no-stream mytest
# 查看所有容器资源使用
podman stats --all
# 自定义统计信息格式
podman stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"
# 持续监控(每5秒刷新)
watch -n 5 podman stats --no-stream
|
10. 高级监控命令
1
2
3
4
5
6
7
8
9
10
11
|
# 查看容器进程树
podman top mytest
# 查看容器进程详情
podman top mytest -eo pid,ppid,user,comm
# 查看容器资源限制
podman inspect mytest --format '{{.HostConfig.Memory}}'
# 查看容器CPU使用详情
podman inspect mytest --format '{{.HostConfig.NanoCpus}}'
|
💻 容器交互操作
11. 进入容器执行命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
# 使用 bash 进入容器
podman exec -it mytest bash
# 使用 sh 进入容器
podman exec -it mytest sh
# 在容器中执行单条命令
podman exec mytest ls -la /app
# 在容器中执行复杂命令
podman exec mytest /bin/bash -c "ls -la && pwd"
# 以特定用户身份执行命令
podman exec -it --user www-data mytest bash
# 在容器中设置环境变量
podman exec -it -e DEBUG=true mytest bash
|
12. 文件操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 复制文件到容器
podman cp local_file.txt mytest:/path/in/container/
# 从容器复制文件
podman cp mytest:/path/in/container/file.txt ./
# 复制目录到容器
podman cp ./local_dir/ mytest:/path/in/container/
# 从容器复制目录
podman cp mytest:/path/in/container/ ./local_dir/
# 保持文件权限
podman cp -a local_file.txt mytest:/path/in/container/
|
🔄 批量操作
13. 批量停止容器
1
2
3
4
5
6
7
8
|
# 停止所有运行中的容器
podman stop $(podman ps -q)
# 停止特定模式的容器
podman stop $(podman ps -q --filter "name=web")
# 优雅停止所有容器
podman ps -q | xargs podman stop -t 30
|
14. 批量删除容器
1
2
3
4
5
6
7
8
9
10
11
|
# 删除所有已停止的容器
podman container prune
# 强制删除所有容器
podman rm -f $(podman ps -aq)
# 删除特定模式的容器
podman rm -f $(podman ps -aq --filter "name=test")
# 删除所有退出的容器
podman rm -f $(podman ps -aq --filter "status=exited")
|
15. 批量重启容器
1
2
3
4
5
|
# 重启所有运行中的容器
podman restart $(podman ps -q)
# 重启特定镜像的容器
podman restart $(podman ps -q --filter "ancestor=nginx")
|
16. 批量操作脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 批量备份容器数据脚本
#!/bin/bash
BACKUP_DIR="./backup/$(date +%Y%m%d_%H%M%S)"
mkdir -p "$BACKUP_DIR"
for container in $(podman ps -aq); do
name=$(podman inspect --format='{{.Name}}' $container | sed 's|/||')
echo "Backing up $name..."
mkdir -p "$BACKUP_DIR/$name"
podman inspect $container > "$BACKUP_DIR/$name/inspect.json"
# 备份重要数据目录
podman cp $container:/etc "$BACKUP_DIR/$name/" 2>/dev/null || true
podman cp $container:/app "$BACKUP_DIR/$name/" 2>/dev/null || true
done
|
🔍 容器信息查询
17. 查看容器详细信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 查看完整容器信息
podman inspect mytest
# 查看特定信息
podman inspect --format='{{.NetworkSettings.IPAddress}}' mytest
# 查看容器配置
podman inspect --format='{{json .Config}}' mytest | jq .
# 查看容器状态
podman inspect --format='{{.State}}' mytest
# 查看容器挂载点
podman inspect --format='{{.Mounts}}' mytest
|
18. 网络信息查询
1
2
3
4
5
6
7
8
9
10
11
|
# 查看容器端口映射
podman port mytest
# 查看特定端口映射
podman port mytest 80
# 查看容器网络设置
podman inspect --format='{{.NetworkSettings}}' mytest
# 查看容器IP地址
podman inspect --format='{{.NetworkSettings.IPAddress}}' mytest
|
19. 资源信息查询
1
2
3
4
5
6
7
8
9
|
# 查看容器资源限制
podman inspect --format='{{.HostConfig.Memory}}' mytest
podman inspect --format='{{.HostConfig.CpuShares}}' mytest
# 查看容器存储信息
podman inspect --format='{{.GraphDriver}}' mytest
# 查看容器环境变量
podman inspect --format='{{.Config.Env}}' mytest
|
🚀 高级管理命令
20. 容器重命名
1
2
3
4
5
6
7
8
9
|
# 重命名容器
podman rename mytest new-container-name
# 批量重命名脚本
for container in $(podman ps -aq); do
old_name=$(podman inspect --format='{{.Name}}' $container | sed 's|/||')
new_name="prod_${old_name}"
podman rename $old_name $new_name
done
|
21. 容器提交和导出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 提交容器为新的镜像
podman commit mytest new_image_name:tag
# 提交时添加作者信息
podman commit --author "Your Name <email@example.com>" mytest new_image
# 提交时修改CMD
podman commit --change 'CMD ["nginx", "-g", "daemon off;"]' mytest nginx_custom
# 导出容器为tar包
podman export mytest > mytest.tar
# 导入容器
podman import mytest.tar my_imported_image:tag
|
22. 暂停和恢复容器
1
2
3
4
5
6
7
8
|
# 暂停容器
podman pause mytest
# 恢复容器
podman unpause mytest
# 检查暂停状态
podman inspect --format='{{.State.Paused}}' mytest
|
23. 容器更新操作
1
2
3
4
5
6
7
8
9
|
# 更新容器资源限制
podman update --memory 512m mytest
podman update --cpus 1.5 mytest
# 更新容器重启策略
podman update --restart unless-stopped mytest
# 同时更新多个设置
podman update --memory 1g --cpus 2 --restart always mytest
|
📝 实用脚本示例
24. 容器健康检查脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
#!/bin/bash
# 容器健康监控脚本
CONTAINERS=$(podman ps --format "{{.Names}}")
for container in $CONTAINERS; do
status=$(podman inspect --format='{{.State.Status}}' $container)
health=$(podman inspect --format='{{.State.Health.Status}}' $container 2>/dev/null || echo "N/A")
echo "Container: $container"
echo "Status: $status"
echo "Health: $health"
if [ "$status" != "running" ]; then
echo "❌ Container $container is not running. Attempting to restart..."
podman restart $container
fi
if [ "$health" = "unhealthy" ]; then
echo "⚠️ Container $container is unhealthy. Check logs: podman logs $container"
fi
echo "----------------------------------------"
done
|
25. 自动备份脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
#!/bin/bash
# 容器数据备份脚本
BACKUP_DIR="/backup/containers/$(date +%Y%m%d_%H%M%S)"
mkdir -p "$BACKUP_DIR"
echo "Starting container backup at $(date)"
# 备份所有运行中容器的数据
for container in $(podman ps -q); do
name=$(podman inspect --format='{{.Name}}' $container | sed 's|/||')
echo "Backing up $name..."
# 创建容器备份目录
container_dir="$BACKUP_DIR/$name"
mkdir -p "$container_dir"
# 导出容器配置
podman inspect $container > "$container_dir/inspect.json"
# 备份重要数据
volumes=$(podman inspect --format='{{range .Mounts}}{{.Source}}:{{.Destination}} {{end}}' $container)
for volume in $volumes; do
src=$(echo $volume | cut -d: -f1)
if [ -d "$src" ]; then
rsync -a "$src/" "$container_dir/volumes/$(basename $src)/"
fi
done
# 导出容器日志
podman logs $container > "$container_dir/container.log" 2>/dev/null
done
echo "Backup completed: $BACKUP_DIR"
|
26. 容器资源监控仪表板
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#!/bin/bash
# 实时容器监控仪表板
watch -n 2 '
echo "==================== CONTAINER MONITOR ===================="
echo "CPU and Memory Usage:"
podman stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.MemPerc}}"
echo -e "\nRunning Containers:"
podman ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
echo -e "\nResource Limits:"
for container in $(podman ps -q); do
name=$(podman inspect --format="{{.Name}}" $container | sed "s|/||")
memory=$(podman inspect --format="{{.HostConfig.Memory}}" $container)
cpu=$(podman inspect --format="{{.HostConfig.NanoCpus}}" $container)
echo "$name: Memory=${memory} bytes, CPU=${cpu} nanoseconds"
done
'
|
🛠️ 故障排除
27. 容器状态诊断
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
# 检查容器详细状态
podman inspect --format='{{json .State}}' mytest | jq .
# 查看容器退出代码
podman inspect --format='{{.State.ExitCode}}' mytest
# 查看容器错误信息
podman inspect --format='{{.State.Error}}' mytest
# 查看容器启动时间
podman inspect --format='{{.State.StartedAt}}' mytest
podman inspect --format='{{.State.FinishedAt}}' mytest
# 查看容器OOM状态
podman inspect --format='{{.State.OOMKilled}}' mytest
|
28. 日志分析技巧
1
2
3
4
5
6
7
8
9
10
11
|
# 搜索错误日志
podman logs mytest | grep -i error
# 查看特定时间段的日志
podman logs --since "10m" mytest | grep -i exception
# 实时监控错误日志
podman logs -f mytest | grep --line-buffered -i error
# 日志统计分析
podman logs mytest | awk '{print $1}' | sort | uniq -c | sort -nr
|
29. 网络故障排查
1
2
3
4
5
6
7
8
9
10
11
|
# 检查容器网络连接
podman exec mytest ping -c 4 8.8.8.8
# 查看容器DNS配置
podman exec mytest cat /etc/resolv.conf
# 检查容器端口监听
podman exec mytest netstat -tulpn
# 测试容器间网络连通性
podman exec container1 ping container2
|
🔒 安全最佳实践
30. 非特权容器运行
1
2
3
4
5
6
7
8
|
# 以非root用户运行容器
podman run --user 1000:1000 nginx:alpine
# 使用随机用户ID
podman run --user $(id -u):$(id -g) nginx:alpine
# 禁用权限提升
podman run --security-opt=no-new-privileges nginx:alpine
|
31. 资源限制和隔离
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 设置内存限制
podman run --memory=512m --memory-swap=1g nginx:alpine
# 设置CPU限制
podman run --cpus=1.5 --cpu-shares=512 nginx:alpine
# 设置IO限制
podman run --device-read-bps=/dev/sda:1mb --device-write-iops=/dev/sda:10 nginx:alpine
# 使用只读根文件系统
podman run --read-only nginx:alpine
# 只读挂载特定目录
podman run -v /data:/data:ro nginx:alpine
|
32. 安全增强配置
1
2
3
4
5
6
7
8
9
10
11
|
# 使用AppArmor配置文件
podman run --security-opt apparmor=my-profile nginx:alpine
# 使用SELinux标签
podman run --security-opt label=type:my_container_t nginx:alpine
# 禁用系统调用
podman run --security-opt seccomp=unconfined nginx:alpine
# 使用自定义能力集
podman run --cap-drop=ALL --cap-add=NET_BIND_SERVICE nginx:alpine
|
🌐 网络管理
33. 网络查看和诊断
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 查看所有网络
podman network ls
# 查看网络详情
podman network inspect bridge
# 创建自定义网络
podman network create mynetwork
# 连接容器到网络
podman network connect mynetwork mycontainer
# 从网络断开容器
podman network disconnect mynetwork mycontainer
|
34. 高级网络配置
1
2
3
4
5
6
7
8
|
# 创建带子网的网络
podman network create --subnet 192.168.100.0/24 --gateway 192.168.100.1 mynet
# 创建Macvlan网络
podman network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=eth0 mymacvlan
# 设置容器静态IP
podman run --network mynet --ip 192.168.100.10 nginx:alpine
|
📦 镜像管理
35. 镜像操作命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
# 查看本地镜像
podman images
# 拉取镜像
podman pull nginx:alpine
# 推送镜像
podman push myimage:latest registry.example.com/myimage:latest
# 删除镜像
podman rmi nginx:alpine
# 构建镜像
podman build -t myapp:latest .
# 镜像打标签
podman tag nginx:alpine myregistry/nginx:latest
|
36. 镜像清理和维护
1
2
3
4
5
6
7
8
9
10
11
|
# 删除悬空镜像
podman image prune
# 删除所有未使用镜像
podman image prune -a
# 查看镜像磁盘使用
podman system df
# 优化存储
podman system prune -a
|
🎯 总结
通过这份完整的 Podman 容器管理指南,您应该能够:
- 熟练掌握 Podman 的基本容器操作命令
- 有效监控 容器状态和资源使用情况
- 高效管理 多个容器的批量操作
- 深入排查 容器故障和性能问题
- 安全运行 容器并实施最佳实践
- 灵活配置 容器网络和存储
Podman 作为 Docker 的现代替代品,提供了更安全、更灵活的容器管理体验。建议定期练习这些命令,并将其集成到您的日常运维工作中。
💡 提示: 记得定期更新 Podman 版本以获取最新功能和安全修复:
1
2
|
sudo dnf update podman # RHEL/CentOS/Fedora
sudo apt update podman # Debian/Ubuntu
|