दोनों कंटेनर में कमांड निष्पादित करने में सक्षम होंगे। दोनों कंटेनर को अलग कर सकते थे।
तो क्या करते हैं और निष्पादित करने के बीच वास्तविक अंतर क्या है?
जवाबों:
एक प्रतिबद्ध पीआर था जो डॉक्टर में जोड़ा गया था:
नोट: यह कमांड (
attach
) एक कंटेनर में एक नई प्रक्रिया चलाने के लिए नहीं है। देखें:docker exec
।
" डॉकटरrun -d
का जवाब । रनड कंटेनर ( ) के अंदर बश \ _श कैसे प्राप्त करें ? " अंतर दिखाता है।
(docker> = 1.3) यदि हम उपयोग करते हैं
docker attach
, तो हम शेल के केवल एक उदाहरण का उपयोग कर सकते हैं ।
इसलिए यदि हम कंटेनर के खोल के नए उदाहरण के साथ नया टर्मिनल खोलना चाहते हैं, तो हमें बस चलाने की आवश्यकता हैdocker exec
यदि डॉकटर कंटेनर को
/bin/bash
कमांड का उपयोग करना शुरू किया गया था , तो आप इसे अटैचमेंट का उपयोग करके एक्सेस कर सकते हैं, यदि नहीं, तो आपको कंटेनर के अंदर बैश इंस्टेंस बनाने के लिए कमांड को निष्पादित करने की आवश्यकता हैexec
।
जैसा कि इस अंक में बताया गया है :
- अटैच एक कंटेनर में एक अतिरिक्त चीज चलाने के लिए नहीं है, यह चल रही प्रक्रिया में संलग्न करने के लिए है।
- "
docker exec
" विशेष रूप से पहले से शुरू किए गए कंटेनर में नई चीजों को चलाने के लिए है, यह एक शेल या कुछ अन्य प्रक्रिया हो।
एक ही मुद्दा जोड़ता है:
जबकि
attach
इसका नाम विशेष रूप से LXC कमांड के कारण नहीं रखा गया हैlxc-attach
(जो कि अधिक akin हैdocker exec <container> /bin/sh
, लेकिन LXC विशिष्ट है), इसका शाब्दिक रूप से आपको डॉकर प्रक्रिया शुरू करने का एक विशेष उद्देश्य है।
इस बात पर निर्भर करता है कि प्रक्रिया क्या है व्यवहार भिन्न हो सकता है , उदाहरण के लिए संलग्न करने के/bin/bash
लिए आपको एक शेल देना होगा, लेकिन रेडिस-सर्वर के साथ संलग्न करना ऐसा होगा जैसे आपने बिना डीमॉनेटाइजिंग के सीधे रेडिस शुरू कर दिया हो।
जब एक कंटेनर / बिन / बैश का उपयोग शुरू किया जाता है तो यह कंटेनर PID 1 हो जाता है और कंटेनर के PID 1 के अंदर पाने के लिए docker अनुलग्नक का उपयोग किया जाता है। इसलिए docker संलग्न करें <कंटेनर-आईडी> आपको bash टर्मिनल के अंदर ले जाएगा क्योंकि यह PID 1 है जैसा कि हमने कंटेनर शुरू करते समय उल्लेख किया था। कंटेनर से बाहर निकलने से कंटेनर बंद हो जाएगा।
जबकि docker exec कमांड में आप निर्दिष्ट कर सकते हैं कि आप किस शेल में प्रवेश करना चाहते हैं। यह आपको कंटेनर के पीआईडी 1 पर नहीं ले जाएगा। यह बैश के लिए एक नई प्रक्रिया का निर्माण करेगा। docker exec -it <कंटेनर-आईडी> बैश । कंटेनर से बाहर निकलने से कंटेनर बंद नहीं होगा।
आप nsenter का भी उपयोग कर सकते हैं कंटेनर के अंदर प्रवेश करने के का । nsenter -m -u -n -p -i -t -t <pid of container> आप कंटेनर के PID का उपयोग कर पा सकते हैं: docker निरीक्षण <कंटेनर-id> | grep पीआईडी
नोट: यदि आपने अपने कंटेनर को -d फ्लैग के साथ शुरू किया है, तो कंटेनर से बाहर निकलने से कंटेनर बंद नहीं होगा, चाहे आप अंदर जाने के लिए अटैच या निष्पादित करें।
जैसा कि माइकल सन ने अपने जवाब में कहा है
docker exec
एक नए कमांड को निष्पादित करता है / कंटेनर के वातावरण में एक नई प्रक्रिया बनाता है, जबकिdocker attach
बस मानक इनपुट / आउटपुट / मुख्य प्रक्रिया की त्रुटि (पीआईडी 1 के साथ) कंटेनर के अंदर वर्तमान मानक इनपुट / आउटपुट / त्रुटि की टर्मिनल से जोड़ता है (टर्मिनल) आप कमांड चलाने के लिए उपयोग कर रहे हैं)।
मेरा उत्तर आपको उपरोक्त कथन को मान्य करने और अधिक स्पष्ट रूप से समझने पर अधिक ध्यान देगा।
एक टर्मिनल विंडो खोलें और कमांड चलाएं docker run -itd --name busybox busybox /bin/sh
। busybox
यदि पहले से मौजूद नहीं है तो कमांड इमेज को खींच लेगा । यह तब नाम के साथ एक कंटेनर बनाएगाbusybox
इस छवि का उपयोग करके ।
आप कमांड चलाकर अपने कंटेनर की स्थिति की जांच कर सकते हैं docker ps -a | grep busybox
।
यदि आप चलाते हैं docker top busybox
, तो आपको आउटपुट कुछ इस तरह से देखना चाहिए।
UID PID PPID C STIME TTY TIME CMD
root 7469 7451 0 11:40 pts/0 00:00:00 /bin/sh
बेशक PID
, PPID
और , और अन्य मूल्य आपके मामले में भिन्न होंगे। आप अन्य उपकरणों और उपयोगिताओं का उपयोग कर सकते हैं pstree
, जैसे ,top
, htop
की सूची देखने के लिए PID
और PPID
।
PID
और PPID
प्रक्रिया आईडी और माता पिता प्रक्रिया आईडी का मतलब है। प्रक्रिया तब शुरू हुई जब हमने बनाया और कमांड के साथ हमारे कंटेनर को शुरू किया /bin/sh
। अब, कमांड चलाएँ docker attach busybox
। यह आपके टर्मिनल पर कंटेनर के मानक इनपुट / आउटपुट / त्रुटि स्ट्रीम को संलग्न करेगा।
कंटेनर को संलग्न करने के बाद, कमांड चलाकर शेल सत्र बनाएं sh
। प्रेस CTRL-p CTRL-q
क्रम। यह कंटेनर से टर्मिनल को अलग कर देगा और कंटेनर को चालू रखेगा। अगर तुम अब चलाओगेdocker top busybox
, तो आपको सूची में दो प्रक्रियाएँ देखनी चाहिए।
UID PID PPID C STIME TTY TIME CMD
root 7469 7451 0 11:40 pts/0 00:00:00 /bin/sh
root 7737 7469 0 11:43 pts/0 00:00:00 sh
लेकिन वो PPID
दोनों प्रक्रियाओं में अंतर होगा। वास्तव में, PPID
दूसरी प्रक्रिया का स्वरूप PID
पहले वाले के समान होगा । पहली प्रक्रिया शेल सत्र के लिए मूल प्रक्रिया के रूप में कार्य करती है जिसे हमने अभी बनाया है।
अब, भागो docker exec -it busybox sh
। एक बार कंटेनर के अंदर, busybox
कमांड चलाकर किसी अन्य टर्मिनल विंडो में कंटेनर के लिए चल रही प्रक्रियाओं की सूची देखेंdocker top busybox
। आपको कुछ इस तरह से देखना चाहिए
UID PID PPID C STIME TTY TIME CMD
root 7469 7451 0 11:40 pts/0 00:00:00 /bin/sh
root 7737 7469 0 11:43 pts/0 00:00:00 sh
root 7880 7451 0 11:45 pts/1 00:00:00 sh
PPID
पहले और तीसरे प्रक्रिया का एक ही, जो यह पुष्टि है कि हो जाएगा docker exec
, जबकि कंटेनर के परिवेश में एक नई प्रक्रिया बनाता है docker attach
बस इसी मानक इनपुट / आउटपुट / वर्तमान की त्रुटि के मानक इनपुट / आउटपुट / कंटेनर के अंदर मुख्य प्रक्रिया की त्रुटि को जोड़ता है टर्मिनल।
डॉकर एक नए कमांड को निष्पादित करता है / कंटेनर के वातावरण में एक नई प्रक्रिया बनाता है, जबकि डॉक संलग्नक मानक इनपुट / आउटपुट / मुख्य प्रक्रिया की त्रुटि (पीआईडी 1 के साथ) कंटेनर के अंदर संबंधित मानक इनपुट / आउटपुट / वर्तमान की त्रुटि को जोड़ता है। टर्मिनल (टर्मिनल जिसे आप कमांड चलाने के लिए उपयोग कर रहे हैं)।
एक कंटेनर एक पृथक वातावरण है, जिसमें कुछ प्रक्रियाएं पर्यावरण में चल रही हैं। विशेष रूप से, एक कंटेनर का अपना फ़ाइल सिस्टम स्पेस और PID स्पेस होता है जो होस्ट और अन्य कंटेनरों से अलग होता है। जब कंटेनर "docker run -it ..." का उपयोग करना शुरू कर दिया जाता है, तो मुख्य प्रक्रिया में एक छद्म ट्टी और STDIN होगा जो खुला होगा। जब टीटीआई मोड में संलग्न किया जाता है, तो आप कॉन्फ़िगर करने योग्य कुंजी अनुक्रम का उपयोग करके कंटेनर से अलग कर सकते हैं (और इसे छोड़ देना)। डिफ़ॉल्ट अनुक्रम CTRL-p CTRL-q है। आप -detach-keys विकल्प या कॉन्फ़िगरेशन फ़ाइल का उपयोग करके मुख्य अनुक्रम को कॉन्फ़िगर करते हैं। आप डॉक अटैच के साथ एक अलग कंटेनर में रैटैच कर सकते हैं।
डॉकर का निष्पादन कंटेनर के वातावरण के अंदर एक नई प्रक्रिया शुरू करता है, अर्थात कंटेनर के पीआईडी स्थान के अंतर्गत आता है।
उदाहरण के लिए, यदि आप "docker run -dit XXX / bin / bash" का उपयोग करके अपना कंटेनर शुरू करते हैं, तो आप दो अलग-अलग टर्मिनलों का उपयोग करके कंटेनर (मुख्य प्रक्रिया) से जुड़ सकते हैं। जब आप एक टर्मिनल में इनपुट कर रहे हैं, तो आप देख सकते हैं कि यह दूसरे टर्मिनल में दिखाई देता है, क्योंकि दोनों टर्मिनल एक ही प्रकार से जुड़े हुए हैं। सावधान रहें कि आप अब कंटेनर की मुख्य प्रक्रिया में हैं, यदि आप "निकास" टाइप करते हैं, तो आप कंटेनर से बाहर निकल जाएंगे ( इसलिए सावधान रहें, अलग करने के लिए डिटैच-कीज़ का उपयोग करें ), और आप दोनों टर्मिनलों से बाहर निकलेंगे। लेकिन अगर आप दो टर्मिनलों में “docker exec –it XXX / bin / bash” चलाते हैं, तो आपने कंटेनर के अंदर दो नई प्रक्रियाएँ शुरू कर दी हैं, और वे एक दूसरे से और मुख्य प्रक्रिया से संबंधित नहीं हैं, और आप उनसे सुरक्षित रूप से बाहर निकल सकते हैं ।
nsenter
। क्या आप विस्तार से समझा सकते हैं? विकल्पों को स्पष्ट करना क्रम में होगा। सभी नामस्थानों में प्रवेश क्यों नहीं? ये खास क्यों?