Podman vs Docker | Podman简介及安装


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 CLIchild process(子进程),而是Docker Enginechild process
  • Podman是直接给OCI containner runtime(runc)进行交互来创建container的,所以container process直接是podmanchild process

5. k8s弃用Docker

简单来讲就是 K8s 支持 Docker 的代价太大了。

查看官方声明

Docker并不支持CRI(容器运行时接口)这一Kubernetes运行时API,而Kubernetes用户一直以来所使用的其实是名为**dockershim**的桥接服务。Dockershim能够转换Docker APICRI,但在后续版本当中,Kubernetes将不再提供这项桥接服务。因为这太麻烦了。

原因1. k8s只需要Docker Engine中的Container Runtime

首先,对于 K8s 来说 Docker 太重了。

Docker 是包含了很多东西的,例如:

  • CLI
  • API
  • Server
  • Container Runtime
  • Volumes
  • Network
  • build image

但是 K8s 只是使用其中的 container runtime(容器运行环境)。

docker架构图

原因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查看

8. 参考

  1. Podman vs Docker: What are the differences?
  2. podman初试-和docker对比
  3. What is Podman?

文章作者: hjwforever
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 hjwforever !
评论
  目录