2016-10-08 15 views
5

डॉकर कंटेनर में कई प्रक्रियाएं चल रही हैं, उनके पीआईडी ​​कंटेनर नेमस्पेस में अलग हैं, क्या यह पता लगाने का कोई तरीका है कि डॉकर होस्ट पर उनके पीआईडी ​​क्या हैं?डॉकर कंटेनर के अंदर चल रही प्रक्रिया के होस्ट में पीआईडी ​​क्या है?

उदाहरण के लिए वहाँ एक अपाचे वेब एक डोकर कंटेनर के अंदर चल रहा सर्वर, (मैं Docker Hub से अपाचे + PHP छवि का उपयोग), और अपाचे है, जब यह शुरू होता है कंटेनर के अंदर अधिक कार्यकर्ता प्रक्रियाओं पैदा करता है। वे कार्यकर्ता प्रक्रिया वास्तव में इनकमिंग अनुरोधों को संभालने में कामयाब रहे हैं।

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

माता पिता अपाचे प्रक्रिया कंटेनर प्रक्रिया नाम स्थान के अंदर पीआईडी ​​1 पर चलता है: इन प्रक्रियाओं मैं डोकर कंटेनर के अंदर pstree चलाने को देखने के लिए। हालांकि मेजबान के नजरिए से यह भी पहुँचा जा सकता है, लेकिन मेजबान पर अपने पीआईडी ​​अलग है और docker compose आदेश चलाकर निर्धारित किया जा सकता: इस से

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

हम देख सकते हैं कि कंटेनर प्रक्रिया के भीतर से पीआईडी ​​1 मेजबान पर पीआईडी ​​17 9 85 के लिए नामस्थान मानचित्र। इसलिए मैं मेजबान पर pstree चला सकते हैं, अपाचे प्रक्रिया के बच्चों सूची:

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

इस से मुझे लगता है कि एक ही तरह से कैसे पीआईडी ​​1 मेजबान पर 17,985 पीआईडी ​​को कंटेनर नक्शे में, यह भी नक्शे :

  • पीआईडी ​​8 कंटेनर पीआईडी ​​18011 के लिए मेजबान पर 18010, और
  • पीआईडी ​​9 पीआईडी ​​करने के लिए;
  • पीआईडी ​​10 18,012 और इतने पर पीआईडी ​​को ...

(यह उपकरण है कि केवल मेजबान पर ही उपलब्ध हैं का उपयोग कर डोकर कंटेनर से प्रक्रियाओं डिबग करने के लिए अनुमति देता है मुझे, और कंटेनर में नहीं , स्ट्रेस की तरह)

समस्या यह है कि मुझे नहीं पता कि यह कितना सुरक्षित है कि पस्ट्री कंटेनर और मेजबान दोनों में प्रक्रियाओं को सूचीबद्ध करता है।

बहुत अच्छा होगा अगर कोई डॉकर कंटेनर के अंदर चल रही एक विशिष्ट प्रक्रिया के होस्ट पर पीआईडी ​​क्या है, यह जानने के लिए एक और अधिक विश्वसनीय तरीका सुझा सकता है।

+0

पीआईडी ​​की भी मतलब हो सकता है ओएस धागे, कम से कम पर linux। आप कई धागे बनाकर और पीआईडीएस की गिनती करके जावा (या अन्य भाषा) के साथ जांच सकते हैं। – ieugen

उत्तर

11

आप नामस्थान पीआईडी ​​और वैश्विक पीआईडी ​​के बीच मैपिंग निर्धारित करने के लिए /proc/<pid>/status फ़ाइल देख सकते हैं। उदाहरण के लिए, एक डोकर कंटेनर में अगर मैं कई sleep 900 प्रक्रियाओं शुरू कर देते हैं:

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

मैं मेजबान पर इन देख सकते हैं::

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

मैं उन्हें कंटेनर में चल रहा है देख सकते हैं

# 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 

और उन में से किसी एक के लिए, मैं status फ़ाइल को देखने के नाम स्थान पीआईडी ​​को देखने के लिए कर सकते हैं:

+०१२३५१६४१०६१
# grep -i pid /proc/10394/status 
Pid: 10394 
PPid: 10366 
TracerPid: 0 
NSpid: 10394 7 

NSpid लाइन पर देखकर, मैं देख सकता हूं कि पीआईडी ​​नेमस्पेस के भीतर इस प्रक्रिया में पिड 7 है।और वास्तव में, अगर मैं होस्ट पर प्रक्रिया 10394 मारने:

# kill 10394 

फिर कंटेनर में मुझे लगता है कि पीआईडी ​​7 अब नहीं चल रहा है:

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

ऐसा लगता है कि यह मेरी समस्या हल करता है, इस सलाह के बाद मैं इस एक लाइनर के साथ पीआईडी ​​के पूर्ण मैपिंग को पुनर्प्राप्त कर सकता हूं: 'मैं $ में (ps -ef | grep $ (डॉकर निरीक्षण --format' {{.State.Pid} } 'php-sandbox) | awk' {print $ 2} '); grep एनएसपीआईडी ​​करें:/proc/$ i/स्थिति; done' –

संबंधित मुद्दे