当前位置: 首页 > news >正文

Podman 学习总结

Podman 概述

什么是 Podman?

Podman(Pod Manager)是一个开源的容器管理工具类似于 Docker,可以用于拉取、运行、管理容器镜像。Podman 采用 无守护进程****(Daemonless) 的架构,使其更加安全和轻量级,适用于多种容器化场景。

Podman 与 Docker 的区别

特性PodmanDocker
架构无守护进程(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 serviceDocker 原生支持 docker -H
远程管理

****Podman 的核心特点

  1. 无守护进程(Daemonless)
    • Docker 依赖 dockerd 运行容器,而 Podman 直接执行容器,避免了单点故障和权限管理问题。
  2. Rootless(非 root 权限运行)
    • 普通用户可以运行容器,避免 root 账户被攻击,提高安全性。
    • podman unshare 进入无特权的用户命名空间。
  3. Pod 支持
    • Podman 原生支持 Pod,类似 Kubernetes 里的 Pod,可以管理多个容器共享网络和存储。
  4. 与 Docker 兼容
    • 使用 podman alias docker 直接替代 Docker 命令,无需修改 Docker CLI 命令。
    • podman generate kube 直接生成 Kubernetes YAML 配置,方便迁移。
  5. 系统集成
    • 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.ioregistry.fedoraproject.orgregistry.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

结论

  1. Linux 用户 直接使用 包管理器安装
  2. macOS 用户 需要 安装后初始化虚拟机 (podman machine init)。
  3. Windows 用户 可以使用 WSL 方式(推荐)Native 版本
  4. 国内加速 可以配置 registries.conf 使用国内镜像源。
  5. 运行 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 命令格式,直接替换 dockerpodman 即可。
  • **支持 **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 & Composepodman 命令格式与 Docker 兼容,并支持 podman-compose
podman generate kube直接将 Podman 容器转换为 Kubernetes 资源
迁移 Docker 镜像/容器使用 docker save/loadexport/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/CDpodman build/push 构建、推送镜像,GitLab CI/CD 集成
Kubernetespodman generate kube 转换 Kubernetes 资源,使用 play kube 运行 Pod
服务器运维systemd 自动管理容器、日志监控、Checkpoint & Restore 容器恢复

重点归纳

  • 掌握 Podman 的基本和高级用法
  • 了解 Podman 在开发与生产环境中的应用
  • 替换或兼容 Docker,提升容器管理能力

相关文章:

  • Can Large Language Models be Anomaly Detectors for Time Series? 解读
  • C#中Interlocked.Exchange的作用
  • vmware虚拟机快照、克隆、迁移区别说明
  • sonar代码检测研究及平台搭建
  • Vue+SpringBoot:整合JasperReport作PDF报表,并解决中文不显示问题
  • 统计可重复列表中的TOP N
  • 路由工程师大纲-3:结合AI技术进行路由策略优化的知识链体系
  • P1102 A-B 数对
  • github_本地项目上传到远程
  • python 模拟登录
  • 阶跃星辰 Step-Video-TI2V 图生视频模型深度解析
  • 自由学习记录(47)
  • 10分钟读完《有限与无限的游戏》
  • 两个手机都用流量,IP地址会一样吗?深入解析
  • 【计算机网络】TCP协议技术细节全解析:与UDP的核心差异深度对比
  • 餐饮管理系统的设计与实现(代码+数据库+LW)
  • 新书速览|云原生Kubernetes自动化运维实践
  • 2024年数维杯数学建模B题生物质和煤共热解问题的研究解题全过程论文及程序
  • Linux运维篇-系统io调优
  • 《基于Python的财务数据可视化与决策支持系统开发》开题报告
  • 美国失去最后的AAA主权评级,继标普、惠誉后再遭穆迪降级
  • 网易有道一季度净利润同比增长247%:有能力在今年实现更强劲的利润增长
  • 侵害孩子者,必严惩不贷!3名性侵害未成年人罪犯今日执行死刑
  • 350种咖啡主题图书集结上海,20家参展书店买书送咖啡
  • 上海制造佳品汇大阪站即将启幕,泡泡玛特领潮出海
  • 创同期历史新高!1至4月全国铁路发送旅客14.6亿人次