Docker vs Podman
Docker vs Podman
用了一段时间的podman,感觉还不错,给大家推荐一下。今天我们主要来说说podman和docker的不同之处。至于如何使用,就太简单了,基本和docker一样,这里就不介绍了。
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,几乎不需要任何时间就可以上手。