适用环境: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.yaml | GPU 设备接入 |
✅ 八、快速验证清单
完成所有配置后,运行以下命令一键验证:
# 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