Начало работы с подманом

задняя часть
Начало работы с подманом

1. Что такое подман

1. концепция подмана

Podman — это собственный инструмент Linux с открытым исходным кодом без демона, разработанный для того, чтобы контейнерам и образам было проще находить, запускать, создавать, совместно использовать и развертывать приложения с использованием Инициативы открытых контейнеров (OCI). Podman предоставляет интерфейс командной строки (CLI), с которым может быстро начать работу любой, кто использовал контейнерный движок Docker. Большинство пользователей могут просто использовать псевдоним Podman для Docker (псевдоним Docker = Podman) без каких-либо проблем. Подобно другим распространенным механизмам контейнеров (Docker, CRI-O, containerd), Podman полагается на среды выполнения контейнеров, совместимые с OCI (runc, cron, runv и т. д.), для взаимодействия с операционной системой и создания работающих контейнеров. Это делает работающий контейнер, созданный Podman, почти неотличимым от контейнера, созданного любым другим механизмом контейнеров общего назначения.

2. официальный сайт подмана:Довольно медленно. IO/getting - это он...

Во-вторых, разница между podman и докером

Опыт Podman иDockerАналогично, разница в том, что у Podman нет демона.При использовании Docker CLI ранее, Docker CLI сообщал Docker Engine «Я хочу запустить контейнер» через API gRPC, а затем Docker Engine передал Среда выполнения контейнера OCI (по умолчанию runc) для запуска контейнера. Это означает, что процесс контейнера не может быть дочерним процессом Docker CLI, но дочерним процессом Docker Engine.

Podman относительно прост и груб, не использует Daemon, а запускает контейнер напрямую через среду выполнения OCI (тоже runc по умолчанию), поэтому процесс контейнера является дочерним процессом podman. Это больше похоже на модель fork/exec в Linux, тогда как Docker использует модель C/S (клиент/сервер). По сравнению с моделью C/S модель fork/exec имеет много преимуществ, таких как:

  • Системные администраторы могут знать, кто запустил процесс контейнера.
  • При использованииcgroupСделайте некоторые ограничения на podman, тогда все созданные контейнеры будут ограничены.
  • Если вы поместите команду podman вsystemdВ юнит-файле процесс-контейнер может возвращать через podman уведомление о том, что сервис готов к приему задач.
  • можно подключитьsocketПерешел из systemd в podman и в процессы-контейнеры для их использования.

1. podman не имеет процесса демона

  • докер-сервер

    ps -aux | grep docker
    

    image.png

    docker запускает демон под названием dockerd.

  • подман сервер

    ps -aux | grep podman
    

    image.png

    Видно, что информации о процессе podman нет вообще.

2. Разрешения пользователя Podman отличаются от прав доступа Docker

  1. обычные права пользователя
    • Создать демонстрационную версию обычного пользователя

      # useradd demo
      # passwd demo // 设置密码
      # su demo
      
    • докер-сервер

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

      image.png

      Можно обнаружить, что если вы не добавите sudo, у вас нет прав на работу с docker.

    • подман сервер

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

      image.png

      Вы можете работать с podman без добавления sudo.

  2. Разрешения на размещение файлов внутри контейнера докеров

    У Docker всегда была проблема. Если демонстрационный пользователь присоединяется к группе пользователей docker, демонстрационный пользователь может создать контейнер. Если демонстрационный пользователь не имеет разрешения на сопоставление файла с контейнером, файл можно изменить и просмотреть в контейнер. Так у podman тоже есть эта проблема?

    • докер-сервер

      • Назначьте группу пользователей демонстрационному пользователю:usermod -g docker demo
      • Удалить привилегии sudo для демонстрационного пользователя
      # vim /etc/sudoers
      # 删除 demo 那一行
      
      • Подтвердите разрешения:
      # su - demo
      # sudo cat /etc/sudoers
      

      image.png

      • Создайте контейнер с докером и сопоставьте файл /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

      Можно посмотреть содержимое этого файла, это не очень безопасно.

    • подман сервер

      • Перед созданием контейнера проверьте разрешения демо-пользователя.
      # sudo cat /etc/sudoers
      

      image.png

      • Попробуйте запустить контейнер как докер
      # podman run -it -v /etc/sudoers:/home/sudoers busybox sh
      # 进入容器后会发现 /home/sudoers 文件为空,并且提示没有权限
      # cat /home/sudoers
      

      image.png

      Таким образом, невозможно изменить этот файл без разрешения, так почему же файл сопоставлен и почему файл не может быть изменен?

    • Представление процесса контейнера

      В linux контейнеры существуют в системе в виде процессов (если вам интересно, вы можете проверить информацию самостоятельно, и мы не будем здесь вдаваться в подробности). Разница между процессом в podman и процессом docker приводит к тому, что podman сопоставляет файлы с правами root, но их нельзя изменить.

      • контейнер запуска демона
      # 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
      
      • Просмотр процесса по идентификатору контейнера
      # docker 服务器
      # docker ps
      # ps -aux | grep 46f121aff161
      # podman 服务器
      # podman ps
      # ps -aux | grep 240842862d24
      

      image.png

      image.png

      Для сравнения обнаружено, что когда podman запускается под пользователем demo, пользователь, используемый процессом, является demo, поэтому в контейнере, когда пользователь demo используется для доступа к файлу разрешений root, он подсказывает, что разрешения нет. .

3. Установите подман

  • Документация по установке:Довольно медленно. IO/getting - это он...

  • 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

    Можно обнаружить, что способ использования такой же, как у докера, Не беспокойтесь о переключении с докера на 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

  • Докер команды сопоставления:alias docker=podman image.png

V. Резюме

  • podman может заменить docker в качестве инструмента управления контейнерами. Поскольку процесс-демон отсутствует, он занимает меньше системных ресурсов, чем при использовании докера.
  • Podman не использует привилегированные права пользователя docker, поэтому он кажется более безопасным, чем docker.
  • Использование podman точно такое же, как и у docker, и нет абсолютно никаких проблем с переносом напрямую из docker.

использованная литература