Как посмотреть запущенные процессы внутри контейнера Docker?

«Как посмотреть запущенные процессы внутри контейнера Docker?» — вопрос из категории Docker, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Есть несколько способов, в зависимости от того, нужен ли разовый просмотр или постоянный мониторинг.

1. Основные команды для разовой проверки:

# 1. Использование docker exec для запуска ps внутри контейнера
$ docker exec <container_name_or_id> ps aux

# 2. Команда docker top (не требует входа в контейнер)
$ docker top <container_name_or_id>
# Выводит PID, пользователя, время и команду для всех процессов контейнера на хосте.

# 3. Для контейнеров на основе Alpine Linux (где ps может отсутствовать)
$ docker exec <container_name> sh -c "apk add procps && ps aux"  # Установить и запустить
# Или использовать встроенный `top`:
$ docker exec -it <container_name> top

2. Просмотр информации о ресурсах процессов:

# Показать потребление памяти и CPU процессами в контейнере
$ docker stats <container_name>

# Детальная информация о контейнере (включая PID основного процесса на хосте)
$ docker inspect <container_name> | grep -A 5 -B 5 "Pid"

3. Для отладки и мониторинга в продакшене:

  • Логирование stdout/stderr процессов: docker logs --tail 50 -f <container_name>
  • Использование инструментов мониторинга: Настраиваю сбор метрик контейнеров (CPU, memory, I/O) через cAdvisor или агенты Docker-оркестратора (Kubernetes, Swarm).
  • Профилирование производительности: Для глубокого анализа можно использовать docker exec для запуска профилировщиков (например, perf или language-specific tools) внутри контейнера, предварительно убедившись, что они установлены.