【基础架构】容器引擎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将不再提供这项桥接服务。