1. 前言
podman在功能上与docker不能说很像,只能说一模一样,甚至于你给podman取个别名为docker,你会发现这不就是docker吗?🤔接下来对比一下两者的异同吧。
alias docker=podman2. 什么是Docker
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。 by百度百科
3. 什么是Podman
 Podman 是一个开源的 Linux 原生工具,旨在根据开放容器计划 (OCI) 标准开发、管理和运行容器和 Pod。Podman 由 Red Hat 开发,是用户友好的容器编排器,是 RedHat 8 和 CentOS 8 自带的默认容器引擎。Podman 提供与 Docker 非常相似的功能。但是,它不需要在你的系统上运行任何守护进程,并且它也可以在没有root权限的情况下运行。实际上,它是一组命令行工具之一.
 这组命令行套件就是:
- Podman - Pods 和容器映像管理器
- Buildah - 容器生成器
- Skopeo - 容器映像检查管理器
- runc - 容器运行器和功能生成器到 podman 和 buildah
- crun - 可选的运行时,可为无根容器提供更大的灵活性、控制力和安全性
 这些工具还可以与任何OCI兼容的容器引擎(如Docker)配合使用,从而可以轻松过渡到Podman或将其用于现有的Docker安装。
那么,Kubernetes 可以使用 Podman 吗?
答案是可以的,而且在k8s中使用podman比使用Docker更好。这就要谈到它们之间的差异了。
4. Docker vs Podman
Podman和Docker从使用上来说几乎是一模一样的,而他们的差异就在于底层。
不同1. 架构设计不同
Docker 有一个由用来调解客户与服务器逻辑的守护进程; 而Podman 不需要这个中介。
- Docker 使用守护程序(一个在后台运行的持续程序)来创建映像和运行容器。 
- Podman有一个无守护进程的的容器引擎,用于在 Linux 系统上进行开发、管理和运行 OCI Containers。 Containers 能以 root 模式运行,也能以非 root 模式运行**。 
不同2. 安全性不同
- Podman 允许容器的非 root 用户权限。无根容器被认为比具有 root 权限的容器更安全。Podman 中的容器默认没有 root 访问权限,这在 root 和非 root之间增加了一道天然屏障,从而提高了安全性。尽管如此,Podman仍然可以运行root和非 root容器。 
- 而在 Docker 中,守护程序具有 root 权限,使其成为攻击者的首选网关。 
不同3. 启动方式不同
- docker cli命令通过API跟- Docker Engine(引擎)交互告诉它我想创建一个container,然后- docker Engine才会调用- OCI container runtime(runc)来启动一个container。这代表container的process(进程)不会是- Docker CLI的- child process(子进程),而是- Docker Engine的- child process。
- Podman是直接给- OCI containner runtime(runc)进行交互来创建container的,所以- container process直接是- podman的- child process。
5. k8s弃用Docker
简单来讲就是 K8s 支持 Docker 的代价太大了。
Docker并不支持CRI(容器运行时接口)这一Kubernetes运行时API,而Kubernetes用户一直以来所使用的其实是名为**dockershim**的桥接服务。Dockershim能够转换Docker API与CRI,但在后续版本当中,Kubernetes将不再提供这项桥接服务。因为这太麻烦了。
原因1. k8s只需要Docker Engine中的Container Runtime
首先,对于 K8s 来说 Docker 太重了。
Docker 是包含了很多东西的,例如:
- CLI
- API
- Server
- Container Runtime
- Volumes
- Network
- build image
但是 K8s 只是使用其中的 container runtime(容器运行环境)。

原因2. k8s支持Docker的话需要额外付出许多
其次,K8s 为了支持 Docker 还需要单独开发和维护一个组件 – **dockershim**。
因为 Docker 不支持 K8s 的 CRI 标准,所以 K8s 需要搭建一个对接 Docker 的桥梁,就是 dockershim。
dockershim 只是一个临时解决方案,长期的维护越来越麻烦,例如不兼容 cgroups v2、用户命名空间等新特性。
主要基于以上两个原因,K8s 决定弃用 Docker。
6. Podman的安装
[官网安装教程](Podman Installation)
CentOS
注意:Podman 在 CentOS 7 的默认 Extras 存储库和 CentOS 8 和 Stream 的 AppStream 存储库中可用。
sudo yum -y install podmanUbutun 20.10 及以后新版
sudo apt-get -y update
sudo apt-get -y install podmanUbuntu 20.04 或 低版本安装
. /etc/os-release
echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_${VERSION_ID}/ /" | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list
curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_${VERSION_ID}/Release.key | sudo apt-key add -
sudo apt-get update
sudo apt-get -y upgrade
sudo apt-get -y install podman
Debian
Debian 11(Bullseye)存储库及更高版本支持
sudo yum -y install podmanFedora
sudo dnf -y install podman7. Podman的使用
podman命令与docker可以说一模一样,如果你熟悉docker的话,那就是无缝切换 alias docker=podman : )
检查版本
podman --version运行容器
podman run -dt -p 80:80 --name nginx -v nginx列出正在运行的容器
podman ps查看一个容器信息
ps: 这里的nginx是运行容器时通过 --name nginx 设置的别名, 也可以使用容器id来指定所要查看的容器
podman inspect nginx查看日志
podman logs nginx查看运行中容器的资源使用情况
podman top nginx
podman stats nginx迁移容器
Podman 支持将容器从一台机器迁移到另一台机器。
首先,在源机器上对容器设置检查点,并将容器打包到指定位置。
sudo podman container checkpoint <container_id> -e /tmp/checkpoint.tar.gz
scp /tmp/checkpoint.tar.gz <destination_system>:/tmp然后,在目标机器上使用源机器上传输过来的打包文件对容器进行恢复。
sudo podman container restore -i /tmp/checkpoint.tar.gz更多命令可以通过命令podman help查看
 
                     
                     
                        
                        