【基础架构】容器引擎Docker与Podman解析

原文:https://mp.weixin.qq.com/s?__biz=MzA4MjM3NzE5MQ==&mid=2649662329&idx=1&sn=868699371a1cb8eb7de230afe80cdae4&chksm=879ca3f1b0eb2ae7342b8ced71a333fd5f1d3ab5d9339264437cb02568169f19c769ca74ae5c&cur_album_id=1987595953092034565&scene=189#wechat_redirect

一、Docker介绍

Docker体系结构基于守护程序,该守护程序在后台作为服务运行。Docker守护程序负责运行命令,将镜像推入/拉出仓库或从中拉出镜像,管理计算机上的容器和镜像。Docker的体系架构,具体如下所示:

 

Docker体系主要围绕“Docker Daemon”和“Docker CLI”两大核心组件运行:

  Docker Daemon:一个常驻的系统后台进程,帮助管理和创建Docker镜像、容器、网络和存储卷等。

  Docker CLI:一个用来与Docker守护进程进行交互的Docker命令行客户端。

  

二、Podman简介

  Podman是一个开源的容器运行时项目,可在大多数Linux平台上使用。Podman提供与Docker非常相似的功能,但是它不需要在系统上运行任何守护进程,并且它也可以在没有root权限的情况下运行。

  Podman可以管理和运行任何符合OCI(Open Container Initiative)规范的容器和容器镜像。Podman提供了一个于Docker兼容的命令行前端来管理Docker镜像。Podman的体系架构如下图:

  

 

 

相比Docker,Podman没有Daemon的概念,直接通过OCI runtime(默认runc)来启动容器,容器的进程是Podman的子进程。这比较像Linux的fork/exec模型,而Docker采用的是C/S(客户端/服务器)模型。与C/S模型相比,fork/exec模型有很多优势。

 

三、Docker与Podman对比

  Docker需要在系统上运行一个守护进程(Docker Daemon),而Podman则不需要。

  两者启动容器的方式不同:

  1、Docker Cli命令通过API和Docker Engine(引擎)交互告诉它想创建一个Container,然后Docker Engine才会调用OCI Container Runtime(runc)来启动一个Container。这代表Container的Process进程不是Docker CLI的子进程,而是Docker Engine的子进程。

  2、Podman是直接给OCI Container Runtime(runc)进行交互来创建Container的,所以Container Process直接是Podman的子进程。

  3、因为Docker有Docker Daemon,所以Docker启动的容器支持--restart策略,但Podman不支持,如果在K8s中就不存在这个问题,可以设置Pod的重启策略,在系统中我们可以采用编写Systemd服务来完成自启动。

  4、Docker需要使用root用户来创建容器,而Podman则不需要。

 

四、K8s与Docker

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

 

posted @ 2022-07-15 14:59  stay_heart  阅读(667)  评论(0编辑  收藏  举报