سؤال كيفية الحصول على bash أو ssh في حاوية قيد التشغيل في وضع الخلفية؟


أريد أن أشتري ssh أو bash في حاوية عامل ميناء قيد التشغيل. من فضلك ، انظر المثال:

$ 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 وأود أن تحصل على سلوك مماثل vagrant ssh.


797
2017-08-01 16:19


الأصل


بدلا من ذلك sudo docker exec -i -t 665b4a1e17b6 /bin/sh لتتمكن من تثبيت البرامج والحزم apt - fonjeekay


الأجوبة:


الجواب هو دوكر attach أمر. لذلك بالنسبة إلى المثال أعلاه ، سيكون الحل:

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

بالنسبة إلى Docker الإصدار 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:/#

1181
2017-08-05 06:01



بدلا من ذلك ، تنفيذ sudo docker attach loving_heisenberg - thiagowfx
لا يعمل الأمر attach بالنسبة لي ، فإنه يتسبب في تجميد عامل الميناء .. أي أفكار لماذا يحدث؟ - Mo J. Mughrabi
تذكير لمستخدمي boot2docker: إزالة sudo :) - Henno
-i -t يساوي -it - pasha.zhukov
هذا هو جواب خطير ليتم اختياره والتصويت للغاية. docker attaching إلى مثيل MongoDB ، على سبيل المثال ، سيقتل المثيل. كما هو موضح بمزيد من التفصيل في هذا السؤال  attach و exec حيوانات مختلفة. - fwc


من Docker 1.3 فصاعدًا:

docker exec -it <containerIdOrName> bash

في الأساس ، إذا تم تشغيل حاوية Docker باستخدام /bin/bash الأمر الذي يمكنك الوصول إليه باستخدامه attach. إذا لم يكن الأمر كذلك ، فأنت بحاجة إلى تنفيذ الأمر لإنشاء نسخة باش داخل الحاوية باستخدام exec.

أيضًا للخروج من Bash دون مغادرة Bash في عملية خادعة:

exit

نعم ، الأمر بهذه البساطة.


586
2017-10-29 07:46



لا يزال لم أفهم كيفية الحصول على نانو للعمل. أعتقد أن ذلك قد ينطوي على docker-ssh من phusion - WiR3D
هل هناك أي طريقة لتعيين Bash افتراضيًا في عمال الشحن؟ - ipeacocks
@ الطباخات نعم ، إذا كان RUN الأمر في dockerfile هو /bin/bash. لكن يعتمد على ما تعنيه إذا كنت ترغب في تشغيل الحاوية ولديك باش متوفرة على الفور في نفس المحطة الطرفية ثم تعمل مع -it يجب القيام به - WiR3D
استخدام مجموعة عامل الميناء هو ممارسة سيئة. أي مستخدم في مجموعة عامل ميناء يستخدم أساسا مع أذونات الجذر دون الحاجة إلى استخدام sudo. projectatomic.io/blog/2015/08/... - Maiku Mori
أعتقد أنه لا يوجد فرق كبير ، من وجهة نظر الأمن المضيفة ، سواء كنت تستخدم sudo ضد docker مجموعة. في كلتا الحالتين ، هناك ثقب أمان مدمج في عامل ميناء والذي يمكنه توفير امتيازات كاملة في نظام الملفات المضيفة من الضيف - بغض النظر عما إذا كنت تستخدم مجموعة عمال الشحن أو sudo لإطلاق الحاوية. - nobar


على الرغم من أن مؤلف السؤال أشار تحديدًا إلى أنه مهتم بحاوية قيد التشغيل ، إلا أنه من الجدير بالذكر أيضًا أنه في حالة عدم تشغيل الحاوية ، ولكنك ترغب في تشغيلها لكشفها ، يمكنك تشغيل:

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


101
2017-11-07 18:46



وهذا يعطي حاوية مختلفة ، تمامًا مثل إجابة @ kraxor. - Blaisorblade


جرب هذا:

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

مصدر: https://docs.docker.com/articles/basics/#running-an-interactive-shell


24
2017-08-01 16:29



