原创

干货|是podman新王当立,还是docker风采依旧?

kubernetes将弃用docker

2020年12月2日,kubernetes官网发布了一篇文章,大概意思就是kubernetes即将放弃内置docker shim,docker shim在kubelet中使用,实现了对docker的CRI支持。未来想在kubernetes中使用docker,就需要在外部使用docker shim,或者使用其他的CRI。

于是就有不少“Docker 大势已去,Podman 即将崛起”的言论,今天我们就来谈谈是podman新王当立,还是docker风采依旧?

什么是Podman?

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

Podman 可以管理和运行任何符合 OCI(Open Container Initiative)规范的容器和容器镜像。Podman 提供了一个与 Docker 兼容的命令行前端来管理 Docker 镜像。

Podman和Docker的7项主要区别

1.dockers在实现CRI的时候,它需要一个守护进程,其次需要以root运行,因此这也带来了安全隐患;

2.podman不需要守护程序,也不需要root用户运行,从逻辑架构上,比docker更加合理;

3.在docker的运行体系中,需要多个daemon才能调用到OCI的实现RunC;

4.在容器管理的链路中,Docker Engine的实现就是dockerd;

5.daemon,它在linux中需要以root运行,dockerd调用containerd,containerd调用containerd-shim,然后才能调用runC。顾名思义shim起的作用也就是“垫片”,避免父进程退出影响容器的运训;

6.podman直接调用OCI,runtime(runC),通过common作为容器进程的管理工具,但不需要dockerd这种以root身份运行的守护进程;

7.在podman体系中,有个称之为common的守护进程,其运行路径通常是/usr/libexec/podman/conmon,它是各个容器进程的父进程,每个容器各有一个,common的父则通常是1号进程。podman中的common其实相当于docker体系中的containerd-shim;

吹爆 podman,大可不必

首先,podman能否被市场广泛接受还需要时间的检验。

podman cli 中有87%的指令都和docker cli相同,基本上把docker命令套用在podman上就可以用。

podman的安装:


sudo curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable.repo https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/CentOS_7/devel:kubic:libcontainers:stable.repo
sudo yum -y install yum-plugin-copr
sudo yum -y copr enable lsm5/container-selinux
sudo yum -y install podman

查看podman的版本

[root@VM-0-5-centos ~]# podman --version
podman version 2.2.1

我们之前写的Dockerfile,在podman中一样能跑,执行命令都跟docker一模一样:

[root@VM-0-5-centos dockerfile]# podman build -t image_002 .
STEP 1: FROM alpine:latest
STEP 2: MAINTAINER autor_fangfu
--> Using cache 3f9945501e95a8aa4e9eb5922beff64f9ee3ca1a07093f9bf21a49bfd9751106
--> 3f9945501e9
STEP 3: RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories     && apk add nodejs     && apk add npm     && apk add git     && apk add sysstat     && npm i egg-init -g     && apk add tzdata && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime     && echo "Asia/Shanghai" > /etc/timezone     && apk del tzdata 
--> Using cache 74cfd9c374874084e0e0ad4821d074942103414a2d56bd961b4b22d48aa2f959
--> 74cfd9c3748

通过镜像也能创建容器:

[root@VM-0-5-centos ~]# podman run -itd --name test002 image_002 sh
691daa088d46b4f1b798f5956e87d94157a2f0e5368677793cfeecf06ef100fe

不过在拉取公共镜像的速度方面,podman就不如docker快。一样的服务器,

这边docker已经拉取完毕了:

[root@VM-0-5-centos ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
7a0437f04f83: Pull complete 
Digest: sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest

podman还有很长的进度条要走:

[root@VM-0-5-centos dockerfile]# podman pull centos
Resolved short name "centos" to a recorded short-name alias (origin: /etc/containers/registries.conf.d/shortnames.conf)
Trying to pull registry.centos.org/centos:latest...
Getting image source signatures
Copying blob c721dabf6e34 [===>----------------------------------] 6.7MiB / 72.6MiB

其次,podman 安装麻烦 ,文档没有 docker 方便,以 manjaro 为例:

podman:

pacman -S podman podman-compose
/etc/containers/registries.conf(拉镜像一直报错,百度了半天才知道怎么解决)



# vim /etc/containers/registries.conf


[registries.search]
registries = ['docker.io']


[registries.insecure]
registries = []


# Docker only
[registries.block]
registries = []
rootless(run也是一直报错,问了别的小伙伴才知道怎么解决)



touch /etc/subuid
touch /etc/subgid


usermod --add-subuids 165536-231072 --add-subgids 165536-231072 happyxhw
podman system migrate
podman unshare cat /proc/self/uid_map

docker:

pacman -S docker docker-compose
sudo systemctl start docker
sudo systemctl enalbe docker
usermod -aG docker happyxhw

对于开发环境而言,rootless 并不重要,能够快速启动、开机自启反而更重要,docker-compose 太好用了,podman-compose 并不能完全兼容 docker-compose。

以 postgres 为例,如果在本地部署一个能用的 postgres 数据库,要求:1、持久化数据;2、开机自启;3、配置固定,迁移方便。

version: "3"
services:
db:
image: "postgres"
restart: always
container_name: "postgres"
environment:

  - POSTGRES_USER=happyxhw
  - POSTGRES_PASSWORD=xxxxx
  - POSTGRES_DB=xxxxx
ports:
  - "5432:5432"
volumes:
  - data:/var/lib/postgresql/data

volumes:
data:

k8s 不使用 docker,完全不影响你本地使用 docker,而本地使用 podman 的体验确实不好。

现在让我们总结一下,对于一个服务开发人员,k8s 用不用 docker 几乎没有任何影响;本地开发,还是docker的天下,配合 docker-compose 和 kompose 体验还是很好!

不过在某些情况,比如生产环境不使用 k8s,确实可以考虑迁移 docker 到 podman,所以在一定程度上docker 确实日渐式微。

正文到此结束
该篇文章的评论功能已关闭
本文目录