कमांड को निर्दिष्ट किए बिना मैं डॉक कंटेनर में पूर्ण ओएस कैसे चला सकता हूं?


25

मैं कोरओएस डॉकर डॉक्यूमेंटेशन का पालन ​​कर रहा हूं और इसमें कमांड जैसे कंटेनरों को शुरू करने का उल्लेख है:

docker run someImageName /bin/somebinary

someImageNameएक छवि कहाँ है जब / बिन / somebinary बाहर निकलता है, तो छवि अब नहीं चलेगी।

मैं बस किसी भी बायनेरिज़ को चलाने के लिए निर्दिष्ट किए बिना, एक छवि चलाना चाहूंगा। इसके बजाय, मैं बस उन सेवाओं (जैसे, systemd / sysvinit) को चलाना चाहता हूं जो सामान्य रूप से छवियों के ओएस के अंदर चलती हैं

ऐसा लगता है कि सबसे आम बात जो कोई भी कभी डॉकटर के साथ करना चाहेगा, लेकिन बिना कमांड रिटर्न के एक छवि चलाने की कोशिश कर रहा है:

2014/02/05 14:49:19 Error: create: No command specified

मैं एक आदेश को निर्दिष्ट करने के बजाय एक डॉक कंटेनर कैसे शुरू कर सकता हूं और एक पूर्ण ओएस चला सकता हूं ?


यह इस सवाल का एक डुप्लिकेट है stackoverflow.com/questions/19332662/…
फ्रेड द मैजिक वंडर डॉग

@FredtheMagicWonderDog बिलकुल नहीं, हालाँकि उत्तर एक ही है।
मिक्मेकाना

जवाबों:


24

यहाँ प्रलेखित के रूप में, आप बस /sbin/initकमांड के रूप में किसी भी अन्य यूनिक्स को एकल उपयोगकर्ता से बहु-उपयोगकर्ता मोड की तरह चलाते हैं ।

/programming/19332662/start-full-container-in-docker

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

मैं कहूंगा कि डॉकटर की पूरी बात एप्लिकेशन कंटेनरों को आसान बनाने के लिए है, ताकि आपको केवल एक एप्लिकेशन को कॉन्फ़िगर करना पड़े, न कि पूरे ओएस को।


धन्यवाद। छवि को / sbin / init के साथ शुरू करने के बाद, मैं भाग गया docker ps -notrunc, कंटेनर ID sudo /usr/sbin/lxc-attach -n containerIDप्राप्त करने के लिए , फिर चल रही छवि में जाने के लिए। जैसा कि अन्य पोस्टर में उल्लेख किया गया है, मुझे वास्तव में एक दूसरे
इनिट की

यह कहना कि आपको VM में एक पूर्ण विकसित OS चलाने की आवश्यकता नहीं है, यह कहने के समान है कि आपको भौतिक मशीन में पूर्ण विकसित OS चलाने की आवश्यकता नहीं है, हाँ यह सच है कि कर्नेल मूल रूप से एक नियमित x86 / C है कार्यक्रम है कि stdlib के बिना चलाता है और इसलिए init करते हैं, लेकिन यह है
रेयान

11

डोकर प्रबंधन और की तैनाती के लिए एक प्रणाली है आवेदन कंटेनर, नहीं ऑपरेटिंग सिस्टम कंटेनरों। ऐसा लगता है जैसे आप एक ऑपरेटिंग सिस्टम को बूट करने के साथ एक डॉक कंटेनर चलाने का अनुमान लगा रहे हैं।

आपके डॉकटर कंटेनर एकल-उद्देश्य वाले होने चाहिए, बहुत ही संकीर्ण रूप से स्कोप किए गए अनुप्रयोग जो एक ही आदेश के साथ शुरू किए जा सकते हैं। यदि आप उससे अधिक जटिल चीज की तलाश कर रहे हैं, तो डॉकर वह समाधान नहीं है जिसकी आप तलाश कर रहे हैं। उस स्थिति में, KVM, ESXi, OpenVZ, LXD आदि देखें।

यदि आप सिर्फ इस बात की तलाश कर रहे हैं कि आप एक डिफॉल्ट को कैसे निर्दिष्ट कर सकते हैं CMDऔर ENTRYPOINTअपने कंटेनरों के लिए, तो आप डॉकरफाइल का उपयोग करके बिल्ड-टाइम पर कर सकते हैं ।


