1. 前言
podman在功能上与docker不能说很像,只能说一模一样,甚至于你给podman取个别名为docker,你会发现这不就是docker吗?🤔接下来对比一下两者的异同吧。
alias docker=podman
2. 什么是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 podman
Ubutun 20.10 及以后新版
sudo apt-get -y update
sudo apt-get -y install podman
Ubuntu 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 podman
Fedora
sudo dnf -y install podman
7. 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
查看