Контейнеры — это как готовые, упакованные коробки с одним конкретным приложением и всем, что им нужно для работы. Внутри этих коробок нет целой операционной системы (ОС), только сам софт и его зависимости.
Как контейнеры стали возможны: Ядро 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)
Образ можно получить двумя способами:
- Автоматически: Запустить контейнер, и система автоматически загрузит необходимый образ, если его нет локально.
- Вручную: Использовать команду
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). - Процессы внутри: Для просмотра процессов внутри контейнера можно:
- Использовать команду, если она доступна (как в BusyBox).
- Вручную исследовать
/proc/внутри контейнера (например,cat /proc/1/cmdlineпокажет команду запуска основного процесса).

