Ç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.
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]:/#
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.
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>
Bunu dene:
Sudo docker run -i -t webserver /bin/bash
Kaynak: https://docs.docker.com/articles/basics/#running-an-interactive-Shell
@ Timur'un cevabına dayanarak Aşağıdakileri yarattım handy script
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.
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
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/
Ç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
@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
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.
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:
Docker dosyasının özü https://Gist.github.com/devbkhadka/98792f7bca57f9778793b2db758b3d07 şeklindedir.
docker run -it openjdk:8
Bu çalışıyor :-)
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.
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}
Çalışan bir kaba bash etmek için şunu yazın:
docker exec -t -i container_name /bin/bash