• 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

  • 相关阅读:
    在KubeSphere启动服务网格Istio并解决解决ContainerCreating问题
    计算机毕业设计(附源码)python智慧消防维保系统后端
    Linux初始化mysql后外网无限制访问
    Golang GMP解读
    网络编程TCP/UDP
    网页开发中使用highlight.js实现代码高亮 + 行号
    适用于电脑和手机的照片恢复工具指南
    GeoServer安装以及部署
    力扣-2512.奖励最顶尖的k名学生
    【MySQL】表的约束(一)
  • 原文地址:https://www.cnblogs.com/young233/p/16439698.html