Featured image of post Podman 容器引擎安装与配置 🚀

Podman 容器引擎安装与配置 🚀

Podman 容器引擎安装与配置 🚀 📦 一个无需守护进程、更安全可靠的容器运行时工具</

Podman 容器引擎安装与配置 🚀

Podman Banner

📦 一个无需守护进程、更安全可靠的容器运行时工具

目录

🌟 项目简介

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 支持而脱颖而出。通过本指南,您应该能够:

  1. ✅ 在 Debian/Ubuntu 系统上安装和配置 Podman
  2. ✅ 使用国内镜像加速器提高拉取速度
  3. ✅ 管理容器和镜像,包括 Pod 的创建和管理
  4. ✅ 配置容器网络和多容器应用环境
  5. ✅ 将容器集成到 systemd 系统中作为服务运行
  6. ✅ 排查常见问题并优化性能

Podman 特别适合希望避免守护进程安全风险的用户,以及需要在非 root 环境下运行容器的场景。随着容器技术的不断发展,Podman 正成为一个越来越受欢迎的 Docker 替代方案。

📚 扩展资源

最后更新于 2025-09-28