انها ليست مناسبة ، لأنني أحصل على هوية CONTAINER مختلفة (root@42f1e37bd0e5:/# و لا root@665b4a1e17b6:/#) - Timur Fayzrakhmanov
الرابط ميت ، يجب عليك تحديث - Ahmet Karakaya


استنادًا إلى إجابة @ Timur ، لقد أنشأت ما يلي نص مفيد

اقامة

ضع 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 

خلاف ذلك توفره مع parmeter معرف عامل ميناء الذي تحصل عليه من docker ps (اول كول)

$> docker-ssh 50m3r4nd0m1d

13
2018-04-20 11:39



هل لي أن أعرف لماذا نحتاج -l في النهاية؟ - Nam G VU
لبدء bash كعلبة تسجيل دخول ، وقراءة معلمات البيئة (الموضحة في السطر أعلى الأمر) - Matyas


لقد قمت بإنشاء خادم SSH حاوي يوفر قدرات SSH لأي حاوية قيد التشغيل. لست بحاجة إلى تغيير الحاوية. الشرط الوحيد هو أن الحاوية لديها باش.

إذا كان لديك حاوية باسم "web-server1". تشغيل الأمر التالي docker سيبدأ حاوية ثانية من شأنها أن توفر 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


8
2017-10-03 16:20



يجب أن تكون هذه الإجابة المقبولة ^ - Nam G VU
بالمناسبة ، كيف يمكن أن يكون لدينا .bashrc تحميل تلقائي عند بدء جلسة ssh باستخدام الحل الخاص بك؟ نشرت أيضا قضية على جيثب github.com/jeroenpeeters/docker-ssh/issues/30 - Nam G VU


jpetazzo لديه نشر رائع حول هذا الموضوع. سيكون الجواب القصير للاستخدام nsenter:

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

ملاحظة: لا تنسَ التحقق من المناقشة في تعليقات المشاركة ...

في صحتك


5
2018-03-14 10:12



هذا هو وظيفة قديمة إلى حد ما ذلك لم يعد ضروريا حقا. @ WiR3D ل docker exec الحل هو أكثر ملاءمة. - drevicko


إذا لم يكن لديك حاوية مثبتة على الباش (على سبيل المثال ، القنصل) ، يمكنك تجربة sh:

docker exec -it CONTAINER /bin/sh

أو ابحث عن الأصداف في / bin أولاً:

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

3
2017-07-29 13:40



ما هو "القنصل"؟ هل لديك مرجع لذلك؟ هل تعني "وحدة التحكم"؟ - Peter Mortensen


يمكنك أيضًا إعطاء حاوية Docker عنوان IP قابل للتوجيه مع Pipework ، وبعد ذلك SSH في الجهاز باستخدام عنوان IP الجديد هذا.

سيكون هذا "تقليديًا" أكثر (ssh) ، بدلاً من استخدام أمر خاص بالتطبيق مثل docker attachوسيجعلها في النهاية "محمولة" عبر الأنظمة والإصدارات.


3
2017-10-29 11:58



من فضلك ، إضافة طريقة simples كيف نفعل ذلك. إذا أردت أن أكون صادقاً ، فأنا في حاجة فعلاً لذلك ، لكن ليس لدي وقت للبحث في أبسط الحلول لذلك. هل يمكنك نشر إجابتك هنا؟ سيكون أمرا رائعا.. - Timur Fayzrakhmanov
هناك طريقتان لتحقيق ذلك ، ولكنها ليست بسيطة ، وستصبح مشاركة كبيرة. هل يمكن أن تحقق من هذا حلقة الوصل بنفسك ، لاستخدام الأنابيب أو هذا حلقة الوصل، والسحر ينجزان نفس الشيء مثل Pipework ، وهو أكثر بساطة قليلاً ، ولكن عليك القيام به يدوياً. لذلك يعتمد على عدد الخوادم التي يتحدث فيها. إذا لم تستطع معرفة شيء أكثر تحديدًا ، فأخبرني. ولكن ليس لدي الوقت الكافي لكتابة برنامج تعليمي كامل. - radriaanse
أنت على حق - لا توجد طريقة واضحة وبسيطة للقيام بذلك (شكرا على الروابط ، وأعتقد أنني سوف أعيد النظر في وقت لاحق. - Timur Fayzrakhmanov


docker run -it openjdk:8

هذا يعمل :-)


2
2017-09-06 15:11