मैं डॉकटर कंटेनर के खोल में कैसे जा सकता हूं?


1160

मैं डॉकर के साथ काम करना शुरू कर रहा हूं। मैं वर्डप्रेस बेस इमेज और डॉकटर-कंपोज का उपयोग कर रहा हूं।

मैं प्रारंभिक निर्माण के दौरान बनाई गई फ़ाइलों / निर्देशिकाओं का निरीक्षण करने के लिए कंटेनरों में से एक में ssh करने की कोशिश कर रहा हूं। मैंने दौड़ने की कोशिश की docker-compose run containername ls -la, लेकिन उसने कुछ नहीं किया। यहां तक ​​कि अगर यह किया है, मैं नहीं बल्कि एक सांत्वना है जहाँ मैं एक एकल आदेश चलाने के बजाय निर्देशिका संरचना पार कर सकते हैं। डॉकर के साथ ऐसा करने का सही तरीका क्या है?


तो ऐसा लगता है कि उत्तर docker संलग्न है। लेकिन मैं डॉकटर-कंपोज से कैसे मिल सकता हूं?
एंड्रयू

3
docker exec Askubuntu.com/a/543057/35816 का उपयोग करें । कंटेनर आईडी का उपयोग करेंdocker ps
मौरिसियो शेफ़र

26
sudo docker run -it --entrypoint /bin/bash <container_name>अंतःक्रियात्मक रूप से कंटेनर में जाता है। तब कोई कंटेनर में फ़ाइल सिस्टम का निरीक्षण कर सकता हैcd <path>
सर्गेई

जवाबों:


1729

docker attachआपको आपके डॉकटर कंटेनर से कनेक्ट करने देगा, लेकिन यह वास्तव में वैसा नहीं है ssh। यदि आपका कंटेनर एक वेबसर्वर चला रहा है, उदाहरण के लिए, docker attachसंभवतः आपको वेब सर्वर प्रक्रिया के स्टडआउट से कनेक्ट करेगा । यह जरूरी नहीं कि आप एक खोल दे देंगे।

docker execआदेश शायद आप के लिए क्या देख रहे है, यह आपको मौजूदा कंटेनर के अंदर मनमानी कमांड चलाने देगा। उदाहरण के लिए:

docker exec -it <mycontainer> bash

बेशक, आप जो भी कमांड चला रहे हैं वह कंटेनर फाइल सिस्टम में मौजूद होना चाहिए।

उपरोक्त कमांड <mycontainer>में लक्ष्य कंटेनर का नाम या आईडी है। इससे कोई फर्क नहीं पड़ता कि आप उपयोग कर रहे हैं या नहीं docker compose; बस docker ps(या पहले कॉलम में प्रदर्शित एक हेक्साडेसिमल स्ट्रिंग) या नाम (अंतिम कॉलम में प्रदर्शित) को चलाएं और उपयोग करें। जैसे, दिया गया:

$ docker ps
d2d4a89aaee9        larsks/mini-httpd   "mini_httpd -d /cont   7 days ago          Up 7 days                               web                 

मैं दौड़ सकता हूं:

$ docker exec -it web ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
18: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.3/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe11:3/64 scope link 
       valid_lft forever preferred_lft forever

मैं एक ही चीज को पूरा कर सकता था:

$ docker exec -it d2d4a89aaee9 ip addr

इसी तरह, मैं कंटेनर में एक शेल शुरू कर सकता हूं;

$ docker exec -it web sh
/ # echo This is inside the container.
This is inside the container.
/ # exit
$

76
इसके अलावा, docker execकेवल रनिंग कंटेनर (अन्यथा उपयोग docker run -it --entrypoint /bin/bashया समान) पर काम करता है ।
L0j1k

59
आपकी सुविधा के लिए, -itका एक संयोजन है -iऔर -tहै जो --interactiveक्रमश: ( "STDIN खोलने भले ही संलग्न नहीं रखें") --tty( "का आवंटन एक छद्म TTY")।
एड्रियन फोल्डर

23
अल्पाइन लिनक्स आधारित कंटेनरों में आपको बैश नहीं हो सकता है, इसलिए यदि हां, तो इसके बजाय श का उपयोग करें।
रॉबिन ग्रीन

9
@ L0j1k यह docker run -it --entrypoint /bin/bash <imageid> --any --more --argsसिर्फ लोगों के लिए स्पष्ट करने के लिए है
अलेक्जेंडर मिल्स

