چگونه حالت bash یا ssh را به یک ظرف در حال اجرا در حالت پس زمینه تبدیل کنیم؟


به جواب پذیرفته شده بروید




من می خواهم به یک ظرف docker در حال اجرا 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)
$ [email protected]:/# 
However when I run the line above I get new CONTAINER ID
$ [email protected]:/#
 

من از Vagrant استفاده کردم و می خواهم رفتاری مشابه داشته باشم vagrant ssh .


941









15 :تعداد پاسخها


پاسخ attach دستور داکر است . بنابراین برای مثال من در بالا ، راه حل خواهد بود:

 $ sudo docker attach 665b4a1e17b6 #by ID
or
$ sudo docker attach loving_heisenberg #by Name
$ [email protected]:/#
 

برای نسخه 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
$ [email protected]:/#
 

1318



از داکر 1.3 به بعد:

 docker exec -it <containerIdOrName> bash
 

اصولاً اگر ظرف Docker با استفاده از /bin/bash دستور شروع شد می توانید با استفاده از آن دسترسی پیدا کنید attach . اگر اینطور نیست ، پس شما باید دستورالعمل را اجرا کنید تا با استفاده از یک نمونه Bash در داخل ظرف ایجاد کنید exec .

همچنین برای خروج از Bash بدون ترک کردن Bash در یک روند سرکش:

 exit
 

بله ، بسیار ساده است.


683



اگرچه نویسنده این سؤال به طور خاص گفته است که آنها به یک ظرف در حال اجرا علاقه مند هستند ، همچنین شایان ذکر است که اگر کانتینر در حال کار نباشد ، اما دوست دارید آن را اجرا کنید تا به اطراف خود بزنید می توانید اجرا کنید:

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


125



این را امتحان کن:

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

منبع: https://docs.docker.com/articles/basics/#running-an-interactive-shell


27



براساس پاسخ @ تیمور ، فیلمنامه مفید زیر را ایجاد کردمhttps://gist.github.com/albertmatyi/9438d9ea9ae2d287e75181e81f2204fa

برپایی

قرار دادن 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 
 

در غیر این صورت ، آن را با یک پارامتر id docker که از آن دریافت می کنید docker ps (اولین col)

 $> docker-ssh 50m3r4nd0m1d
 

19



اگر ظرف شما نصب نشده است می توانید sh را امتحان کنید:

 docker exec -it CONTAINER /bin/sh
 

یا ابتدا به دنبال پوسته های داخل / سطل باشید:

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

14



من یک سرور 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


9



jpetazzo درباره این موضوع یک پست جالب دارد . پاسخ کوتاه این است که استفاده کنید nsenter :

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

PS: فراموش نکنید که بحث را در نظرات پست بررسی کنید ...

به سلامتی


6



همچنین می توانید به کانتر Docker آدرس IP قابل مسیریابی را با Pipework بدهید و پس از آن SSH را با آن آدرس IP جدید وارد دستگاه کنید.

این به جای استفاده از یک دستور برنامه خاص مانند docker attach ، "سنتی" (ssh) خواهد بود و در نهایت آن را "قابل حمل" در بین سیستم ها و نسخه ها تبدیل می کند.


4



گاهی اوقات این امکان وجود دارد که بتوانیم به خصوص در حین توسعه ، درون یک ظرف داکر قرار بگیریم. تصویر Docker زیر اجازه می دهد تا با استفاده از یک کلید خصوصی ، درون یک ظرف محصور شوید:

UbuntuWithSSH-Docker

مضمون داکررفیل https://gist.github.com/devbkhadka/98792f7bca57f9778793b2db758b3d07 است .


3



 docker run -it openjdk:8
 

این کارها :-)


2



برو تو

نصب goinside فرمان ابزار خط با:

 sudo npm install -g goinside
 

و داخل یک ظرف docker با اندازه ترمینال مناسب با:

 goinside docker_container_name
 

برای جزئیات بیشتر این است.


1



برای وارد کردن یک ظرف در حال اجرا ، این را تایپ کنید:

 docker exec -t -i container_name /bin/bash
 

0



صرفا جهت اطلاع. اگر نیاز دارید که در یک ظرف ساده وارد شوید و آن را به عنوان یک Daemon وارد نکنید ، باید از دستورات زیر استفاده کنید:

 docker start {id}
docker attach {id}
 

0


2015-11-04

اگر ظروف مانند به عنوان مثال یک ظرف فقط داده متوقف شود ، یک راه حل خوب این است که هر بار که می خواهید به ظرف داده متصل شوید ، یک ظرف پرتاب را اجرا کنید. در این حالت ، ظرف داده می تواند کاملاً خالی باشد ، زیرا ظرف موقت ابزارهای سیستم عامل دارد.

 $ docker run --rm --volumes-from mydata -it ubuntu bash
[email protected]:/# ls /mydata
[email protected]:/# touch /mydata/foo
[email protected]:/# exit
exit
 

-1



انتشارات مرتبط


چگونه برای جلوگیری از فرار $ در حین تکمیل برگه ، bash بگیریم؟

چگونه می توان از 2 یا 3 خط ، یک متن را که متن مورد نظر من است ، و برخی دیگر دقیقاً در زیر آن ، گنجانید؟

چگونه می توان anacron را در حالت کاربر اجرا کرد؟

چگونه می توان مجوزهای chmod (octal) پوشه در ترمینال را دریافت کرد؟

چگونه سرعت بارگذاری و بارگیری فعلی را در ترمینال دریافت کنیم؟

چگونه می توان هنگام ورود به سیستم از طریق SSH ، از مشاغل upstart دریافت کرد؟

چگونه تاریخچه اتصال به اشتراک سرور یا شبکه را در اوبونتو 13.04 پاک کنیم؟

چگونه می توان در سرور X جداگانه در اوبونتو 11.04 یا بعد از آن صدا گرفت؟

چگونه حالت فشرده Nautilus "واقعی" را در اوبونتو 13.04 دریافت کنیم؟

چگونه می توان پرونده bash را تغییر داد تا بر اساس ورودی کاربر متفاوت باشد؟

[bash] سوال برچسب


چگونه می توانم تاربل را که از .xz استفاده می کند فشرده کنم؟

چگونه می توانم محدوده صفحه / بخشی از PDF را استخراج کنم؟

چگونه OpenJDK 8 را روی 14.04 LTS نصب کنیم؟

فیلم فلش به رنگ آبی ظاهر می شود

چگونه می توان طرح سیستم فایل اوبونتو را درک کرد؟

چگونه می توان روشنایی LCD را از خط فرمان (یا از طریق اسکریپت) تغییر داد؟

آسیب پذیری bash CVE-2014-6271 چیست (Shellshock) و چگونه می توانم آن را برطرف کنم؟

چرا "کشتن <PID>" واقعاً روند این کار را نمی کشد ، چرا؟

آپدیت دریافت فقط برای یک مخزن خاص

آیا یک طراح GUI برای پایتون وجود دارد؟