podman入门实践

一、podman 是什么

1、podman 概念

Podman 是一个无守护、开源的 Linux 本地工具,旨在使用 open Containers Initiative (OCI) 让容器和镜像更加方便地查找、运行、构建、共享和部署应用程序。Podman 提供了一个命令行接口(CLI),任何使用过 Docker 容器引擎的人都能很快上手 podman。大多数用户可以简单地将 Podman 别名为 Docker (alias Docker = Podman),没有任何问题。与其他常见的容器引擎 (Docker、CRI-O、containerd) 类似,Podman 依赖于符合 OCI 的容器运行时(runc、cron、runv等) 来与操作系统交互并创建运行的容器。这使得由 Podman 创建的正在运行的容器与由任何其他通用容器引擎创建的容器几乎没有区别。

2、podman 官网:podman.io/getting-sta…

二、podman 和 docker 的区别

Podman 的使用体验和 Docker 类似,不同的是 Podman 没有 daemon,以前使用 Docker CLI 的时候,Docker CLI 会通过 gRPC API 去跟 Docker Engine 说「我要启动一个容器」,然后 Docker Engine 才会通过 OCI Container runtime(默认是 runc)来启动一个容器。这就意味着容器的进程不可能是 Docker CLI 的子进程,而是 Docker Engine 的子进程。

Podman 比较简单粗暴,它不使用 Daemon,而是直接通过 OCI runtime(默认也是 runc)来启动容器,所以容器的进程是 podman 的子进程。这比较像 Linux 的 fork/exec 模型,而 Docker 采用的是 C/S(客户端/服务器)模型。与 C/S 模型相比,fork/exec 模型有很多优势,比如:

  • 系统管理员可以知道某个容器进程到底是谁启动的。
  • 如果利用 cgroup 对 podman 做一些限制,那么所有创建的容器都会被限制。
  • 如果将 podman 命令放入 systemd 单元文件中,容器进程可以通过 podman 返回通知,表明服务已准备好接收任务。
  • 可以将连接的 socket 从 systemd 传递到 podman,并传递到容器进程以便使用它们。

1、podman 无守护进程

  • docker 服务器

    ps -aux | grep docker
    复制代码

    image.png

    docker 启动了一个名为 dockerd 的守护进程。

  • podman 服务器

    ps -aux | grep podman
    复制代码

    image.png

    可以看到,完全没有podman的进程相关的信息。

2、podman 用户权限和 docker 不一样

  1. 普通用户权限
    • 创建普通用户 demo

      # useradd demo
      # passwd demo // 设置密码
      # su demo
      复制代码
    • docker 服务器

      # docker version
      # sudo docker version // 需要提前将 demo 用户加入 /etc/sudoers
      复制代码

      image.png

      可以发现如果不加 sudo 是没有权限操作 docker 的。

    • podman 服务器

      # 切换到demo用户
      # su - demo  // 需要使用 - ,不然会出现权限问题
      # podman version
      复制代码

      image.png

      不需要加 sudo 都可以对 podman 进行操作。

  2. docker 容器内部对宿主机文件的权限

    docker 一直有个问题,假如 demo 用户加入了 docker 用户组,demo 用户就能创建容器,如果把 demo 用用户没有权限的文件映射到容器里面,在容器里面就可以修改,查看文件。那么 podman 是否也有这个问题呢?

    • docker 服务器

      • 给 demo 用户分配用户组:usermod -g docker demo
      • 删除 demo 用户的 sudo 权限
      # vim /etc/sudoers
      # 删除 demo 那一行
      复制代码
      • 验证权限:
      # su - demo
      # sudo cat /etc/sudoers
      复制代码

      image.png

      • 使用 docker 创建一个容器,将 /etc/sudoers 文件映射到容器内
      # run 一个容器
      # docker run -it -v /etc/sudoers:/home/sudoers busybox sh
      # 进入容器后修改 /etc/sudoers 的文件内容,将 demo 的权限添加进去
      # vi /home/sudoers
      复制代码

      image.png

      • 退出容器后,再看看权限
      # sudo cat /etc/sudoers
      复制代码

      image.png

      能看这个文件的内容了,这是不是很不安全呢。

    • podman 服务器

      • 查看创建容器之前 demo 用户的权限。
      # sudo cat /etc/sudoers
      复制代码

      image.png

      • 按照 docker 的方式 run 一个容器试试
      # podman run -it -v /etc/sudoers:/home/sudoers busybox sh
      # 进入容器后会发现 /home/sudoers 文件为空,并且提示没有权限
      # cat /home/sudoers
      复制代码

      image.png

      这样就没办法修改这个没有权限的文件了,那为啥文件映射进去了,为啥文件改动不了呢?

    • 容器进程查看

      在 linux 中,容器都是以进程的形式存在于系统中的(有兴趣的可以自行去查一下资料,这里不展开细讲)。podman 中的进程和 docker 的进程有所差异导致了 podman 虽然映射了 root 权限的文件,但是不能修改。

      • 守护进程 run 容器
      # docker 服务器
      # docker run -it -d --name=busybox -v /etc/sudoers:/home/sudoers busybox
      # podman 服务器
      # podman run -it -d -v /etc/sudoers:/home/sudoers busybox --name busybox
      复制代码
      • 通过容器 ID 去查看进程
      # docker 服务器
      # docker ps
      # ps -aux | grep 46f121aff161
      # podman 服务器
      # podman ps
      # ps -aux | grep 240842862d24
      复制代码

      image.png

      image.png

      通过对比发现,podman 在 demo 用户下 run 的时候,进程使用的用户是 demo,所以在容器内,使用 demo 用户去访问 root 权限文件时,会提示没有权限。

三、安装 podman

  • 安装文档:podman.io/getting-sta…

  • CentOS

    # Centos 7
    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
    yum -y install podman
    
    # Centos 8
    sudo dnf -y module disable container-tools
    sudo dnf -y install 'dnf-command(copr)'
    sudo dnf -y copr enable rhcontainerbot/container-selinux
    sudo curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable.repo https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/CentOS_8/devel:kubic:libcontainers:stable.repo
    sudo dnf -y install podman
    复制代码

    image.png

四、使用 podman

  • 查看帮助: podman --help image.png

    可以发现,使用方式可以说和 docker 的丝毫不差,不用担心从 docker 切换到 podman 会有不习惯的。如果不习惯使用 podman 命令,可以使用 alias docker=podman 来对docker命令做一个映射。

  • 配置加速地址:vim /etc/containers/registries.conf

    ...
    # does not curate, patch or maintain container images from the docker.io registry.
    # PS:在增加加速地址时,不能有http或者https
    [registries.search]
    registries = ['registry.access.redhat.com', 'registry.redhat.io', 'docker.io', 'xxx.mirror.aliyuncs.com']
    ...
    复制代码
  • 拉取镜像:podman pull busybox image.png

  • 启动容器:podman run -it busybox sh image.png

  • 映射命令docker:alias docker=podman image.png

五、总结

  • podman 可以替代 docker 来做容器管理工具。由于没有守护进程,比使用 docker 的时候少占用了系统资源。
  • podman 没用 docker 那个 root 用户权限的问题,所以感觉比 docker 更见安全吧。
  • podman 的使用方式和 docker 完全一致,直接由 docker 转过来完全没啥问题。

参考资料

猜你喜欢

转载自juejin.im/post/6990279582255579150