2
@AlexanderMills हां, और आगे स्पष्ट करने के लिए, जिन्हें --any --more --argsआपने छवि के रूप में परिभाषित किया है, CMDउन्हें डॉकटर या (या यदि आपकी छवि केवल एक परिभाषित करती है ENTRYPOINTऔर नहीं CMD, तो इन विकल्पों में फीड किया जाएगा, /bin/bashजैसा कि आपने यहां निर्दिष्ट किया है। )। इसलिए उदाहरण के लिए किसी भी अन्य docker runविकल्प (जैसे --net "host") से पहले जाने की जरूरत है <imageid>
L0j1k

302

एक चालू कंटेनर में काटने के लिए, इसे टाइप करें:

docker exec -t -i container_name /bin/bash

या

docker exec -ti container_name /bin/bash

या

docker exec -ti container_name sh

यह एक लिनक्स कंटेनर है?
पीटर मोर्टेंसन

5
/ बिन / बैश की आवश्यकता नहीं थी बस बैश ने मेरे लिए यह किया
आनंद वर्कि फिलिप्स

6
मैं के docker exec -itबजाय पसंद करेंगेdocker exec -t -i
VaTo

क्या फर्क है @VaTo
AATHITH RAJENDRAN

@AATHITHRAJENDRANI केवल दो झंडे रखने के बजाय कमांड का एक छोटा रूप पसंद करते हैं, आप उन दो विकल्पों को एक ही तर्क में शामिल कर सकते हैं -it।
VaTo

85

आइए, उन कारणों के लिए कहें जो आपके अपने हैं, आप वास्तव में SSH का उपयोग करना चाहते हैं। यह कुछ कदम लेता है, लेकिन यह किया जा सकता है। यहाँ आदेश हैं कि आप इसे स्थापित करने के लिए कंटेनर के अंदर चलेंगे ...

apt-get update
apt-get install openssh-server

mkdir /var/run/sshd
chmod 0755 /var/run/sshd
/usr/sbin/sshd

useradd --create-home --shell /bin/bash --groups sudo username ## includes 'sudo'
passwd username ## Enter a password

apt-get install x11-apps ## X11 demo applications (optional)
ifconfig | awk '/inet addr/{print substr($2,6)}' ## Display IP address (optional)

अब आप SSH क्लाइंट के लिए X11 अग्रेषण का उपयोग करके ग्राफ़िकल एप्लिकेशन (यदि वे कंटेनर में स्थापित किए गए हैं) भी चला सकते हैं:

ssh -X username@IPADDRESS
xeyes ## run an X11 demo app in the client

यहाँ कुछ संबंधित संसाधन हैं:


33

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

docker-compose execआपकी docker-compose.ymlफ़ाइल के अनुसार सेवा का नाम लेता है ।

तो अपनी 'वेब' सेवा के लिए बैश शेल प्राप्त करने के लिए, आप यह कर सकते हैं:

$ docker-compose exec web bash

docker-compose runयदि आपका कंटेनर अभी तक मौजूद नहीं है, तो भी काम करता है।
पॉल

23

सूचना : यह उत्तर मेरे द्वारा लिखे गए टूल को बढ़ावा देता है।

मैंने एक कंटेनरीकृत SSH सर्वर बनाया है जिसे आप किसी भी चालू कंटेनर में 'स्टिक' कर सकते हैं। इस तरह आप हर कंटेनर के साथ रचनाएँ बना सकते हैं। केवल आवश्यकता यह है कि कंटेनर में बैश है।

निम्न उदाहरण एक कंटेनर से जुड़ा SSH सर्वर शुरू करेगा जिसका नाम 'my-container' होगा।

docker run -d -p 2222:22 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -e CONTAINER=my-container -e AUTH_MECHANISM=noAuth \
  jeroenpeeters/docker-ssh

ssh localhost -p 2222

जब आप इस SSH सेवा (अपनी पसंद के SSH ग्राहक के साथ) से कनेक्ट होते हैं, तो कंटेनर में 'my-container' नाम से एक बैश सत्र शुरू किया जाएगा।

अधिक पॉइंटर्स और डॉक्यूमेंटेशन के लिए देखें: https://github.com/jeroenpeeters/docker-ssh


