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

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

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

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


person Walid Hanafy    schedule 19.01.2016    source источник
comment
контейнер - это набор виртуализированных процессов или также заключенных в тюрьму процессов, что может быть немного менее абстрактным.   -  person Matheus Santana    schedule 05.03.2018


Ответы (8)


Вы можете использовать команду 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>
person Boynux    schedule 19.01.2016

Другой способ получить обзор всех процессов 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 и соответствующие им хост-процессы.

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

  1. Он работает, даже если демон (-ы) Docker не работает.
  2. Это довольно краткий обзор.

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

Между прочим: поскольку службы systemd также соответствуют cgroups, эти методы также применимы к службам systemd, не относящимся к Dockerized.

person Johannes Gehrs    schedule 22.02.2018
comment
Это лучший ответ, и это решение известной проблемы, у которой нет решения: github.com / moby / moby / issues / 12738. Пользователь должен (1) найти идентификатор pid процесса докера, который легче всего определить по номеру порта, связанному с контейнером, и (2) найти pid связанного хэша идентификатора контейнера и уничтожить оба. Спасибо за этот совет. - person truedat101; 05.04.2019
comment
Перечислены ли докер-контейнеры под docker? В Docker версии 18.09.4 systemd перечисляет контейнеры под containerd.service, а не docker.service - person Tim; 07.04.2019

процесс, запущенный в контейнере докера, является дочерним по отношению к процессу с именем containerd-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
person Thomasleveil    schedule 19.01.2016
comment
Спасибо @Thomasleveil - person Walid Hanafy; 19.01.2016
comment
Если визуального дерева достаточно, вы также можете использовать ps -axfo pid,ppid,uname,cmd - person Erik Dannenberg; 19.01.2016
comment
Мне было интересно, какова цель сохранения только процессов, идентификатор родительского процесса которых является одним из демонов докеров? Единственный дочерний процесс dockerd - это docker-proxy. Контейнеры не отображаются как потомки процесса dockerd. - person Tim; 07.04.2019
comment
@ Тим, этому ответу больше 3 лет, все могло измениться - person Thomasleveil; 07.04.2019
comment
Можете ли вы проверить, изменилось ли что-то? - person Tim; 07.04.2019

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

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

Я нашел аналогичное решение, используя сценарий bash в одну строку:

for i in $(docker container ls --format "{{.ID}}"); do docker inspect -f '{{.State.Pid}} {{.Name}}' $i; done
person user3788120    schedule 21.10.2020
comment
чрезвычайно полезное и чистое решение - person thanos.a; 14.01.2021

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

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

person Sobrique    schedule 19.01.2016
comment
Это представит процессы с точки зрения контейнера. Я хочу найти процессы с точки зрения хоста, и для большего количества недоразумений я отредактирую вопрос. - person Walid Hanafy; 19.01.2016
comment
Я бы посоветовал включить пример того, почему - потому что обычно в этом нет особой необходимости. - person Sobrique; 19.01.2016
comment
Тесты миграции процессов - person Walid Hanafy; 19.01.2016
comment
Это вообще не отвечает на вопрос. - person talonx; 24.01.2020

Поскольку следующая команда показывает только идентификатор процесса самого контейнера (а не все дочерние процессы):

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

Чтобы найти процесс, который является дочерним по отношению к контейнеру, этот идентификатор процесса должен быть найден в каталоге / proc. Итак, найдите внутри него processID, а затем найдите хэш контейнера из файла:

/proc/parent_process/task/processID

а затем вырезать идентификатор контейнера из хеша (первые 12 цифр хеша контейнера), а затем найти сам контейнер:

#!/bin/bash 
processPath=$(find /proc/ -name $1 2>/dev/null) 
containerID=$(cat ${processPath}/cgroup | fgrep 'pids:/docker/' | sed -e 's#.*/docker/##g' | cut -c 1-12) 
docker ps | fgrep $containerID

Сохраните приведенный выше сценарий в файле, например: p2c, и запустите его:

p2c <PID>

Например:

p2c 85888
person Mohsen Abasi    schedule 21.06.2021

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

Возможно, эта шпаргалка пригодится. http://theearlybirdtechnology.com/2017/08/12/docker-cheatsheet/ < / а>

person Suma Ningaraju    schedule 22.08.2017