卖兜搞IT

Docker vs Podman

Docker vs Podman

用了一段时间的podman,感觉还不错,给大家推荐一下。今天我们主要来说说podman和docker的不同之处。至于如何使用,就太简单了,基本和docker一样,这里就不介绍了。

Image

Podman是Redhat推出的开源容器产品,主要目标是替代docker (这里大家注意Docker本身其实是商业产品,包括商标都由Docker公司所有)。

Podman和Docker的主要区别有两个, 用两个单词就可以概括:

•Daemonless•Rootless

Daemonless

Daemonless就是Podman没有一个Daemon进程常驻后台。这样从架构上就比Docker简单很多,效率高且稳定。

Docker是CS架构。是由docker client + docker engine组成的,两者之间通过Unix socket进行API通信。我们通过ps就可以查看到后台有一个dockerd的进程,root权限

$ ps -ef | grep dockerddemo     17951 17862  0 13:01 pts/0    00:00:00 grep --color=auto dockerdroot     27193     1  0 10:57 ?        00:00:01 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

当我们执行docker CLI的命令的时候,实际上是和这个dockerd所绑定的socket进行通信(API),比如下面的命令返回的结果,和我们执行docker version的结果基本是一样的

$ sudo curl --unix-socket /var/run/docker.sock http:/v1.41/version | jq{  "Platform": {    "Name": "Docker Engine - Community"  },  "Components": [    {      "Name": "Engine",      "Version": "20.10.5",      "Details": {        "ApiVersion": "1.41",        "Arch": "amd64",        "BuildTime": "2021-03-02T20:32:17.000000000+00:00",        "Experimental": "false",        "GitCommit": "363e9a8",        "GoVersion": "go1.13.15",        "KernelVersion": "3.10.0-1127.el7.x86_64",        "MinAPIVersion": "1.12",        "Os": "linux"      }    },    ....    ....

Rootless

docker的后台进程docked需要root权限启动。这就导致我们再使用docke的时候,需要使用sudo或者把当前用户添加到docker group里。

而podman不需要root,也不需要sudo,普通用户就可以了。

Rootless有那么重要么?

docker的root权限一直是其遭受诟病的地方,有些同学可能不理解,docker的root权限有那么危险么?我们举个例子。

假如我们有一个用户,叫demo,它本身不具有sudo的权限,所以就有很多文件无法进行读写操作,比如/root目录它是无法查看的。

[demo@docker-host ~]$ sudo ls /root[sudo] password for demo:demo is not in the sudoers file.  This incident will be reported.[demo@docker-host ~]$

但是这个用户有执行docker的权限,也就是它在docker这个group里。

[demo@docker-host ~]$ groupsdemo docker[demo@docker-host ~]$ docker image lsREPOSITORY   TAG       IMAGE ID       CREATED      SIZEbusybox      latest    a9d583973f65   2 days ago   1.23MB[demo@docker-host ~]$

这时,我们就可以通过Docker做很多越权的事情了,比如,我们可以把这个无法查看的/root目录映射到docker container里,你就可以自由进行查看了。

[demo@docker-host vagrant]$ docker run -it -v /root/:/root/tmp busybox sh/ # cd /root/tmp~/tmp # lsanaconda-ks.cfg  original-ks.cfg~/tmp # ls -ltotal 16-rw-------    1 root     root          5570 Apr 30  2020 anaconda-ks.cfg-rw-------    1 root     root          5300 Apr 30  2020 original-ks.cfg~/tmp #

更甚至我们可以给我们自己加sudo权限。我们现在没有sudo权限

[demo@docker-host ~]$ sudo vim /etc/sudoers[sudo] password for demo:demo is not in the sudoers file.  This incident will be reported.[demo@docker-host ~]$

但是我可以给自己添加。

[demo@docker-host ~]$ docker run -it -v /etc/sudoers:/root/sudoers busybox sh/ # echo "demo    ALL=(ALL)       ALL" >> /root/sudoers/ # more /root/sudoers | grep demodemo    ALL=(ALL)       ALL

然后退出container,bingo,我们有sudo权限了。

[demo@docker-host ~]$ sudo more /etc/sudoers | grep demodemo    ALL=(ALL)       ALL[demo@docker-host ~]$

但是在podman里这是不可以的

[vagrant@podman-host ~]$ podman run -it -v /etc/sudoers:/root/sudoers busybox sh/ # more /root/sudoersmore: /root/sudoers: Permission denied/ #

好了,今天就到这里,大家可以自己试试podman,几乎不需要任何时间就可以上手。