Контейнеры: от Docker к Podman

Контейнеры: от Docker к Podman

Контейнеры — это как готовые, упакованные коробки с одним конкретным приложением и всем, что им нужно для работы. Внутри этих коробок нет целой операционной системы (ОС), только сам софт и его зависимости.

Как контейнеры стали возможны: Ядро Linux

Контейнеры работают благодаря двум хитростям, заложенным в ядре Linux:

  • Namespaces (пространства имён): Это как занавески, которые изолируют процесс. Контейнер «видит» только свои файлы, свои сетевые настройки и свои процессы. Он думает, что он один на целом компьютере.
  • cgroups (Control Groups): Это ограничитель ресурсов. Он не даёт контейнеру «съесть» всю память или весь процессор хоста. Мы можем сказать: «Этот контейнер может использовать не более 1 ГБ оперативной памяти».

Революция Docker и его наследник Podman

Docker: В 2013 году Docker произвёл революцию. Он стандартизировал создание таких «коробок» с помощью образов контейнеров (Image) и создал слоёную систему (layering). Теперь можно взять готовый образ с базой данных и просто добавить в него свой код — это быстро и эффективно.

Podman: Это современный и более безопасный конкурент Docker, созданный компанией Red Hat.

Главный плюс: Безопасность (Rootless Containers).

  • Docker традиционно требовал прав администратора (root), что опасно.
  • Podman по умолчанию запускает контейнеры от имени обычного пользователя. Если такой контейнер взломают, хакер не получит доступ ко всей твоей системе.

Преимущества Podman:

  • Легкая установка: Устанавливается через локальный менеджер пакетов (sudo apt install podman).
  • Отсутствие демонов (Daemonless): Не требует запущенного демона или повышенных привилегий (elevated privileges).
  • Rootless Containers (Без привилегий root): Контейнеры по умолчанию запускаются от имени обычного пользователя. Это гораздо более безопасно, поскольку ограничивает возможный ущерб в случае компрометации.
  • Полный Open Source.
  • Совместимый CLI: Командная строка совместима с Docker, что упрощает переход.

Что такое образ контейнера?

Образ — это статический (неизменный) архив, содержащий все файлы, библиотеки и настройки, нужные приложению. Это как чертёж или рецепт. Сам контейнер — это уже работающий «продукт», созданный по этому чертежу. Образы хранятся в реестрах (например, Docker Hub, публичная платформа для обмена образами, содержащая более 10 миллионов образов), откуда их можно скачать для использования.

Поиск образов

Для поиска образов на удаленных реестрах можно использовать:

  • Веб-интерфейс реестра (например, Docker Hub).
  • Команды docker search или podman search.

Особенность Podman: Podman по умолчанию настроен на поиск в нескольких реестрах одновременно (включая Docker Hub), в то время как Docker по умолчанию ищет только в Docker Hub.

Получение образов (Pull)

Образ можно получить двумя способами:

  1. Автоматически: Запустить контейнер, и система автоматически загрузит необходимый образ, если его нет локально.
  2. Вручную: Использовать команду pull для предварительной загрузки образа без его немедленного запуска.
Утилита
Команда
Docker
docker pull <имя_образа>
Podman
podman pull <имя_образа>

Полностью квалифицированное имя образа (Fully Qualified Image Name)

Рекомендуется использовать полностью квалифицированное имя для точной идентификации источника, поскольку Podman поддерживает несколько реестров:

podman pull docker.io/library/nginx

  • docker.io: Имя реестра (Docker Hub).
  • library: Пространство имен/пользователь.
  • nginx: Имя образа.

Управление локальными образами

После загрузки образов их можно просмотреть с помощью:

podman images или docker images

Команда покажет все доступные локально образы, их размер и идентификатор.

Лучшая практика безопасности

  • Не используй root: Для запуска контейнеров не требуются привилегии root.
  • Podman по умолчанию: Podman позволяет работать с контейнерами вне оболочки root, что соответствует лучшим практикам безопасности и является его преимуществом над традиционным Docker.

Запуск и управление контейнерами с Podman

Podman предоставляет функциональность, практически идентичную Docker, и является предпочтительным выбором из-за своей безопасности (rootless containers) и отсутствия демона.

Синтаксис команды podman run

Важный совет: Опции, передаваемые команде podman или docker, должны стоять ДО имени образа, а не после.

  • Неправильно (опция интерпретируется как аргумент для приложения внутри контейнера):

podman run nginx --name myweb

    • (В этом случае -name myweb будет интерпретировано как аргумент для процесса Nginx, что приведет к ошибке.)
  • Правильно:podman run [ОПЦИИ PODMAN] <ИМЯ_ОБРАЗА> [АРГУМЕНТЫ ДЛЯ КОНТЕЙНЕРА]

Режимы запуска контейнеров

Команда
Описание
podman run -d <образ> --name <имя>
Запуск контейнера в фоновом режиме (-d, detached).
podman run -it <образ> <команда>
Запуск в интерактивном режиме (-i) с терминалом (-t). Используется для взаимодействия с оболочкой внутри контейнера (например, podman run -it busybox sh).

Управление контейнерами и проверка

Команда
Опции
Назначение
podman ps
(нет опций)
Показывает только текущие работающие контейнеры.
podman ps -a
--all
Показывает все контейнеры — работающие, завершенные (Exited) и остановленные.
podman logs -l
--latest
Просмотр логов, сгенерированных последним запущенным контейнером.
podman inspect <имя/ID>
Выводит подробную JSON-информацию о контейнере (конфигурация, пути, аргументы, сети). Рекомендуется использовать с `

Взаимодействие с запущенным контейнером

  • podman exec -it <имя> <команда>: Выполнение команды внутри уже запущенного контейнера в интерактивном режиме.
    • Пример: podman exec -it myweb sh (запустить оболочку внутри контейнера myweb).
  • Отключение от интерактивной сессии: Используй комбинацию Ctrl + P, Ctrl + Q (позволяет выйти из сессии, но оставить контейнер запущенным).

Особенности контейнерной среды

  • Контейнер — не полноценная ОС: Контейнер является ограниченной средой и содержит только приложение и его минимальные зависимости.
  • Отсутствие утилит: Распространенные системные утилиты (например, ps) часто отсутствуют в минимальных образах (таких как Nginx или BusyBox).
  • Процессы внутри: Для просмотра процессов внутри контейнера можно:
    1. Использовать команду, если она доступна (как в BusyBox).
    2. Вручную исследовать /proc/ внутри контейнера (например, cat /proc/1/cmdline покажет команду запуска основного процесса).

 

Комментарии

Комментариев пока нет. Почему бы ’Вам не начать обсуждение?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *