docker的平替–podman

前言

我们都知道,docker这个东西,是CaaS(Container as a Service,容器即服务)的通常解法。我们使用docker来管理容器的生命周期,比如镜像的生成、容器的管理和定制(Dockerfile)、仓库的上传和下载等。

但是docker存在很多不方便使用的地方,所以我们可以使用podman来做平替。
 

podman介绍

Podman(Pod Manager), 是由RedHat公司推出的容器管理工具。它可以做为docker的平替,使用上也非常相似。但其实二者之间也存在非常显著的差别,相比起来podman会比docker更加完善一些。
 

podman与docker的差异

1. 底层CRI

  • docker:使用的是docker-shim, 这个CRI(Container Runtime Interface, 容器运行接口)并不是docker实现的,而是kubernetes帮它实现的。由于早期没有docker平替工具,故kubernetes开发了一个api调用docker管理下的容器资源。后来由于有了其他的平替工具,所以kubernetes在1.20版本正式停止维护docker-shim这个CRI,使用其余CRI(可以由其他容器管理工具实现,例如CRI-O等)。这也就是当时讲的“kubernetes停止对docker维护”的意思。

  • podman:使用的是CRI-O,该接口来自于开放容器计划(OCI), 可以让kubelet来调用下层的容器资源,而不需要人为管理,如图所示。

    其余比较知名的CRI还有containerd、lxd等。

    preview

 

2. 守护进程

  • docker:后台有docker-daemon,需要root权限

  • podman:没有daemon,不需要root权限

 

3. 安全性

  • docker:如果你在容器外有一些文件无法访问,在启动镜像映射文件的时候,你将此文件映射到容器中时,使用docker exec进入容器后,就可以编辑了。

  • podman:即使你将容器外无法访问的文件映射到容器中时,也无法编辑此文件。

    因此,podman比docker安全性更好。

 

podman安装

1. ubuntu

1) ubuntu22.04,可直接apt安装

apt install -y podman

2)ubuntu18.04和20.04,需要添加源

. /etc/os-release
echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_${VERSION_ID}/ /" | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list

curl -L "https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_${VERSION_ID}/Release.key" | sudo apt-key add -

apt install -y podman

 

2. centos

1)cent8可以直接yum安装docker,默认装的是podman

yum install -y docker

2)cent7,可以安装epel-release, 然后yum安装podman

yum install -y epel-release
yum install -y podman

如果非root用户来使用podman,可能会遇到namespace没权限的问题:

user namespaces are not enabled in /proc/sys/user/max_user_namespaces

此功能是Centos3.8添加进去的,默认关闭,需要打开。

[root@node2 ~]# cat /proc/sys/user/max_user_namespaces
0
# 临时打开

[root@node2 ~]# echo 200 > /proc/sys/user/max_user_namespaces  

# kernel 设置
[root@node2 ~]# grubby --args="user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)"
# 写入配置文件
[root@node2 ~]# echo "user.max_user_namespaces=200" >> /etc/sysctl.conf
# 生效
[root@node2 ~]# sysctl -p
# 关闭namespace
[root@node2 ~]# grubby --remove-args="user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)"

 

别名

当然,如果你敲docker上瘾,也可以使用alias修改别名。

echo "alias docker=podman" >> ~/.bashrc
source ~/.bashrc

 

仓库源

如果podman使用默认的仓库源,可能会pull不下来,所以需要修改仓库源。

由于podman不需要root权限,任何人都可以使用,所以每个人可以设置自己的源,就像环境变量一样,每人一个。

全局配置: /etc/containers/registries.conf

个人配置: ~/.config/containers/registries.conf

配置方法:

unqualified-search-registries = ["docker.io", "registry.access.redhat.com"]

[[registry]]
prefix = "docker.io"
location = "docker.io"

[[registry.mirror]]
location = "docker.mirrors.ustc.edu.cn"
[[registry.mirror]]
location = "registry.docker-cn.com"

 

使用

podman pull的时候,比docker多了一个镜像选择的过程

young@home:/opt$ podman pull nginx
 docker.io/library/nginx:latest
Trying to pull docker.io/library/nginx:latest...
Getting image source signatures
Copying blob 589b7251471a done  
Copying blob 186b1aaa4aa6 done  
Copying blob a0bcbecc962e done  
Copying blob b4df32aa5a72 done  
Copying blob a9edb18cadd1 done  
Copying blob a2abf6c4d29d done  
Copying config 605c77e624 done  
Writing manifest to image destination
Storing signatures
605c77e624ddb75e6110f997c58876baa13f8754486b461117934b24a9dc3a85
young@home:/opt$ podman images
REPOSITORY                 TAG         IMAGE ID      CREATED       SIZE

docker.io/library/nginx    latest      605c77e624dd  6 months ago  146 MB
young@home:/opt$ podman run -d -p 8000:80 docker.io/library/nginx 

6e898573edec454699c760b9d5f23091cb22143563e038e8d2cdf0d5277c03dc
young@home:/opt$ 
young@home:/opt$ docker container ps -a
CONTAINER ID  IMAGE                             COMMAND               CREATED        STATUS            PORTS                                             NAMES

6e898573edec  docker.io/library/nginx:latest    nginx -g daemon o...  4 seconds ago  Up 5 seconds ago  0.0.0.0:8000->80/tcp                              hopeful_brattain

 
然后访问ip:8000, 发现run起来了。
image

张贴在2