पृष्ठभूमि मोड में एक चल रहे कंटेनर में बैश या एसएचएस कैसे प्राप्त करें?


933

मैं एक चल रहे डॉकटर कंटेनर में ssh या बैश करना चाहता हूं। कृपया, उदाहरण देखें:

$ sudo docker run -d webserver
webserver is clean image from ubuntu:14.04
$ sudo docker ps
CONTAINER ID  IMAGE            COMMAND    CREATED STATUS  PORTS          NAMES
665b4a1e17b6  webserver:latest /bin/bash  ...     ...     22/tcp, 80/tcp loving_heisenberg 

अब मैं कुछ इस तरह से प्राप्त करना चाहता हूं (रनिंग कंटेनर में जाना):

$ sudo docker run -t -i webserver (or maybe 665b4a1e17b6 instead)
$ root@665b4a1e17b6:/# 
However when I run the line above I get new CONTAINER ID
$ root@42f1e37bd0e5:/#

मैंने वैग्रंट का इस्तेमाल किया और मैं भी वैसा ही व्यवहार करना चाहूंगा vagrant ssh


वैकल्पिक रूप sudo docker exec -i -t 665b4a1e17b6 /bin/shसे उपयुक्त कार्यक्रमों और पैकेजों को स्थापित करने में सक्षम होने के लिए
fonjeekay

1
ध्यान दें कि चल रहे कंटेनर में सेंध लगाने के लिए SSH का उपयोग करना खराब अभ्यास है - यहां तर्क देखें । sudo docker exec -i -t container-name /bin/bashजाने का एक रास्ता है।
patryk.beza

जवाबों:


1306

जवाब है डॉकटर की attachकमान। तो ऊपर मेरे उदाहरण के लिए, समाधान होगा:

$ sudo docker attach 665b4a1e17b6 #by ID
or
$ sudo docker attach loving_heisenberg #by Name
$ root@665b4a1e17b6:/#

डॉकर संस्करण 1.3 या बाद के संस्करण के लिए: उपयोगकर्ता वाईआर 3 डी का धन्यवाद, जिसने कंटेनर के खोल को प्राप्त करने का एक और तरीका सुझाया। यदि हम उपयोग attachकरते हैं तो हम शेल के केवल एक उदाहरण का उपयोग कर सकते हैं। इसलिए यदि हम कंटेनर के खोल के एक नए उदाहरण के साथ एक नया टर्मिनल खोलना चाहते हैं, तो हमें बस निम्नलिखित को चलाने की आवश्यकता है:

$ sudo docker exec -i -t 665b4a1e17b6 /bin/bash #by ID

या

$ sudo docker exec -i -t loving_heisenberg /bin/bash #by Name
$ root@665b4a1e17b6:/#

5
वैकल्पिक रूप से, निष्पादित करेंsudo docker attach loving_heisenberg
थियागो पेरोट्टा

51
अटैच कमांड मेरे लिए काम नहीं करता है, यह कर्ता को फ्रीज करने का कारण बनता है .. किसी भी विचार क्यों हो रहा है?
मो। जे। मुग्राबी

10
बूट 2docker उपयोगकर्ताओं के लिए एक अनुस्मारक: sudo :) को हटा दें
Henno

17
-i -tबराबर-it
पाशा.झुकोव

47
यह चयनित होने के लिए एक खतरनाक उत्तर है और इसलिए अत्यधिक मतदान किया जाता है। docker attachउदाहरण के लिए, एक MongoDB उदाहरण के लिए आईएनजी उदाहरण को मार देगा। में और अधिक विस्तार से समझाया इस सवाल attach और execविभिन्न जानवरों रहे हैं।
१w

675

डॉकर 1.3 से आगे:

docker exec -it <containerIdOrName> bash

मूल रूप से, यदि डॉकटर कंटेनर को /bin/bashकमांड का उपयोग करके शुरू किया गया था, तो आप इसका उपयोग करके पहुंच सकते हैं attach। यदि नहीं, तो आपको कंटेनर का उपयोग करके बैश उदाहरण बनाने के लिए कमांड निष्पादित करने की आवश्यकता है exec

बैश छोड़ने के बिना बैश से बाहर निकलने के लिए भी एक दुष्ट प्रक्रिया में भाग लें:

exit

हां, यह इतना आसान है।


अभी भी पता चला है कि नैनो को कैसे काम करना है। ऐसा लगता है कि संलयन से docker-ssh शामिल हो सकता है
WiR3D

क्या गोदी में डिफ़ॉल्ट रूप से बैश सेट करने का कोई तरीका है?
ipeacocks

@ipeacocks हाँ, अगर डॉकटराइल में RUNकमांड है /bin/bash। लेकिन निर्भर करता है कि आपका क्या मतलब है। यदि आप कन्टेनर चलाना चाहते हैं और उसी टर्मिनल में तुरंत बैश उपलब्ध -itकराना चाहते हैं, तो इसे करना चाहिए
WiR3D

10
डॉकटर समूह का उपयोग करना बुरा व्यवहार है। कोई भी उपयोगकर्ता जो docker group में है, अनिवार्य रूप से sudo का उपयोग करने की आवश्यकता के बिना रूट अनुमतियों के साथ उपयोग किया जाता है। projectatomic.io/blog/2015/08/…
Maiku Mori

1
मुझे लगता है कि यह मेजबान सुरक्षा के दृष्टिकोण से बहुत अंतर नहीं करता है, चाहे आप sudoबनाम dockerसमूह का उपयोग करें । किसी भी तरह से, डॉकटर में निर्मित एक सुरक्षा छेद होता है जो अतिथि से मेजबान फ़ाइल सिस्टम में पूर्ण विशेषाधिकार प्रदान कर सकता है - चाहे आप डॉकटर समूह का उपयोग करें या sudoकंटेनर लॉन्च करने के लिए।
नोबार

123

हालांकि प्रश्न के लेखक ने विशेष रूप से कहा कि वे एक रनिंग कंटेनर में रुचि रखते हैं, यह भी ध्यान देने योग्य है कि यदि कंटेनर नहीं चल रहा है, लेकिन आप इसे अपने आसपास चलाने के लिए चलाना चाहते हैं:

docker run -i -t --entrypoint /bin/bash <imageID>


10
यह @ kraxor के उत्तर की तरह एक अलग कंटेनर देता है।
ब्लेज़ोरब्लेड

27

इसे इस्तेमाल करे:

sudo docker run -i -t webserver /bin/bash

स्रोत: https://docs.docker.com/articles/basics/#running-an-interactive-shell


14
यह उपयुक्त नहीं है, क्योंकि मुझे अलग कंटेनर आईडी मिलती है ( root@42f1e37bd0e5:/#और नहीं root@665b4a1e17b6:/#)
तैमूर फैज्रखमानोव

लिंक मर चुका है, आपको अपडेट करना चाहिए
अहमत करकाया

19

@ तैमूर के जवाब के आधार पर मैंने निम्नलिखित आसान स्क्रिप्ट बनाई है

सेट अप

निम्नलिखित सामग्री के साथ docker-sshअपने में फ़ाइल रखो$PATH

#!/bin/bash -xe

# docker container id or name might be given as a parameter
CONTAINER=$1

if [[ "$CONTAINER" == "" ]]; then
  # if no id given simply just connect to the first running container
  CONTAINER=$(docker ps | grep -Eo "^[0-9a-z]{8,}\b")
fi

# start an interactive bash inside the container
# note some containers don't have bash, then try: ash (alpine), or simply sh
# the -l at the end stands for login shell that reads profile files (read man)
docker exec -i -t $CONTAINER bash -l

नोट : कुछ कंटेनर में नहीं है bash, लेकिन ash, shआदि इन मामलों bashमें उपरोक्त स्क्रिप्ट में प्रतिस्थापित किया जाएगा।

प्रयोग

यदि आपके पास केवल एक रनिंग इंस्टेंस है, तो बस रन करें

$> docker-ssh 

अन्यथा, इसे डॉक आईडी पैरामीटर के साथ प्रदान करें जो आपको docker ps(पहले कर्नल) से मिलता है।

$> docker-ssh 50m3r4nd0m1d

क्या मुझे पता है कि हमें अंत में -l की आवश्यकता क्यों है?
नाम जी वीयू

पर्यावरण के मापदंडों को पढ़ते हुए, एक लॉगिन शेल के रूप में बैश शुरू करने के लिए (कमांड के ऊपर लाइन में वर्णित)
Matyas

12

यदि आपके कंटेनर में बैश स्थापित नहीं है, तो आप श को आज़मा सकते हैं:

docker exec -it CONTAINER /bin/sh

या पहले / बिन में गोले की तलाश करें:

docker export CONTAINER|tar -t|egrep ^bin/

"कांसुल" क्या है ? क्या आपके पास इसके लिए एक संदर्भ है? क्या आपका मतलब "कंसोल" है ?
पीटर मोर्टेंसन

9

मैंने एक कंटेनरीकृत एसएसएच सर्वर बनाया है जो किसी भी चालू कंटेनर को एसएसएच क्षमताएं प्रदान करता है। आपको अपना कंटेनर बदलने की आवश्यकता नहीं है। केवल आवश्यकता यह है कि कंटेनर में बैश हो।

यदि आपके पास 'web-server1' नाम का कंटेनर है। निम्न डॉक रन कमांड एक दूसरा कंटेनर शुरू करेगा जो पहले कंटेनर के लिए SSH प्रदान करेगा।

docker run -ti --name sshd-web-server1 -e CONTAINER=web-server1 -p 2222:22 \
-v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):/usr/bin/docker \
jeroenpeeters/docker-ssh

