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

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

$ sudo docker run -d webserverwebserver is clean image from ubuntu:14.04$ sudo docker psCONTAINER ID  IMAGE            COMMAND    CREATED STATUS  PORTS          NAMES665b4a1e17b6  webserver:latest /bin/bash  ...     ...     22/tcp, 80/tcp loving_heisenberg 

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

$ sudo docker run -t -i webserver (या शायद 665b4a1e17b6 इसके बजाय)
$ root@665b4a1e17b6:/#

हालांकि जब मैं ऊपर लाइन चलाता हूं तो मुझे नई कंटेनर आईडी मिलती है:

$ root@42f1e37bd0e5:/#

मैंने योनि का इस्तेमाल किया और मैं एक समान व्यवहार प्राप्त करना चाहता हूं vagrant ssh.

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

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

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

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

या

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

डॉकर 1.3 से आगे:

docker exec -it <containerIdOrName> bash

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

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

exit

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

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

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

यह कोशिश करो:

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

स्रोत: https://docs.docker.com/engine/reference/commandline/run/

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

सेटअप

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

#!/bin/bash -xe# docker container id or name might be given as a parameterCONTAINER=$1if [[ "$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

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

docker exec -it CONTAINER /bin/sh

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

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

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

यदि आपके पास 'वेब-सर्वर 1' नाम वाला कंटेनर है । निम्नलिखित डॉकर रन कमांड एक दूसरा कंटेनर शुरू करेगा जो पहले कंटेनर के लिए एसएसएच प्रदान करेगा ।

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

@jpetazzo है इस विषय के बारे में बहुत बढ़िया पोस्ट. संक्षिप्त उत्तर का उपयोग करना होगा nsenter:

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

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

चीयर्स

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

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

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

UbuntuWithSSH-डोकर

डॉकरफाइल का सार है https://gist.github.com/devbkhadka/98792f7bca57f9778793b2db758b3d07.

ध्यान दें कि चल रहे कंटेनर में बैश करने के लिए एसएसएच का उपयोग करना खराब अभ्यास है-देखें यहां तर्कसुडो डॉकर निष्पादन-आई-टी कंटेनर-नाम/बिन / बैश जाने का एक तरीका है ।

वैकल्पिक रूप से सुडो डॉकर एक्ज़ेक-आई-टी 665 बी 4 ए 1 ई 17 बी 6 /बिन/श उपयुक्त प्रोग्राम और पैकेज स्थापित करने में सक्षम होने के लिए