1
वह बहुत प्यारी है। इस तरह से करने का बड़ा फायदा यह है कि आपको पूरी तरह कार्यात्मक टर्मिनल मिल रहा है। जब मैंने "docker exec" एप्रोच का इस्तेमाल किया, तब मैं टर्मिनल कंटेंट को क्लियर नहीं कर सकता lessथा , हर बार जब मैं इसे चलाता हूं तो एक चेतावनी दिखा रहा था आदि। Jeroen के कंटेनर का उपयोग करना मुझे अब तक का बेहतर अनुभव दे रहा है। बस प्रलेखन की जाँच करना सुनिश्चित करें । प्रतिक्रिया में नमूना आदेश किसी भी अधिक मान्य नहीं लगता है।
राफेल जी।

1
यह एक महान उपकरण है। क्या आप जानते हैं कि मैं इसे जेनकिंस पाइपलाइन डॉकटर एजेंट के रूप में कैसे उपयोग कर सकता हूं? मैं चाहता हूँ कि जेनकींस एससीपी द्वारा कुछ फाइलों को एक दूरस्थ होस्ट को हस्तांतरित करे और एसएसएच के साथ उन्हें निष्पादित करे
गिलसन

21

यदि आप विंडोज पर डॉकर का उपयोग कर रहे हैं और एक कंटेनर में शेल एक्सेस प्राप्त करना चाहते हैं, तो इसका उपयोग करें:

winpty docker exec -it <container_id> sh

सबसे अधिक संभावना है, आपके पास पहले से ही गिट बैश स्थापित है। यदि आप नहीं करते हैं, तो इसे स्थापित करना सुनिश्चित करें।


1
लिनक्स डॉकटर कंटेनर को ग्रहण करता है?
पीटर मोर्टेंसन

1
docker exec -ti <कंटेन_id> cmd अच्छा काम करता है
PBo

17

यदि कंटेनर पहले से ही बाहर निकल गया है (शायद कुछ त्रुटि के कारण), तो आप कर सकते हैं

$ docker run --rm -it --entrypoint /bin/ash image_name

या

$ docker run --rm -it --entrypoint /bin/sh image_name

या

$ docker run --rm -it --entrypoint /bin/bash image_name

एक नया कंटेनर बनाने और उसमें एक शेल प्राप्त करने के लिए। जब से आपने निर्दिष्ट किया --rm, शेल से बाहर निकलने पर कंटेनर हटा दिया जाएगा।


16

कुछ मामलों में आपकी छवि अल्पाइन-आधारित हो सकती है। इस मामले में यह फेंक देगा:

ओसीआई रनटाइम निष्पादन विफल: निष्पादन विफल: कंटेनर_लिनक्स.गो: 348: कंटेनर प्रक्रिया शुरू करने के कारण "निष्पादन: \" बैश \ ": निष्पादन योग्य फ़ाइल $ पथ में नहीं मिली": अज्ञात

क्योंकि /bin/bashमौजूद नहीं है। इसके बजाय आपको इसका उपयोग करना चाहिए:

docker exec -it 9f7d99aa6625 ash

या

docker exec -it 9f7d99aa6625 sh

15

इस आदेश का उपयोग कर डॉक कंटेनर में SSH:

sudo docker exec -i -t (container ID) bash

12

Windows कंटेनर में cmd ​​से कनेक्ट करने के लिए, का उपयोग करें

docker exec -it d8c25fde2769 cmd

जहां d8c25fde2769 कंटेनर आईडी है।


11

यह सरल है !

अपने सभी डॉकर चित्रों को सूचीबद्ध करें:

sudo docker images

मेरे सिस्टम पर इसने निम्न आउटपुट दिखाया:

REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
bash                latest              922b9cc3ea5e        9 hours ago
14.03 MB
ubuntu              latest              7feff7652c69        5 weeks ago         81.15 MB

मेरे पास मेरे पीसी पर दो डॉकर चित्र हैं। मान लीजिए कि मैं पहले भागना चाहता हूं।

sudo docker run -i -t ubuntu:latest /bin/bash

यह आपको कंटेनर का टर्मिनल कंट्रोल देगा। अब आप कंटेनर के अंदर सभी प्रकार के शेल ऑपरेशन कर सकते हैं। जैसे lsफाइल सिस्टम के रूट में सभी फोल्डर आउटपुट करेंगे।

bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

11

फ़ाइलों का निरीक्षण करने के लिए, docker run -it <image> /bin/shएक इंटरैक्टिव टर्मिनल प्राप्त करने के लिए चलाएं । छवियों की सूची द्वारा प्राप्त किया जा सकता है docker imagesdocker execइस समाधान के विपरीत भी काम करता है जब एक छवि शुरू नहीं होती है (या चलने के तुरंत बाद ही समाप्त हो जाती है)।


एक लिनक्स डॉकर छवि मानते हुए?
पीटर मोर्टेंसन

10

गोनाइड समाधान

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

sudo npm install -g goinside

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

goinside docker_container_name

पुराना उत्तर

हमने यह स्निपेट इसमें डाल दिया है ~/.profile:

goinside(){
    docker exec -it $1 bash -c "stty cols $COLUMNS rows $LINES && bash";
}
export -f goinside

इतना ही नहीं हर कोई एक चल कंटेनर के अंदर पाने के लिए सक्षम बनाता है:

goinside containername

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

यदि आप लिंक का पालन करते हैं तो आपके पास अपने डॉकटर कंटेनर नामों के लिए भी कमांड पूरा होगा।


1
धन्यवाद। यह एक आकर्षण की तरह काम करता है, कम से कम उन छवियों के लिए जो पहले से ही बैश हैं। हालांकि अल्पाइन आधारित छवियों के लिए काम नहीं किया जा सकता है, हालांकि, विशेष रूप से श / ऐश के लिए लिखे गए एक अलग फ़ंक्शन के साथ तय किया जा सकता है
गौरव भास्कर

8
$ docker exec -it <Container-Id> /bin/bash

या शेल के आधार पर, यह हो सकता है

$ docker exec -it <Container-Id> /bin/sh

आप आदेश के माध्यम से कंटेनर-आईडी प्राप्त कर सकते हैंdocker ps

-i = संवादात्मक

-t = एक psuedo-TTY आवंटित करने के लिए


8

मैंने कंटेनर के टर्मिनल तक आसान पहुंच के लिए एक टर्मिनल फ़ंक्शन बनाया है। शायद यह आप लोगों के लिए भी उपयोगी है:

इसलिए परिणाम टाइप करने के बजाय है:

docker exec -it [container_id] /bin/bash

आप लिखेंगे:

dbash [container_id]

निम्नलिखित को अपने ~ / .bash_profile (या जो कुछ भी आपके लिए काम करता है) में रखें, फिर एक नई टर्मिनल विंडो खोलें और शॉर्टकट का आनंद लें:

#usage: dbash [container_id]
dbash() {
    docker exec -it "$1" /bin/bash
}

7

आप विकल्प -ti पास करके docker कंटेनर में टर्मिनल के साथ बातचीत कर सकते हैं

docker run --rm -ti <image-name>
eg: docker run --rm -ti ubuntu

टर्मिनल के लिए -t का मतलब इंटरएक्टिव है


6

docker execनिश्चित रूप से एक समाधान होगा। आपके द्वारा पूछे गए प्रश्न के साथ काम करने का एक आसान तरीका है डॉकटर के अंदर निर्देशिका को स्थानीय सिस्टम की निर्देशिका में माउंट करना

ताकि आप स्थानीय पथ के परिवर्तनों को तुरन्त देख सकें।

docker run -v /Users/<path>:/<container path> 

1
आपकी कमांड वास्तव में कंटेनर में होस्ट की डायरेक्टरी को बढ़ा रही है।
दानव

हाँ! किसी अन्य निर्देशिका के लिए बैकअप लें और फिर वॉल्यूम माउंट करें, फिर बैकअप को माउंट किए गए फ़ोल्डर में ले जाएं।
प्रत्यूष

6

उपयोग:

docker attach <container name/id here>

दूसरा तरीका, यद्यपि इसके लिए एक खतरा है, इसका उपयोग करना है attach, लेकिन यदि आप सत्र से बाहर निकलने के लिए Ctrl+ C, तो आप कंटेनर को भी रोक देंगे। यदि आप केवल यह देखना चाहते हैं कि क्या हो रहा है, तो उपयोग करें docker logs -f

:~$ docker attach --help
Usage:  docker attach [OPTIONS] CONTAINER

Attach to a running container

