web-dev-qa-db-fra.com

Quel est le PID dans l'hôte, d'un processus s'exécutant à l'intérieur d'un conteneur Docker?

Plusieurs processus s'exécutent dans un conteneur Docker, leurs PID sont isolés dans l'espace de noms du conteneur, existe-t-il un moyen de déterminer quels sont leurs PID sur l'hôte Docker?

Par exemple, un serveur Web Apache s'exécute dans un conteneur Docker (j'utilise une image Apache + PHP de Docker Hub ) et l'Apache, lorsqu'il démarre, crée plus de processus de travail à l'intérieur du conteneur. Ces processus de travail traitent en fait les demandes entrantes. Pour afficher ces processus, j'exécute pstree à l'intérieur du conteneur Docker:

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

Le processus parent Apache s'exécute sur le PID 1 à l'intérieur de l'espace de noms du processus conteneur. Cependant, du point de vue de l'hôte, il est également accessible, mais son PID sur l'hôte est différent et peut être déterminé en exécutant docker compose commande:

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

De cela, nous pouvons voir que le PID 1 de l'espace de noms du processus de conteneur correspond au PID 17985 sur l'hôte. Je peux donc exécuter pstree sur l'hôte, pour lister les enfants du processus Apache:

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

De cela, je suppose que de la même manière que le PID 1 dans le conteneur mappe au PID 17985 sur l'hôte, il mappe également:

  • PID 8 en conteneur jusqu'au PID 18010 sur l'hôte, et
  • PID 9 à PID 18011;
  • PID 10 à PID 18012 et ainsi de suite ...

(Cela me permet de déboguer les processus à partir du conteneur Docker, en utilisant des outils qui ne sont disponibles que sur l'hôte, et non dans le conteneur, comme strace)

Le problème est que je ne sais pas à quel point il est sûr de supposer que pstree répertorie les processus dans le même ordre à la fois dans le conteneur et dans l'hôte.

Ce serait formidable si quelqu'un pouvait suggérer un moyen plus fiable de détecter ce qu'est un PID sur l'hôte d'un processus spécifique exécuté à l'intérieur du conteneur Docker.

15
Lukas Normantas

Vous pouvez consulter le /proc/<pid>/status fichier pour déterminer le mappage entre le PID d'espace de noms et le PID global. Par exemple, si dans un conteneur Docker, je démarre plusieurs sleep 900 processus, comme ceci:

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

Je peux les voir courir dans le conteneur:

/ # 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

Je peux les regarder sur l'hôte:

# 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

Et pour n'importe lequel d'entre eux, je peux regarder le fichier status pour voir le pid de l'espace de noms:

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

En regardant la ligne NSpid, je peux voir que dans l'espace de noms PID ce processus a le pid 7. Et en effet, si je tue le processus 10394 sur l'hôte:

# kill 10394

Ensuite, dans le conteneur, je vois que PID 7 ne fonctionne plus:

/ # 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