5
मुझे पता है कि डॉकटर क्या है। मैं इंगित करूंगा कि अनुप्रयोग कंटेनर ऑपरेटिंग सिस्टम, उदाहरण के लिए, फेडोरा या उबंटू पर आधारित हैं। यूनिक्स पर लगातार अनुप्रयोग - यहां तक ​​कि उपयोगकर्ता केवल डोज़र कंटेनरों जैसे यूनिक्स भी - initscripts या systemd यूनिट फाइलों से शुरू किए जाते हैं। उदाहरण के लिए, यदि मेरा ऐप क्रैश हो जाता है, तो मैं चाहूंगा कि यह अपने आप रीस्टार्ट हो जाए, थ्रेशोल्ड के साथ - जैसे सिस्टमड प्रदान करता है।
14

5
आप अपने कंटेनरों में बहुत अधिक रटना करने की कोशिश कर रहे हैं - वे एक ऑपरेटिंग सिस्टम नहीं हैं। प्रक्रिया के पर्यवेक्षण को प्रत्येक कंटेनर के बाहर संभाला जाना चाहिए।
EEAA 15

1
तो अगर एक प्रक्रिया मर जाती है ... बस पूरे कंटेनर को पुनरारंभ करें? मुझे लगता है कि यह इतना महंगा नहीं है कि ठीक हो सकता है। यह अजीब लगता है - मेरे कंटेनर में एक / sbin / init है, लेकिन इसका उपयोग कभी नहीं किया जाता है ...
mikemaccana

1
हां, यही विचार है। आपके कंटेनर में एक है /sbin/init, लेकिन यह उसके पास नहीं है । आप संभवतः एक डिफ़ॉल्ट ubuntu कंटेनर या ऐसा कुछ उपयोग करते हैं। वहाँ एक हैं बहुत कुछ इन कंटेनरों कि यदि आप चाहें हटाया जा सकता है में बिट्स की।
EEAA

1
@ValkoSipuli आप निश्चित रूप से उस राय को रखने के लिए स्वतंत्र हैं। मैं अभी भी यह सुनिश्चित करता हूं कि एक कंटेनर के अंदर एक से अधिक प्रक्रियाएं चलाने से पहले स्थान पर कंटेनर का उपयोग करने के कारण की बहुत उपेक्षा होती है। क्या कंटेनर के अंदर ओएस चलाने के लिए कोई जगह है? शायद। हालांकि, यह एक अपवाद है, और पेशेवरों / विपक्षों पर बहुत विचार-विमर्श किए बिना नहीं किया जाना चाहिए।
EEAA

5

एक कंटेनर में एक पूर्ण ऑपरेटिंग सिस्टम चलाने के लिए निम्नलिखित डॉकरीफाइल बनाएं:

FROM fedora:25

CMD /sbin/init

फिर कंटेनर बनाएं और शुरू करें और इसके अंदर चल रही सेवाओं का पता लगाने के लिए इसके अंदर एक शेल दर्ज करें:

docker build -t os .
docker run -d --privileged --name os os
docker exec -it os bash

कंटेनर के अंदर पूर्ण सिस्टमड सेवाएं। सुंदर।


0
docker pull ubuntu

जितनी जरूरत हो उतनी ही इमेज से बस चलाएं। नए कंटेनरों का निर्माण किया जाएगा और फिर उन्हें शुरू किया जा सकता है और प्रत्येक को अपने स्वयं के कॉन्फ़िगरेशन को सहेजना बंद कर दिया जा सकता है। आपकी सुविधा के लिए अपने प्रत्येक कंटेनर को "--name" के साथ एक नाम देना बेहतर होगा।

फाई:

docker run --name MyContainer1 <ubuntu image>
docker run --name MyContainer2 <ubuntu image>
docker run --name MyContainer3 <ubuntu image>

बस।

$ docker ps
CONTAINER ID        IMAGE            CREATED          STATUS               NAMES
a7e789711e62        67759a80360c   12 hours ago     Up 2 minutes         MyContainer1
87ae9c5c3f84        67759a80360c   12 hours ago     Up About a minute    MyContainer2
c1524520d864        67759a80360c   12 hours ago     Up About a minute    MyContainer3

उसके बाद आपके पास अपने कंटेनर हमेशा के लिए बन जाते हैं और आप उन्हें वीएम की तरह शुरू और बंद कर सकते हैं।

docker start MyContainer1

कंटेनर में जाने के लिए और वह करें जो आप करना चाहते हैं:

docker exec -it MyContainer1 bash
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.