अधिक पॉइंटर्स के लिए, https://github.com/jeroenpeeters/docker-ssh पर चेकआउट करें


यह स्वीकृत उत्तर होना चाहिए ^
Nam G VU

वैसे, आपके समाधान का उपयोग करके ssh सत्र शुरू करते समय हम कैसे .bashrc ऑटो लोड कर सकते हैं? साथ ही github github.com/jeroenpeeters/docker-ssh/issues/30
Nam G VU

6

@jpetazzo ने इस विषय के बारे में एक भयानक पोस्ट किया है । संक्षिप्त उत्तर का उपयोग करना होगा nsenter:

PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)
nsenter --target $PID --mount --uts --ipc --net --pid

पुनश्च: पोस्ट की टिप्पणियों में चर्चा की जाँच करने के लिए मत भूलना ...

चियर्स


1
यह एक पुरानी पोस्ट है जो अब वास्तव में आवश्यक नहीं है । @ WiR3D का docker execसमाधान अधिक सुविधाजनक है।
drevicko

4

आप पॉकवर्क के साथ डॉकटर कंटेनर को एक निष्क्रिय आईपी पता दे सकते हैं, और उसके बाद उस नए आईपी पते के साथ एसएसएच मशीन में।

यह अधिक "पारंपरिक" (ssh) docker attachहोगा, जैसे कि एप्लिकेशन-विशिष्ट कमांड का उपयोग करने के बजाय , और अंततः सिस्टम और संस्करणों में इसे और अधिक 'पोर्टेबल' बना देगा।


कृपया, इसे करने के तरीके को जोड़ दें। यदि ईमानदार होना है, तो मुझे वास्तव में इसकी आवश्यकता है, लेकिन मेरे पास इसके लिए सबसे सरल समाधान खोजने का समय नहीं है। क्या आप यहाँ अपना उत्तर दे सकते हैं? यह बहुत अच्छा होगा ..
तैमूर फैज़्रखमानोव

2
इसे पूरा करने के 2 तरीके हैं, लेकिन यह सरल नहीं है, और एक बड़ा पद बन जाएगा। आप पाइपवर्क या इस लिंक का उपयोग करने के लिए अपने आप से इस लिंक की जांच कर सकते हैं , चुड़ैल अनिवार्य रूप से पिपवर्क के समान ही पूरा करती है और थोड़ा अधिक सरल है, लेकिन आपको इसे मैन्युअल रूप से करने की आवश्यकता है। तो यह निर्भर करता है कि कितने सर्वर जहां बात कर रहे हैं। यदि आप कुछ अधिक विशिष्ट नहीं समझ सकते हैं, तो मुझे बताएं। लेकिन मेरे पास पूर्ण ट्यूटोरियल लिखने का समय भी नहीं है।
राडारियास

आप सही हैं - ऐसा करने का कोई स्पष्ट और सरल तरीका नहीं है (लिंक के लिए धन्यवाद, मुझे लगता है कि मैं इसे बाद में फिर से
लिखूंगा

3

कभी-कभी यह डॉकटर कंटेनर में ssh करने में सक्षम होना आसान होगा, खासकर विकास के दौरान। निम्नलिखित डॉकर छवि एक निजी कुंजी का उपयोग करके कंटेनर में ssh करने की अनुमति देती है:

UbuntuWithSSH-डोकर

Dockerfile की गिस https://gist.github.com/devbkhadka/98792f7bca57f9778793b2db758b3d07 है



1

अंदर जाओ

के goinsideसाथ कमांड लाइन उपकरण स्थापित करें:

sudo npm install -g goinside

और एक डॉकटर कंटेनर के साथ एक उचित टर्मिनल आकार के साथ अंदर जाएं:

goinside docker_container_name

अधिक जानकारी के लिए इसे देखें ।



0

सिर्फ जानकारी के लिए। यदि आपको एक साधारण कंटेनर में लॉगिन करने की आवश्यकता है जो डेमॉन नहीं है, तो आपको निम्नलिखित कमांड का उपयोग करने की आवश्यकता है:

docker start {id}
docker attach {id}

-1

अगर कंटेनर को उदाहरण के लिए डेटा-ओनली कंटेनर की तरह रोका जाता है, तो हर बार जब आप डेटा कंटेनर को संलग्न करना चाहते हैं, तो एक अच्छा समाधान एक फेंकने वाला कंटेनर चलाना होता है। इस मामले में डेटा कंटेनर स्वयं पूरी तरह से खाली हो सकता है, क्योंकि अस्थायी कंटेनर में ओएस उपकरण होंगे।

$ docker run --rm --volumes-from mydata -it ubuntu bash
root@645045d3cc87:/# ls /mydata
root@645045d3cc87:/# touch /mydata/foo
root@645045d3cc87:/# exit
exit
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.