it-swarm.com.de

Wie lautet die PID im Host eines Prozesses, der in einem Docker-Container ausgeführt wird?

In einem Docker-Container werden mehrere Prozesse ausgeführt. Ihre PIDs sind im Containernamensraum isoliert. Gibt es eine Möglichkeit, herauszufinden, wie ihre PIDs auf dem Docker-Host lauten?

Beispielsweise befindet sich ein Apache-Webserver in einem Docker-Container (ich verwende Apache + PHP-Image von Docker Hub ), und der Apache erstellt beim Start mehr Arbeitsprozesse im Container. Diese Worker-Prozesse verarbeiten tatsächlich eingehende Anforderungen. Um diese Prozesse anzuzeigen, führe ich pstree im Docker-Container aus:

# pstree -p 1
Apache2(1)-+-Apache2(8)
           |-Apache2(9)
           |-Apache2(10)
           |-Apache2(11)
           |-Apache2(12)
           `-Apache2(20)

Der übergeordnete Apache-Prozess wird auf PID 1 im Containerprozess-Namespace ausgeführt. Aus Sicht des Hosts kann jedoch auch darauf zugegriffen werden, aber die PID auf dem Host ist unterschiedlich und kann durch Ausführen von docker compose Befehl:

 $ docker inspect --format '{{.State.Pid}}' container
 17985

Daraus können wir ersehen, dass die PID 1 im Containerprozess-Namespace der PID 17985 auf dem Host zugeordnet ist. So kann ich pstree auf dem Host ausführen, um die untergeordneten Elemente des Apache-Prozesses aufzulisten:

$ pstree -p 17985
Apache2(17985)─┬─Apache2(18010)
               ├─Apache2(18011)
               ├─Apache2(18012)
               ├─Apache2(18013)
               ├─Apache2(18014)
               └─Apache2(18164)

Ich gehe davon aus, dass auf die gleiche Weise, wie PID 1 im Container PID 17985 auf dem Host zugeordnet ist, auch Folgendes zugeordnet wird:

  • PID 8 im Container auf PID 18010 auf Host und
  • PID 9 bis PID 18011;
  • PID 10 bis PID 18012 und so weiter ...

(Dadurch kann ich die Prozesse im Docker-Container mit Tools debuggen, die nur auf dem Host und nicht im Container verfügbar sind, z. B. strace.)

Das Problem ist, dass ich nicht weiß, wie sicher es ist anzunehmen, dass pstree die Prozesse sowohl im Container als auch im Host in derselben Reihenfolge auflistet.

Wäre großartig, wenn jemand eine zuverlässigere Methode vorschlagen könnte, um die PID auf dem Host eines bestimmten Prozesses zu ermitteln, der im Docker-Container ausgeführt wird.

15
Lukas Normantas

In der Datei /proc/<pid>/status Können Sie die Zuordnung zwischen der Namespace-PID und der globalen PID ermitteln. Wenn ich zum Beispiel in einem Docker-Container mehrere sleep 900 - Prozesse starte, wie folgt:

# docker run --rm -it Alpine sh
/ # sleep 900 &
/ # sleep 900 &
/ # sleep 900 &

Ich kann sie im Container laufen sehen:

/ # ps -fe
PID   USER     TIME   COMMAND
    1 root       0:00 sh
    7 root       0:00 sleep 900
    8 root       0:00 sleep 900
    9 root       0:00 sleep 900
   10 root       0:00 ps -fe

Ich kann diese auf dem Host anschauen:

# ps -fe | grep sleep
root     10394 10366  0 09:11 pts/10   00:00:00 sleep 900
root     10397 10366  0 09:12 pts/10   00:00:00 sleep 900
root     10398 10366  0 09:12 pts/10   00:00:00 sleep 900

Und für jeden von diesen kann ich in der status -Datei nachsehen, um die Namespace-PID zu sehen:

# grep -i pid /proc/10394/status
Pid:    10394
PPid:   10366
TracerPid:  0
NSpid:  10394   7

Wenn ich mir die Zeile NSpid ansehe, sehe ich, dass dieser Prozess im PID-Namespace PID 7 hat. Und tatsächlich, wenn ich den Prozess 10394 Auf dem Host beende:

# kill 10394

Dann sehe ich im Container, dass PID 7 nicht mehr läuft:

/ # ps -fe
PID   USER     TIME   COMMAND
    1 root       0:00 sh
    8 root       0:00 sleep 900
    9 root       0:00 sleep 900
   11 root       0:00 ps -fe
22
larsks