Поиск процессов контейнера Docker? (с точки зрения хоста)

Я делаю некоторые тесты на докере и контейнерах, и мне было интересно:

Есть ли способ, с помощью которого я могу найти весь процесс, связанный с док-контейнером, по его имени или идентификатору с точки зрения хоста.

В конце концов, контейнер - это набор виртуализированных процессов.

Ответ 1

Вы можете использовать команду docker top. Эта команда перечисляет все процессы, запущенные в вашем контейнере.

Например, эта команда в одном контейнере процесса на моем ящике отображает:

UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                14097               13930               0                   23:17               pts/6               00:00:00            /bin/bash

Также можно использовать все методы, упомянутые другими, но это должно быть проще всего.

Обновление

Чтобы просто получить основной идентификатор процесса в контейнере, используйте следующую команду:

 docker inspect -f '{{.State.Pid}}' <container id>

Ответ 2

Еще один способ получить общий обзор всех процессов Docker, выполняющихся на узле, - это использовать общие средства systemd для cgroup.

systemd-cgls отобразит все наши группы и процессы, запущенные в них в древовидном виде, например:

├─1 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
├─docker
│ ├─070a034d27ed7a0ac0d336d72cc14671584cc05a4b6802b4c06d4051ce3213bd
│ │ └─14043 bash
│ ├─dd952fc28077af16a2a0a6a3231560f76f363359f061c797b5299ad8e2614245
│ │ └─3050 go-cron -s 0 0 * * * * -- automysqlbackup

Так как каждый контейнер Docker имеет свою собственную группу, вы также можете увидеть Docker Containers и соответствующие им хост-процессы.

Два интересных свойства этого метода:

  • Он работает, даже если Docker Daemon (s) не функционирует.
  • Это довольно быстрый обзор.

Вы также можете использовать systemd-cgtop, чтобы получить обзор использования ресурсов Docker Containers, аналогичный top.

Кстати: поскольку службы systemd также соответствуют группам, эти методы также применимы к службам, не находящимся в докерезе.

Ответ 3

процесс, запущенный в контейнере Docker, является дочерним по отношению к процессу с именем containerd-shim shim (в Docker v18.09.4)

  • Сначала выясните идентификаторы процессов в containerd-shim.
  • Для каждого из них найдите свой дочерний процесс.

pgrep containerd-shim
7105
7141
7248

Чтобы найти дочерний процесс родительского процесса 7105:

pgrep -P 7105

7127


В конце концов вы можете получить список с:

for i in $(pgrep containerd-shim); do pgrep -P $i; done
7127
7166
7275

Ответ 4

docker ps отобразит запущенные контейнеры докеров.

docker exec <id|name> ps расскажет вам о запущенных процессах.

Ответ 5

Докер-статистика "id контейнера" Показывает потребление ресурсов вместе с pid или просто Docker ps.

Возможно, этот чит-лист может быть полезен. http://theearlybirdtechnology.com/2017/08/12/docker-cheatsheet/

Ответ 6

При запуске этого на хосте он выдаст вам список процессов, запущенных в контейнере с <Container ID>, показывая PID хоста вместо PID контейнера.

DID=$(docker inspect -f '{{.State.Pid}}' <Container ID>);ps --ppid $DID -o pid,ppid,cmd