Podman 学习总结
Podman 概述
什么是 Podman?
Podman(Pod Manager)是一个开源的容器管理工具,类似于 Docker,可以用于拉取、运行、管理容器镜像。Podman 采用 无守护进程****(Daemonless) 的架构,使其更加安全和轻量级,适用于多种容器化场景。
Podman 与 Docker 的区别
特性 | Podman | Docker |
---|---|---|
架构 | 无守护进程(Daemonless) | 需要 Docker Daemon |
权限 | 支持 Rootless 模式(非 root 用户运行) | 需要 root 权限(默认) |
Pod 支持 | 原生支持 Pod(类似 Kubernetes) | 需要使用 docker-compose 实现多容器管理 |
兼容性 | 兼容 Docker 命令,可替代 docker | 原生支持 Docker |
安全性 | 更安全(不依赖 root 权限) | 需要额外配置 rootless 运行 |
存储 | 每个用户都有独立的存储空间 | 共享 /var/lib/docker 存储 |
守护进程 | 无需后台运行 | 需要 dockerd 作为后台服务 |
Kubernetes 兼容性 | 直接支持 K8s yaml 配置 | 需要 docker-compose 或 K8s 适配 |
远程管理 | 需要 podman system service | Docker 原生支持 docker -H 远程管理 |
****Podman 的核心特点
- 无守护进程(Daemonless)
- Docker 依赖
dockerd
运行容器,而 Podman 直接执行容器,避免了单点故障和权限管理问题。
- Docker 依赖
- Rootless(非 root 权限运行)
- 普通用户可以运行容器,避免
root
账户被攻击,提高安全性。 podman unshare
进入无特权的用户命名空间。
- 普通用户可以运行容器,避免
- Pod 支持
- Podman 原生支持 Pod,类似 Kubernetes 里的 Pod,可以管理多个容器共享网络和存储。
- 与 Docker 兼容
- 使用
podman alias docker
直接替代 Docker 命令,无需修改 Docker CLI 命令。 podman generate kube
直接生成 Kubernetes YAML 配置,方便迁移。
- 使用
- 系统集成
podman generate systemd
生成 systemd 服务,实现自动化管理。- 支持 OCI 标准,可用于 OpenShift、Kubernetes 等平台。
Podman 适用的场景**
- 安全性要求高的环境**
- 由于 Podman 支持 Rootless 模式,可避免容器运行时以 root 权限执行,降低安全风险。
- ****轻量级容器管理
- Podman 无需守护进程,适合资源受限的服务器或本地开发环境。
- Kubernetes 开发**
- Podman 的 Pod 支持 让其更接近 Kubernetes 的运行模式,适合开发 K8s 应用。
- 兼容 Docker,想要迁移**
- 如果想摆脱 Docker Daemon,但仍然希望使用类似 Docker 的 CLI 命令,Podman 是一个很好的替代方案。
- 系统服务(systemd)**
- 通过
podman generate systemd
可创建 Linux 的systemd
服务,适用于长期运行的应用程序。
- 通过
总结
Podman 是一个更安全、灵活、轻量的容器管理工具,适用于开发、运维、K8s 生态。
Podman 安装指南
Podman 可以在 Linux、macOS 和 Windows(WSL & Native) 等环境下运行。下面介绍不同操作系统的安装方法,以及如何使用 国内镜像源 加速下载,并验证安装是否成功。
Linux 安装 Podman
直接通过包管理器安装。
Ubuntu / Debian
sudo apt update
sudo apt install -y podman
CentOS / RHEL
sudo yum install -y podman
CentOS 8+(使用 dnf)
sudo dnf install -y podman
macOS 安装 Podman
Podman 提供了 macOS 原生支持,可通过 brew
安装:
brew install podman
初始化 Podman 环境 由于 macOS 没有原生的 Linux 内核,Podman 需要运行在虚拟机(QEMU)上:
podman machine init
podman machine start
查看版本,验证是否安装成功:
podman version
配置国内镜像源(加速拉取镜像)
由于国内访问 Docker Hub 较慢,可以配置国内镜像加速:
sudo mkdir -p /etc/containers
sudo tee /etc/containers/registries.conf <<EOF
[registries.search]
registries = ["docker.io", "quay.io", "registry.fedoraproject.org", "registry.access.redhat.com"]
[registries.insecure]
registries = []
[registries.mirrors]
"docker.io" = { "endpoint" = [ "https://mirror.baidubce.com", "https://registry.docker-cn.com" ] }
EOF
命令解析:
sudo mkdir -p /etc/containers
mkdir -p /etc/containers
:创建/etc/containers
目录(如果已存在,则不会报错)。sudo
:以 管理员权限 执行。
sudo tee /etc/containers/registries.conf <<EOF
...
EOF
tee
命令:将 EOF 之间的内容写入/etc/containers/registries.conf
配置文件(如果文件已存在,则覆盖)。<<EOF ... EOF
:表示将多行文本输入到文件。
[registries.search]
registries = ["docker.io", "quay.io", "registry.fedoraproject.org", "registry.access.redhat.com"]
- 定义默认的搜索镜像源,优先从
docker.io
拉取镜像。 quay.io
、registry.fedoraproject.org
、registry.access.redhat.com
也作为备选源。
[registries.insecure]
registries = []
- 不信任的镜像仓库,这里为空,意味着不允许拉取来自不安全(HTTP 而非 HTTPS)的镜像源。
[registries.mirrors]
"docker.io" = { "endpoint" = [ "https://mirror.baidubce.com", "https://registry.docker-cn.com" ] }
- 配置国内加速镜像源,以加快
docker.io
的镜像拉取速度:https://mirror.baidubce.com
(百度云加速)https://registry.docker-cn.com
(Docker 中国官方加速)
然后 重启 Podman
systemctl restart podman
验证 Podman 是否安装成功
安装完成后,可以运行以下命令检查 Podman 是否正常运行:
检查 Podman 版本
podman version
示例输出:
Version: 4.5.1
测试运行容器
podman run --rm hello-world
如果输出类似:
Hello from Podman!
说明 Podman 已成功运行。
查看 Podman 进程
podman ps -a
结论
- Linux 用户 直接使用 包管理器安装。
- macOS 用户 需要 安装后初始化虚拟机 (
podman machine init
)。 - Windows 用户 可以使用 WSL 方式(推荐) 或 Native 版本。
- 国内加速 可以配置
registries.conf
使用国内镜像源。 - 运行
podman run hello-world
验证安装 是否成功。
Podman 基础命令
- 镜像管理
podman pull <image> # 拉取镜像
podman images # 查看本地镜像
podman rmi <image> # 删除镜像
- 容器管理
podman run -it --rm alpine sh # 运行容器并进入 Shell
podman ps # 查看运行中的容器
podman ps -a # 查看所有容器
podman stop <container> # 停止容器
podman rm <container> # 删除容器
- 容器日志和状态管理
podman logs <container> # 查看日志
podman inspect <container> # 查看容器详细信息
podman stats # 实时查看资源占用
Podman 高级功能
- Pod 支持
podman pod create --name mypod
podman run -dt --pod mypod nginx
podman pod ps
podman pod rm mypod
- Rootless 容器
- 非 root 用户运行容器
podman unshare
进入无特权环境
- 与 systemd 集成
podman generate systemd --name mycontainer
- 端口映射与网络
podman network create mynet
podman run -dt --network mynet nginx
- 存储管理
podman volume create myvol
podman volume ls
podman run -v myvol:/data -it ubuntu bash
Podman 与 Docker 兼容
Podman 与 Docker 兼容性
Podman 作为 Docker 的无守护进程(Daemonless)替代品,提供了一些兼容 Docker 的功能,确保开发者可以无缝切换。以下是具体的兼容方式:
alias docker=podman
alias docker=podman
- 这条命令 创建一个 shell 别名,让
docker
命令自动映射为podman
,从而在终端运行docker
命令时,实际上执行的是podman
。 - 这样,无需更改已有的 Docker 命令,就能使用 Podman。
永久生效
如果想让 alias docker=podman
长期生效,可以:
echo "alias docker=podman" >> ~/.bashrc # Bash 用户
source ~/.bashrc
echo "alias docker=podman" >> ~/.zshrc # Zsh 用户
source ~/.zshrc
兼容 Docker CLI 和 Compose
Podman 提供 与 Docker CLI 兼容的接口,意味着大部分 Docker 命令可以直接用 Podman 运行:
podman run -d --name nginx -p 8080:80 nginx
podman ps -a
podman stop nginx
podman rm nginx
- 支持
docker
命令格式,直接替换docker
为podman
即可。 - **支持 **
podman-compose
,可以管理docker-compose.yml
文件:
sudo dnf install -y podman-compose # Fedora/CentOS/RHEL
sudo apt install -y podman-compose # Debian/Ubuntu
podman-compose up -d
podman-compose down
podman generate kube 生成 K8s 资源
Podman 支持 Kubernetes (K8s) YAML 资源生成,可以将 Podman 容器转换成 K8s 配置:
podman run -d --name mynginx -p 8080:80 nginx
podman generate kube mynginx > mynginx.yaml
podman generate kube
命令会自动转换 Podman 容器到 Kubernetes YAML 资源。- 示例 YAML
apiVersion: v1
kind: Pod
metadata:
name: mynginx
spec:
containers:
- name: mynginx
image: docker.io/library/nginx
ports:
- containerPort: 80
hostPort: 8080
- 这样可以 快速迁移到 Kubernetes,无需手动编写 YAML!
迁移现有 Docker 镜像/容器到 Podman
(1)迁移 Docker 镜像
Podman 兼容 Docker 的 OCI 镜像格式,可以直接使用 docker save
+ podman load
迁移:
docker save myimage:latest -o myimage.tar
podman load -i myimage.tar
docker save
:导出 Docker 镜像到tar
文件。podman load
:导入tar
文件到 Podman。
(2)迁移 Docker 容器
如果要迁移运行中的 Docker 容器:
docker export mycontainer -o mycontainer.tar
podman import mycontainer.tar mynewimage
docker export
:导出 Docker 容器文件系统。podman import
:导入文件系统作为新的 Podman 镜像。
总结
兼容方式 | 说明 |
---|---|
alias docker=podman | 让 Podman 兼容 Docker 命令,减少学习成本 |
兼容 Docker CLI & Compose | podman 命令格式与 Docker 兼容,并支持 podman-compose |
podman generate kube | 直接将 Podman 容器转换为 Kubernetes 资源 |
迁移 Docker 镜像/容器 | 使用 docker save/load 和 export/import 进行迁移 |
Podman 在生产环境中的应用
Podman 作为无守护进程(Daemonless)的容器管理工具****,适用于生产环境,因为它更安全、兼容 Docker、支持 Kubernetes。
Podman 在 CI/CD(持续集成/部署)中的使用
(1)使用 Podman 构建容器镜像
在 CI/CD 过程中,Podman 可用于构建和推送容器镜像:
podman build -t myapp:latest .
podman tag myapp:latest myregistry.com/myapp:latest
podman push myregistry.com/myapp:latest
podman build
:构建镜像,类似docker build
。podman push
:推送镜像到私有仓库(如 Harbor, Nexus, 阿里云容器服务等)。- Podman 支持 Rootless,比 Docker 更安全,适合 CI/CD 环境。
(2)在 GitLab CI/CD 中使用 Podman
GitLab Runner 默认使用 Docker,但也支持 Podman,配置方式如下:
stages:
- build
- deploy
build:
stage: build
image: quay.io/podman/stable
script:
- podman build -t myapp:latest .
- podman tag myapp:latest registry.example.com/myapp:latest
- podman push registry.example.com/myapp:latest
deploy:
stage: deploy
image: quay.io/podman/stable
script:
- ssh user@server "podman pull registry.example.com/myapp:latest && podman run -d --name myapp -p 80:8080 myapp:latest"
- 使用 Podman 代替 Docker 进行构建、推送、部署,避免 Docker Daemon 的权限问题。
****Podman 与 Kubernetes 的结合
(1)Podman 生成 Kubernetes 资源
Podman 可以直接将运行的容器转换为 Kubernetes Pod:
podman run -d --name myapp -p 8080:80 nginx
podman generate kube myapp > myapp.yaml
生成的 myapp.yaml
Kubernetes 配置:
apiVersion: v1
kind: Pod
metadata:
name: myapp
spec:
containers:
- name: myapp
image: docker.io/library/nginx
ports:
- containerPort: 80
hostPort: 8080
- 该 YAML 可直接应用到 Kubernetes 集群:
kubectl apply -f myapp.yaml
(2)使用 Podman 运行 Kubernetes Pod
Podman 提供 podman play kube
命令,可以直接运行 Kubernetes YAML:
podman play kube myapp.yaml
- 适用于本地调试 Kubernetes 资源,无需完整的 Kubernetes 集群。
(3)Podman 作为 Kubernetes 节点运行 CRI-O
Podman 使用 CRI-O
作为 Kubernetes 容器运行时:
sudo dnf install -y cri-o
sudo systemctl enable --now crio
然后在 Kubernetes 中使用 Podman 作为容器运行时:
kubeadm init --cri-socket=/var/run/crio/crio.sock
- 替代 Docker 作为 Kubernetes 的容器运行时,减少资源占用,提高安全性。
****Podman 在服务器上的运维方案
(1)Podman Systemd 管理容器
Podman 可以使用 systemd
来管理容器,实现自动启动:
podman generate systemd --name myapp -f > /etc/systemd/system/myapp.service
systemctl daemon-reload
systemctl enable --now myapp
- 支持开机自启动
- 兼容 systemd,适用于生产环境
(2)Podman 日志管理
Podman 默认使用 journald
管理日志,可以查看容器日志:
journalctl -u myapp --no-pager
或者直接用 Podman:
podman logs -f myapp
(3)Podman Checkpoint & Restore
Podman 支持容器快照与恢复,可用于服务器故障恢复:
podman container checkpoint myapp
podman container restore myapp
- 容器状态保存,支持断电、迁移后恢复。
总结
生产环境应用 | 具体方案 |
---|---|
CI/CD | podman build/push 构建、推送镜像,GitLab CI/CD 集成 |
Kubernetes | podman generate kube 转换 Kubernetes 资源,使用 play kube 运行 Pod |
服务器运维 | systemd 自动管理容器、日志监控、Checkpoint & Restore 容器恢复 |
重点归纳
- 掌握 Podman 的基本和高级用法
- 了解 Podman 在开发与生产环境中的应用
- 替换或兼容 Docker,提升容器管理能力