Podman入门笔记

0 阅读4分钟

适用环境:Ubuntu 24.04 LTS · NVIDIA RTX 3070


📦 一、什么是 Podman?

Podman(Pod Manager)是一个无守护进程(daemonless)、无 root 权限的容器引擎,是 Docker 的强力替代品。它与 Docker CLI 高度兼容,但架构更安全:

  • 无需 root 权限运行容器(rootless 模式)
  • 无中央守护进程,每个容器独立运行
  • ✅ 原生支持 Pod 概念(类似 Kubernetes Pod)
  • ✅ 与 Docker 命令高度兼容,可直接 alias docker=podman
  • ✅ 支持 OCI 标准镜像格式

[1]


🛠️ 二、安装 Podman(Ubuntu 24.04 LTS)

Ubuntu 24.04 的官方仓库已内置 Podman,安装非常简单。

Step 1:更新系统

sudo apt update && sudo apt upgrade -y

Step 2:安装 Podman

sudo apt install -y podman

Step 3:验证安装

podman version
podman info

正常输出示例:

Version:      5.x.x
API Version:  5.x.x
Go Version:   go1.xx
OS/Arch:      linux/amd64

Step 4:配置 Podman 服务(可选)

# 启用用户级 socket(rootless 推荐)
systemctl --user enable --now podman.socket

# 验证 socket 状态
systemctl --user status podman.socket

[2] [1]


🚀 三、基础使用命令

3.1 搜索与拉取镜像

# 搜索镜像(建议使用完整镜像名)
podman search docker.io/library/nginx

# 拉取镜像(推荐写完整路径,避免歧义)
podman pull docker.io/library/nginx:latest

# 查看本地镜像列表
podman images

3.2 运行容器

# 后台运行一个 nginx 容器,映射 8080 端口
podman run -d -p 8080:80 --name my-nginx docker.io/library/nginx

# 交互式运行 Ubuntu 容器
podman run -it --rm docker.io/library/ubuntu:24.04 /bin/bash

3.3 容器管理

# 查看运行中的容器
podman ps

# 查看所有容器(含已停止)
podman ps -a

# 停止容器
podman stop my-nginx

# 删除容器
podman rm my-nginx

# 查看容器日志
podman logs my-nginx

# 进入运行中的容器
podman exec -it my-nginx /bin/bash

# 检查容器详情
podman inspect my-nginx

3.4 清理资源

# 删除所有停止的容器
podman container prune

# 删除未使用的镜像
podman image prune

# 查看磁盘占用
podman system df

[1]


🇨🇳 四、配置国内镜像加速(重点)

由于网络原因,直接从 Docker Hub 或 ghcr.io 拉取镜像速度极慢,需配置国内镜像源。

4.1 Podman 镜像配置文件位置

作用范围配置文件路径
当前用户(推荐)~/.config/containers/registries.conf
全局(root)/etc/containers/registries.conf

4.2 配置国内镜像加速

# 创建用户级配置目录
mkdir -p ~/.config/containers

# 编辑配置文件
nano ~/.config/containers/registries.conf

写入以下内容(包含多个国内可用镜像源):

# 未加前缀的镜像名,按顺序从以下仓库搜索
unqualified-search-registries = ["docker.io", "quay.io"]

# Docker Hub 镜像加速
[[registry]]
prefix = "docker.io"
location = "docker.io"

  [[registry.mirror]]
  location = "hub-mirror.c.163.com"

  [[registry.mirror]]
  location = "mirror.baidubce.com"

  [[registry.mirror]]
  location = "dockerhub.azk8s.cn"

# ghcr.io 镜像加速
[[registry]]
prefix = "ghcr.io"
location = "ghcr.io"

  [[registry.mirror]]
  location = "ghcr.nju.edu.cn"

4.3 验证镜像加速是否生效

# 查看当前 registry 配置
podman info | grep -A 20 "registries"

# 测试拉取速度(应明显加快)
podman pull docker.io/library/alpine:latest

💡 提示:如果上述镜像源失效(国内镜像源时常变动),可尝试使用南京大学镜像站 docker.nju.edu.cn 或中科大镜像站 docker.mirrors.ustc.edu.cn

[1]


💾 五、更改 Image 存储路径(重点)

默认情况下,Podman 将镜像和容器数据存储在:

  • Rootless 模式~/.local/share/containers/storage/
  • Root 模式/var/lib/containers/storage/

当系统盘空间不足时,需要将存储迁移到其他磁盘或分区。

5.1 查看当前存储路径

podman info --format '{{.Store.GraphRoot}}'
podman info --format '{{.Store.RunRoot}}'

# 查看当前占用空间
podman system df
du -sh ~/.local/share/containers/storage/

5.2 准备新存储目录

假设要将存储迁移到 /data/containers/storage(例如挂载的大容量磁盘):

# 创建新目录
sudo mkdir -p /data/containers/storage

# 设置当前用户所有权(rootless 模式)
sudo chown -R $(id -u):$(id -g) /data/containers/storage
chmod 700 /data/containers/storage

# 确认新目录空间充足
df -h /data/containers/storage

5.3 备份现有镜像(重要!)

# 查看所有本地镜像
podman images