Options:
      --detach-keys string   Override the key sequence for detaching a container
      --help                 Print usage
      --no-stdin             Do not attach STDIN
      --sig-proxy            Proxy all received signals to the process (default true)


4

यदि आपके पास डॉकर स्थापित है Kitematic, तो आप GUI का उपयोग कर सकते हैं। Kitematicडॉकर आइकन से खोलें और Kitematicविंडो में अपने कंटेनर का चयन करें, और फिर execआइकन पर क्लिक करें ।

आप इस GUI में कंटेनर लॉग और बहुत सारी कंटेनर जानकारी (सेटिंग्स टैब में) देख सकते हैं।

मेनू से किटमैटिक का चयन करें

निष्पादन पर क्लिक करें


2

मेरे मामले में, किसी कारण के लिए मुझे प्रत्येक कंटेनर में सभी नेटवर्क से जुड़ी जानकारी की जांच करने की आवश्यकता है। तो निम्नलिखित आदेश एक कंटेनर में मान्य होने चाहिए ...

ip
route
netstat
ps
...

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

मान लीजिए कि आपके पास प्रकाश-परीक्षण नाम का एक चालू कंटेनर है। नीचे दिए गए चरणों का पालन करें।

  • docker inspect light-test -f {{.NetworkSettings.SandboxKey}}। इस कमांड को जैसे रिप्लाई मिलेगा /var/run/docker/netns/xxxx
  • तब ln -s /var/run/docker/netns/xxxx /var/run/netns/xxxx। निर्देशिका मौजूद नहीं हो सकती है, mkdir /var/run/netnsपहले करें।
  • अब आप ip netns exec xxxx ip addr showकंटेनर में नेटवर्क की दुनिया का पता लगाने के लिए निष्पादित कर सकते हैं ।

पुनश्च। xxxxहमेशा पहले कमांड से प्राप्त समान मान होता है। और हां, कोई भी अन्य आदेश मान्य हैं, अर्थात ip netns exec xxxx netstat -antp|grep 8080


1

एक अन्य विकल्प nsenter का उपयोग करना है

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

2
के साथ कई समस्याएं हैं nsenter। पहला यह है कि आपको डॉकटर होस्ट तक शारीरिक पहुंच की आवश्यकता होती है, जो कि एक दिया नहीं है (आप दूरस्थ डॉकटर एपीआई के साथ काम कर सकते हैं)। इसके अलावा, nsenterआपको सुरक्षा और संसाधन प्रतिबंधों में से कई से छूट मिलती है , जो डॉकर आपके स्थान पर निर्भर करता है (जो एक समर्थक या एक कोन हो सकता है)।
लार्क्स

1
यहां तक ​​कि nsenter के लेखक भी इन दिनों का उपयोग करने के लिए कहते हैंdocker exec
L0j1k

1
@ लार्क्स हाँ, दोनों के अपने फायदे हैं। उदाहरण के लिए, यह एक ओवरसेंटर का लाभ है docker execdocker execमुझे और अधिक सुंदर लगता है।
xuhdev 19

2
@ L0j1k बस कम भ्रमित होने के लिए: आपके द्वारा संदर्भित पोस्ट nsenter के लेखक द्वारा नहीं है, लेकिन Docker छवि का लेखक जो nsenter चलाता है।
xuhdev

1

अगर आप Docker Compose का उपयोग कर रहे हैं तो यह आपको Docker कंटेनर के अंदर ले जाएगा।

docker-compose run container_name /bin/bash

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

WORKDIR directory_path # E.g  /usr/src -> container's path

0

testनीचे चल रहे एक कंटेनर में निष्पादित करने के लिए , नीचे दिए गए आदेश हैं

यदि कंटेनर में bashशेल है

docker exec -it test /bin/bash

यदि कंटेनर में bourneशेल है और अधिकांश मामले मौजूद हैं

docker run -it test /bin/sh

-3

डॉकटर-कंपोज़ के लिए (डॉकर 4 डुपर्ल)

docker-compose exec php bash

मैं एक लिनक्स लैपटॉप पर ड्रूपल के लिए डॉकर का उपयोग करता हूं । कंटेनर चलाने के बाद मैं कंटेनर docker-compose exec php bashसे जुड़ने के लिए ' ' का उपयोग करता हूं ताकि मैं ड्रश कमांडो चला सकूं। यह मेरे लिए ठीक काम करता है।

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