Arka plan modunda çalışan bir kapsayıcıya bash veya ssh nasıl alınır?

Çalışan bir docker konteynerine ssh veya bash yapmak istiyorum. Lütfen örneğe bakın:

$ 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 

Şimdi böyle bir şey almak istiyorum (çalışan konteynere git):

$ sudo docker run -t -i webserver (ya da belki 665b4a1e17b6 yerine)
$ root@665b4a1e17b6:/#

Ancak yukarıdaki satırı çalıştırdığımda yeni KONTEYNER kimliği alıyorum:

$ root@42f1e37bd0e5:/#

Vagrant kullandım ve benzer bir davranış elde etmek istiyorum vagrant ssh.

Cevap Docker'ın attach komut. Yani yukarıdaki örneğim için çözüm şöyle olacaktır::

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

Docker sürüm 1.3 veya üstü için: Kullanıcıya teşekkürler WiR3D bir konteynerin kabuğunu almak için başka bir yol önerdi. Eğer kullanırsak attach kabuğun yalnızca bir örneğini kullanabiliriz. Dolayısıyla, bir konteynerin kabuğunun yeni bir örneğiyle yeni bir terminal açmak istiyorsak, aşağıdakileri çalıştırmamız yeterlidir:

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

veya

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

Docker 1.3'ten itibaren:

docker exec -it <containerIdOrName> bash

Temel olarak, Docker konteyneri kullanılarak başlatılmışsa /bin/bash komutu kullanarak erişebilirsiniz attach. Değilse, kapsayıcı içinde bir Bash örneği oluşturmak için komutu çalıştırmanız gerekir exec.

Ayrıca, Bash'i haydut bir süreçte çalıştırmadan Bash'den çıkmak için:

exit

Bu kadar basit, Evet, sensin.

Sorunun yazarı özellikle çalışan bir kapsayıcıyla ilgilendiklerini söylese de, kapsayıcı çalışmıyorsa, ancak etrafta dolaşmak için çalıştırmak istiyorsanız, çalıştırabileceğinizi de belirtmek gerekir:

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

Bunu dene:

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

Kaynak: https://docs.docker.com/engine/reference/commandline/run/

@Timur'un cevabına dayanarak aşağıdakileri oluşturdum kullanışlı komut dosyası

Kurulum

Koymak docker-ssh dosyanızda $PATH aşağıdaki içeriklerle

#!/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

Not: Bazı kapsayıcılar içermiyor bash, ama ash, sh vb. Bu durumlarda bash yukarıdaki senaryoda değiştirilecektir.

Kullanma

Yalnızca bir çalışan örneğiniz varsa, çalıştırmanız yeterlidir

$> docker-ssh 

Aksi takdirde, aldığınız docker ıd parametresini sağlayın docker ps (ilk col)

$> docker-ssh 50m3r4nd0m1d

Konteynerinizde bash yüklü değilse, sh'yi deneyebilirsiniz:

docker exec -it CONTAINER /bin/sh

Veya önce / bidondaki kabukları arayın:

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

Çalışan herhangi bir konteynere SSH yetenekleri sağlayan konteynerli bir SSH sunucusu oluşturdum. Konteynerini değiştirmene gerek yok. Tek şart, kabın bash'a sahip olmasıdır.

'Web-server1' adlı bir kapsayıcınız varsa. Aşağıdaki docker run komutu, ilk kapsayıcı için SSH sağlayacak ikinci bir kapsayıcıyı başlatır.

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

Daha fazla işaretçi için ödeme yapın https://github.com/jeroenpeeters/docker-ssh

@jpetazzo'nun bir bu konuyla ilgili harika yazı. Kısa cevap kullanmak olacaktır nsenter:

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

P.S.: Yazının yorumlarındaki tartışmayı kontrol etmeyi unutmayın...

Şerefe

Ayrıca Docker kapsayıcısına Pipework ile yönlendirilebilir bir IP adresi verebilir ve bundan sonra bu yeni IP adresiyle makineye SSH verebilirsiniz.

Bu, uygulamaya özel bir komut kullanmak yerine daha "geleneksel" (ssh) olacaktır docker attach ve sonunda sistemler ve sürümler arasında daha 'taşınabilir' hale getirecek.

Bazen, özellikle geliştirme sırasında bir Docker kapsayıcısına ssh yapabilmek kullanışlı olacaktır. Aşağıdaki Docker görüntüsü, özel bir anahtar kullanarak bir konteynere ssh yapılmasına izin verir:

UbuntuWithSSH-Liman İşçisi

Docker Dosyasının özü şöyledir https://gist.github.com/devbkhadka/98792f7bca57f9778793b2db758b3d07.

Çalışan konteynere basmak için SSH kullanmanın kötü bir uygulama olduğunu unutmayın – bkz. [burada gerekçe](If you run SSHD in your Docker containers, you're doing it wrong! /). ‘sudo docker exec -i -t container-name /bin /bash’ gitmek için bir yoldur.

alternatif olarak, apt programlarını ve paketlerini yükleyebilmek için sudo docker exec -i -t 665b4a1e17b6 / bin / sh