# 保存重要镜像为 tar 文件
podman save -o /tmp/my-image-backup.tar my-image:latest

5.4 修改存储配置文件

Rootless 模式(推荐普通用户使用):

mkdir -p ~/.config/containers

cat > ~/.config/containers/storage.conf << 'EOF'
[storage]
# 使用 overlay 驱动(性能最佳)
driver = "overlay"

# 新的镜像/容器存储路径
graphroot = "/data/containers/storage"

# 运行时数据(临时数据,重启后清除,保持在快速本地盘)
runroot = "$XDG_RUNTIME_DIR/containers"

[storage.options.overlay]
# 可选优化参数
# mountopt = "nodev,metacopy=on"
EOF

Root 模式(全局生效):

sudo tee /etc/containers/storage.conf > /dev/null << 'EOF'
[storage]
driver = "overlay"
graphroot = "/data/containers/storage"
runroot = "/run/containers/storage"

[storage.options.overlay]
mountopt = "nodev,metacopy=on"
EOF

5.5 重置并验证

# ⚠️ 警告:此操作会清除所有容器和镜像,请确保已备份!
podman system reset --force

# 验证新路径已生效
podman info --format '{{.Store.GraphRoot}}'

# 重新拉取镜像(或从备份恢复)
podman pull docker.io/library/nginx:latest
# podman load -i /tmp/my-image-backup.tar

[3] [4]


🎮 六、适配 NVIDIA GPU(RTX 3070)

让 Podman 容器访问 NVIDIA GPU,需要安装 NVIDIA Container Toolkit,并进行专项配置。

6.1 前提:确认驱动已安装

# 验证 NVIDIA 驱动正常工作
nvidia-smi

正常输出应显示 RTX 3070 的信息,如:

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 550.xx    Driver Version: 550.xx    CUDA Version: 12.x          |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
|   0  NVIDIA GeForce RTX 3070  Off  | 00000000:01:00.0  On |                  N/A |

6.2 安装 NVIDIA Container Toolkit

# Step 1:添加 NVIDIA 官方 GPG 密钥和仓库
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey \
  | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg

curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list \
  | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' \
  | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

# Step 2:更新并安装
sudo apt update
sudo apt install -y nvidia-container-toolkit

6.3 配置 Podman 使用 NVIDIA CDI

NVIDIA Container Toolkit 使用 CDI(Container Device Interface) 与 Podman 集成(Podman 不支持 Docker 的 --runtime 方式,需用 CDI):

# 生成 CDI 规范文件(关键步骤!)
sudo nvidia-ctk cdi generate --output=/etc/cdi/nvidia.yaml

# 验证 CDI 设备已被识别
nvidia-ctk cdi list

正常输出示例:

nvidia.com/gpu=0
nvidia.com/gpu=all

6.4 在容器中使用 GPU

# 方式一:使用 CDI 挂载所有 GPU(推荐)
podman run --rm \
  --device nvidia.com/gpu=all \
  docker.io/nvidia/cuda:12.3.0-base-ubuntu22.04 \
  nvidia-smi

# 方式二:只挂载 GPU 0(多卡场景)
podman run --rm \
  --device nvidia.com/gpu=0 \
  docker.io/nvidia/cuda:12.3.0-base-ubuntu22.04 \
  nvidia-smi

6.5 验证 GPU 在容器内可用

podman run --rm \
  --device nvidia.com/gpu=all \
  docker.io/nvidia/cuda:12.3.0-base-ubuntu22.04 \
  nvidia-smi

成功输出应显示与宿主机相同的 RTX 3070 GPU 信息。

6.6 实际 AI/ML 工作负载示例

# 运行 PyTorch GPU 容器(以 NGC 镜像为例)
podman run --rm -it \
  --device nvidia.com/gpu=all \
  -v $(pwd):/workspace \
  -w /workspace \
  docker.io/pytorch/pytorch:2.2.0-cuda12.1-cudnn8-runtime \
  python3 -c "import torch; print('CUDA available:', torch.cuda.is_available()); print('GPU:', torch.cuda.get_device_name(0))"

💡 注意:Podman rootless 模式下使用 GPU,需确保 /etc/cdi/ 目录对普通用户可读:

sudo chmod 644 /etc/cdi/nvidia.yaml

[1]


🗂️ 七、完整配置汇总

以下是三个核心配置文件的最终状态总览:

配置文件路径作用
registries.conf~/.config/containers/registries.conf国内镜像加速
storage.conf~/.config/containers/storage.conf自定义存储路径
nvidia CDI/etc/cdi/nvidia.yamlGPU 设备接入

✅ 八、快速验证清单

完成所有配置后,运行以下命令一键验证:

# 1. 验证 Podman 版本
podman version

# 2. 验证存储路径
podman info --format '{{.Store.GraphRoot}}'

# 3. 验证镜像加速(拉取一个小镜像测速)
time podman pull docker.io/library/alpine:latest

# 4. 验证 GPU 访问
podman run --rm --device nvidia.com/gpu=all \
  docker.io/nvidia/cuda:12.3.0-base-ubuntu22.04 nvidia-smi

# 5. 全面系统信息
podman info

📚 参考资料