web-gelistirme-sc.com

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

Çalışan bir liman işçisi konteynerine ssh veya bash yapmak istiyorum. Lütfen örneğe bakınız:

$ 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 

şimdi şöyle bir şey almak istiyorum (koşu kabına git):

$ 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'ı kullandım ve vagrant ssh ile benzer bir davranış elde etmek istiyorum.

926

Cevap Docker'ın attach komutudur. Yani yukarıdaki örneğime göre çözüm şöyle olacak:

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

Docker sürüm 1.3 veya sonraki sürümleri için: Bir kabın kabuğunu elde etmek için başka bir yol öneren kullanıcı WiR3D sayesinde. attach kullanırsak, Shell'in sadece bir örneğini kullanabiliriz. Dolayısıyla, yeni bir konteyner kabuğunun ö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
$ [email protected]:/#
1300

Docker 1.3'ten itibaren:

docker exec -it <containerIdOrName> bash

Temel olarak, Docker kabı /bin/bash komutunu kullanarak başlatıldıysa, attach kullanarak erişebilirsiniz. Eğer değilse, o zaman exec kullanarak kabın içinde bir Bash örneği oluşturmak için komutu çalıştırmanız gerekir.

Ayrıca, Bash'i hileli bir işlemde çalıştırmadan bırakmadan çıkmak için:

exit

Evet, bu kadar basit.

670
WiR3D

Sorunun yazarı özellikle çalışan bir konteynere ilgi duyduklarını söylese de, konteynır çalışmıyorsa, ancak koşturarak çalıştırmak isteyip istemediğinizi de belirtebilirsiniz.

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

121
Adam Kalnas

Bunu dene:

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

Kaynak: https://docs.docker.com/articles/basics/#running-an-interactive-Shell

27
kraxor

@ Timur'un cevabına dayanarak Aşağıdakileri yarattım handy script

Kurmak

docker-ssh dosyasını aşağıdaki içeriğe sahip $PATH içine

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

Not : Bazı kaplar bash içermez, ancak ash, sh vb. İçerir. Bu durumlarda bash yukarıdaki betiğin içinde değiştirilecektir.

Kullanım

Yalnızca bir çalışan örneğiniz varsa, çalıştırın

$> docker-ssh 

Aksi takdirde, docker ps (ilk sütun) dan aldığınız bir docker kimliği parametresi sağlayın

$> docker-ssh 50m3r4nd0m1d
18
Matyas

Konteynerinizde bash kurulu değilse, sh'ı deneyebilirsiniz:

docker exec -it CONTAINER /bin/sh

Veya önce/bin içindeki kabukları arayın:

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

Çalışan herhangi bir kabın SSH özelliklerini sağlayan kapsayılmış bir SSH sunucusu oluşturdum. Kabı değiştirmene gerek yok. Tek gereksinim, kabın bash olmasıdır.

'Web-server1' adında bir kabınız varsa. Aşağıdaki liman işçisi çalıştır komutu, ilk konteyner için SSH sağlayacak bir ikinci konteyner 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 https://github.com/jeroenpeeters/docker-ssh

9
Jeroen Peeters

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

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

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

Şerefe

6
Richard

Ayrıca Docker konteynerine Pipework ile rutin bir IP adresi ve bundan sonra da bu yeni IP adresiyle makineye SSH verebilirsiniz.

Bu, docker attach gibi bir uygulamaya özel komut kullanmak yerine, daha "geleneksel" (ssh) olacak ve sonunda onu sistemler ve sürümlerde daha 'taşınabilir' hale getirecektir.

4
radriaanse

Bazen, özellikle geliştirme sırasında bir Docker konteynerine ssh yapabilmek kullanışlı olabilir. Aşağıdaki Docker resmi, özel bir anahtar kullanarak bir kaba girmesine izin verir:

buntuWithSSH-Docker

Docker dosyasının özü https://Gist.github.com/devbkhadka/98792f7bca57f9778793b2db758b3d07 şeklindedir.

3
Dev Khadka
docker run -it openjdk:8

Bu çalışıyor :-)

2
Kishan B

İÇERİ GİR

goinside komut satırı aracını şununla yükleyin:

Sudo npm install -g goinside

ve uygun terminal boyutuna sahip bir docker konteynerin içine gidin:

goinside docker_container_name

daha fazla ayrıntı için kontrol this out.

1
Soorena

Sadece bilgi için. Daemon olmayan basit bir kapta giriş yapmanız gerekiyorsa, aşağıdaki komutları kullanmanız gerekir:

docker start {id}
docker attach {id}
0
Nek

Çalışan bir kaba bash etmek için şunu yazın:

docker exec -t -i container_name /bin/bash
0
Agustí Sánchez