Podman 容器引擎安装与配置 🚀
📦 一个无需守护进程、更安全可靠的容器运行时工具
目录
🌟 项目简介
Podman(Pod Manager)是一个开源的容器运行时工具,用于开发、管理和运行 OCI(Open Container Initiative)标准的容器。由 Red Hat 开发并于 2018 年推出,它采用无守护进程(daemon-less)架构,作为 Docker 的替代方案,提供更安全、更轻量的容器管理方式。
✨ 主要特点:
- ✅ 无需守护进程:采用传统的 fork-exec 模式,不需要长期运行的后台服务,更加轻量安全
- ✅ 与 Docker CLI 兼容:学习成本低,大多数命令与 Docker 相同
- ✅ 支持 rootless 容器:允许非 root 用户运行容器,提高安全性
- ✅ 完整的容器生态系统支持:支持容器、镜像、卷和 pod 的管理
- ✅ 与 systemd 集成良好:可以生成 systemd 服务文件,管理容器生命周期
- ✅ 支持 Pod 概念:类似 Kubernetes 中的 Pod,可管理一组共享资源的容器
🔄 Podman 与 Docker 的主要区别
特性 |
Podman |
Docker |
架构 |
无守护进程 (daemon-less) |
客户端-服务器架构,需守护进程 |
root 权限 |
支持非 root 用户运行容器 |
通常需要 root 权限 |
存储 |
镜像和容器存储在不同地方 |
必须存储在 Docker 引擎本地 |
Pod 支持 |
原生支持 Pod 概念 |
需要通过 Docker Compose 实现类似功能 |
📥 安装 Podman(Debian/Ubuntu)
1. 从系统仓库安装
1
2
3
4
5
|
# 更新系统包列表
sudo apt update
# 安装 Podman
sudo apt install -y podman
|
2. 从第三方仓库安装最新版(可选)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 导入 GPG 密钥
source /etc/os-release
wget http://downloadcontent.opensuse.org/repositories/home:/alvistack/Debian_$VERSION_ID/Release.key -O alvistack_key
cat alvistack_key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/alvistack.gpg >/dev/null
# 添加安装源
echo "deb http://downloadcontent.opensuse.org/repositories/home:/alvistack/Debian_$VERSION_ID/ /" | sudo tee /etc/apt/sources.list.d/alvistack.list
# 安装 Podman 及依赖
sudo apt update
sudo apt -y install podman uidmap dbus-x11 slirp4netns libpam-systemd podman-aardvark-dns podman-netavark podman-docker
# 验证安装
podman --version
|
3. 安装 pipx 和 podman-compose
1
2
3
4
5
6
7
8
9
|
# 安装 pipx
sudo apt install -y pipx
pipx ensurepath
# 安装 podman-compose
pipx install podman-compose
# 验证安装
podman-compose --version
|
💡 提示:安装完成后,可能需要重新登录 SSH 会话或执行 source ~/.bashrc
来刷新环境变量。
⚙️ 基本配置
1. 配置国内镜像加速
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
# 创建配置目录
sudo mkdir -p /etc/containers
# 配置镜像加速器
sudo tee /etc/containers/registries.conf <<'EOF'
unqualified-search-registries = ["docker.io"]
[[registry]]
prefix = "docker.io"
location = "docker.1ms.run"
[[registry]]
prefix = "dockerio"
location = "hub.rat.dev"
[[registry]]
prefix = "docker.io"
location = "docker.xuanyuan.me"
[[registry]]
prefix = "docker.io"
location = "docker.1panel.live"
EOF
|
2. 配置无根模式(Rootless Mode)
1
2
3
4
5
6
7
8
9
|
# 添加专用用户
sudo useradd -r -m -s /bin/bash podman
# 配置用户子UID和子GID
echo "podman:100000:65536" | sudo tee -a /etc/subuid
echo "podman:100000:65536" | sudo tee -a /etc/subgid
# 启用用户 linger,允许用户无登录会话运行容器
sudo loginctl enable-linger podman
|
3. 解决无根模式下的警告
在非 root 用户下使用 Podman 时,可能会遇到 cgroup 警告,可以通过以下配置解决:
1
2
3
4
5
6
7
8
9
|
# 创建用户级配置目录
mkdir -p ~/.config/containers
# 创建配置文件
tee ~/.config/containers/containers.conf <<'EOF'
[engine]
events_logger = "file"
cgroup_manager = "cgroupfs"
EOF
|
📦 镜像管理
Podman 的镜像管理与 Docker 类似,但拉取镜像时通常需要指定完整的注册表路径。
常用镜像管理命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
# 搜索镜像
podman search nginx --filter=stars=5000
# 拉取镜像(需要指定完整注册表路径)
podman pull docker.io/library/nginx:latest
# 列出本地镜像
podman images
# 删除镜像
podman rmi -f feb5d9fea6a5
# 导出镜像
podman save -o nginx.tar docker.io/nginx
# 导入镜像
podman load -i nginx.tar
|
🐳 容器管理
1. 容器生命周期管理
1
2
3
4
5
6
7
8
9
10
|
# 创建并启动容器
podman run -itd --name my_nginx -p 80:80 nginx
# 启动/停止/重启容器
podman start my_nginx
podman stop my_nginx
podman restart my_nginx
# 删除容器
podman rm -f my_nginx
|
2. 容器交互与监控
1
2
3
4
5
6
7
8
9
10
11
|
# 进入容器终端
podman exec -it my_nginx /bin/bash
# 查看容器日志
podman logs -tf --tail 50 my_nginx
# 查看资源占用情况
podman stats my_nginx
# 查看容器进程信息
podman top my_nginx
|
3. 数据管理
1
2
3
4
5
|
# 目录挂载
podman run -v /host/path:/container/path nginx
# 文件复制
podman cp my_nginx:/etc/nginx/nginx.conf ./
|
🌐 网络与多容器实战(LEMP 环境)
1. 创建自定义网络
1
2
3
4
5
|
# 创建桥接网络
podman network create lemp --subnet 10.88.0.0/24
# 查看网络信息
podman network ls
|
2. 启动容器集群
1
2
3
4
5
6
7
8
9
10
11
|
# Nginx 容器
podman run -d --name nginx --network lemp --ip 10.88.0.10 \
-p 80:80 -v /html:/usr/share/nginx/html nginx
# PHP-FPM 容器
podman run -d --name php-fpm --network lemp --ip 10.88.0.20 \
-v /html:/var/www/html bitnami/php-fpm
# MariaDB 容器
podman run -d --name mariadb --network lemp --ip 10.88.0.30 \
-v /sql_data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=secret mariadb
|
3. Nginx 连接 PHP-FPM 配置
修改 Nginx 站点配置文件,添加 PHP 处理:
1
2
3
4
5
|
location ~ \.php$ {
fastcgi_pass 10.88.0.20:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
}
|
4. 测试容器通信
1
2
3
4
5
|
# 测试容器间通信
podman exec -it nginx ping php-fpm
# 测试与宿主机的通信
podman exec -it nginx ping host.containers.internal
|
⚡ 高级特性
1. Pod 管理
Podman 支持 Pod 概念,类似于 Kubernetes 中的 Pod,允许一组容器共享相同的网络、PID 和 IPC 命名空间。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# 创建 Pod(可能需要先拉取 infra 镜像)
podman pull registry.aliyuncs.com/google_containers/pause:3.2
podman image tag registry.aliyuncs.com/google_containers/pause:3.2 k8s.gcr.io/pause:3.2
podman pod create --name mypod
# 在 Pod 中运行容器
podman run -d --pod mypod --name container1 nginx
podman run -d --pod mypod --name container2 alpine ping 8.8.8.8
# 查看 Pod
podman pod ps
podman ps --pod
|
2. 特权容器
特权容器突破默认隔离限制,需谨慎使用:
1
2
3
4
5
6
7
8
|
# 访问主机进程
podman run --privileged --pid=host alpine ps aux
# 访问主机网络
podman run --net=host nginx
# 挂载主机设备
podman run --privileged -v /dev:/dev ubuntu
|
警告:特权容器存在安全风险,仅在必要时使用并配合 --cap-add
精细化授权。
🔄 系统服务与自启动
Podman 可以与 systemd 集成,将容器作为系统服务管理。
1. 生成 systemd 服务文件
1
2
3
4
5
6
|
# 生成服务文件
podman generate systemd --new --name nginx > ~/.config/systemd/user/container-nginx.service
# 启用并启动服务
systemctl --user enable container-nginx.service
systemctl --user start container-nginx.service
|
2. 启用用户级服务持久化
1
2
|
# 启用用户 linger,允许用户服务在无登录会话时运行
sudo loginctl enable-linger $USER
|
🔧 故障排查
1. 常见问题及解决方法
问题一:镜像拉取失败
1
2
3
4
5
|
# 检查注册表配置
cat /etc/containers/registries.conf
# 尝试使用其他镜像源
podman pull registry.aliyuncs.com/library/nginx
|
问题二:权限错误
1
2
3
4
5
6
7
|
# 检查用户命名空间配置
cat /etc/subuid
cat /etc/subgid
# 启用用户命名空间
echo 'kernel.unprivileged_userns_clone=1' | sudo tee /etc/sysctl.d/userns.conf
sudo sysctl -p
|
问题三:cgroup 警告
1
2
3
|
# 创建用户级配置解决 cgroup 警告
mkdir -p ~/.config/containers
echo -e "[engine]\nevents_logger = \"file\"\ncgroup_manager = \"cgroupfs\"" > ~/.config/containers/containers.conf
|
问题四:端口冲突
1
2
3
4
5
|
# 检查端口使用情况
ss -tulpn | grep :80
# 使用不同端口运行容器
podman run -d --name nginx -p 8080:80 nginx
|
📊 命令对比
Podman 与 Docker 命令对比表
功能 |
Docker 命令 |
Podman 命令 |
说明 |
列出容器 |
docker ps |
podman ps |
列出运行中的容器 |
列出镜像 |
docker images |
podman images |
列出本地镜像 |
运行容器 |
docker run |
podman run |
运行容器 |
构建镜像 |
docker build |
podman build |
构建镜像 |
容器编排 |
docker-compose up |
podman-compose up |
启动 compose 项目 |
查看日志 |
docker logs |
podman logs |
查看容器日志 |
执行命令 |
docker exec |
podman exec |
在容器中执行命令 |
📈 性能监控与优化
1. 资源监控
1
2
3
4
5
|
# 查看容器资源使用情况
podman stats
# 查看系统级容器资源使用
podman system df
|
2. 资源限制
1
2
|
# 运行带资源限制的容器
podman run -it --memory=512m --cpus=1.5 alpine
|
3. 清理无用资源
1
2
3
4
5
6
7
8
|
# 清理停止的容器
podman container prune
# 清理未使用的镜像
podman image prune
# 清理所有未使用的资源
podman system prune
|
💎 总结
Podman 是一个强大且安全的容器运行时工具,它以其无守护进程的架构和出色的 rootless 支持而脱颖而出。通过本指南,您应该能够:
- ✅ 在 Debian/Ubuntu 系统上安装和配置 Podman
- ✅ 使用国内镜像加速器提高拉取速度
- ✅ 管理容器和镜像,包括 Pod 的创建和管理
- ✅ 配置容器网络和多容器应用环境
- ✅ 将容器集成到 systemd 系统中作为服务运行
- ✅ 排查常见问题并优化性能
Podman 特别适合希望避免守护进程安全风险的用户,以及需要在非 root 环境下运行容器的场景。随着容器技术的不断发展,Podman 正成为一个越来越受欢迎的 Docker 替代方案。
📚 扩展资源