2016-10-08 22 views
5

Istnieje kilka procesów uruchomionych w kontenerze Docker, ich PIDs są izolowane w przestrzeni nazw kontenerów, czy istnieje sposób, aby dowiedzieć się, jakie są ich PIDy na hoście Docker?Co to jest PID w hoście, procesu działającego w kontenerze Docker?

Na przykład serwer WWW Apache działa wewnątrz kontenera Docker, (używam Apache + obraz PHP z Docker Hub), a Apache, gdy się uruchamia, tworzy więcej procesów roboczych wewnątrz kontenera. Te procesy robocze faktycznie obsługują przychodzące żądania. Aby zobaczyć te procesy biegnę pstree wewnątrz pojemnika Döcker:

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

Rodzic proces Apache zjazdy na PID 1 wewnątrz przestrzeni nazw procesów pojemnik. Jednak z punktu widzenia gospodarza można również uzyskać, ale jego PID na hoście jest inny i może być określona przez uruchomiony docker compose polecenie:

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

Z tego widzimy, że PID 1 od wewnątrz procesu pojemnika mapy przestrzeni nazw do PID 17985 na hoście. Więc mogę uruchomić pstree na hoście, notować dzieci procesu Apache:

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

Od tego zakładam, że w taki sam sposób jak PID 1 w mapach kontenerowych do PID 17985 na hoście, ale również mapy :

  • PID 8 w zbiorniku do Pid 18010 na gospodarza, a
  • PID 9 do PID 18011;
  • PID 10 do PID 18012 i tak dalej ...

(To pozwala mi debugować procesy z pojemnika Döcker, przy użyciu narzędzi, które są dostępne wyłącznie tylko na komputerze, a nie w pojemniku , jak strace)

Problem polega na tym, że nie wiem, jak bezpiecznie założyć, że pstree wymienia procesy w tej samej kolejności zarówno w kontenerze, jak i na hoście.

Byłoby świetnie, gdyby ktoś mógł zaproponować bardziej niezawodny sposób na wykrycie, co jest PID na hoście określonego procesu działającego w kontenerze Docker.

+0

PID może również oznaczać OS wątki, przynajmniej na linux. Możesz sprawdzić w java (lub innym języku), tworząc wiele wątków i licząc PIDS, które otrzymujesz. – ieugen

Odpowiedz

11

Możesz przejrzeć plik /proc/<pid>/status, aby określić mapowanie między identyfikatorem PID przestrzeni nazw a globalnym identyfikatorem PID. Na przykład, jeśli w pojemniku Döcker zacznę kilka sleep 900 procesy, na przykład:

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

widzę ich działa w pojemniku:

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

mogę patrzeć na te na hoście:

# 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 

I dla jednego z tych, mogę zajrzeć do pliku status zobaczyć PID namespace:

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

Patrząc na linii NSpid, widzę, że w przestrzeni nazw PID tego procesu PID 7.I rzeczywiście, jeśli zabiję proces 10394 na hoście:

# kill 10394 

Następnie w pojemniku widzę, że PID 7 nie jest już uruchomiony:

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

Wygląda na to, że rozwiązuje to mój problem, postępując zgodnie z tą radą, mogę pobrać pełne odwzorowanie identyfikatorów PID za pomocą tej jednej linijki: 'for i in $ (ps -ef | grep $ (docker inspect --format '{{.State.Pid} } 'php-sandbox) | awk' {print $ 2} '); do grep NSpid:/proc/$ i/status; done' –

Powiązane problemy