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


933

Ç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 böyle bir şey almak istiyorum (koşu kabına git):

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


alternatif sudo docker exec -i -t 665b4a1e17b6 /bin/shprogramlar ve paketler kurabilmek için alternatif olarak
fonjeekay

1
SSH'yi çalışan konteynere bashlamak için kullanımın kötü bir uygulama olduğunu unutmayın - buradaki mantığı inceleyin . sudo docker exec -i -t container-name /bin/bashgitmenin bir yolu.
patryk.beza

Yanıtlar:


1307

Cevap Docker'ın attachemridir. 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
$ root@665b4a1e17b6:/#

Docker sürüm 1.3 veya üstü için: Bir kapsayıcının kabuğunu almanın başka bir yolunu öneren , kullanıcı WiR3D sayesinde . Eğer kullanırsak attach, kabuğun 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
$ root@665b4a1e17b6:/#

5
Alternatif olarak, yürütmeksudo docker attach loving_heisenberg
Thiago Perrotta

51
attach komutu benim için çalışmıyor, docker'ın donmasına neden oluyor .. bunun neden olduğu hakkında bir fikriniz var mı?
Mo J. Mughrabi 21:14

10
Boot2docker kullanıcıları için bir hatırlatma: sudo :) kaldır
Henno

17
-i -teşittir-it
pasha.zhukov 12:16

47
Bu, seçilmek ve çok oy kullanmak için tehlikeli bir cevap. docker attachÖrneğin, bir MongoDB örneğine girmek, örneği öldürecektir. Bu soruda daha ayrıntılı olarak açıklandığı attachve execfarklı hayvanlardır.
fwc

675

Docker 1.3'ten itibaren:

docker exec -it <containerIdOrName> bash

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

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

exit

Evet, bu kadar basit.


Hala nano'yu nasıl çalıştıracağımı çözemedi. Bu
füzyondan

Dockerlarda bash ayarını varsayılan olarak yapmanın bir yolu var mı?
ipeacocks

Dockfile içindeki RUNkomut ise @ ipeacocks evet /bin/bash. Ama ne demek istediğine bağlı. Konteyneri çalıştırmak ve aynı terminalde derhal kullanılabilir duruma getirmek istiyorsanız, o zaman çalıştırmanız -itgerekenler
WiR3D

10
Liman işçisi grubunu kullanmak kötü bir uygulamadır. Liman grubundaki herhangi bir kullanıcı, esas olarak sudo kullanmaya gerek olmadan kök izinleriyle kullanılır. projectatomic.io/blog/2015/08/…
Maiku Mori

1
sudoVs dockergrup kullanıp kullanmadığınızı ana bilgisayar güvenlik açısından farketmez . Her iki durumda da, docker grubunu kullanıp kullanmadığınıza veya sudokonteyneri başlatmanıza bakmaksızın, ana bilgisayar dosya sisteminde konuktan tam ayrıcalıklar sağlayabilen docker'da yerleşik bir güvenlik deliği vardır .
nobar

123

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

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


10
Bu, @ kraxor'un cevabı gibi, farklı bir kap verir.
Blaisorblade 17:15


19

@ Timur'ın cevabına dayanarak Aşağıdaki kullanışlı betiği oluşturdum

Kurmak

Put docker-sshSepetinde dosyayı $PATHaşağıdaki içerikle

#!/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ı konteyner içermeyen bashancak ash, shbu durumda vs. bashyukarıdaki komut değiştirilir.

kullanım

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

$> docker-ssh 

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

$> docker-ssh 50m3r4nd0m1d

Sonunda neden ihtiyacımız olduğunu bilebilir miyim?
Nam G VU

bash'ı bir giriş kabuğu olarak başlatmak için, ortam parametrelerini okumak (komutun yukarısındaki satırda açıklanmıştır)
Matyas

13

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/

Nedir "konsolos" ? Bunun için bir referansınız var mı? "Konsol" mu demek istiyorsun ?
Peter Mortensen,

9

Ç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 ikinci bir kabı başlatacaktı.

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


Bu kabul edilen cevap olmalı ^
Nam G VU

Bu arada, çözümünüzü kullanarak bir ssh oturumu başlatırken .bashrc otomatik yüklemesini nasıl yapabiliriz? Ayrıca github github.com/jeroenpeeters/docker-ssh/issues/30
Nam G VU


4

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

Bu, uygulamaya özel bir komut kullanmak yerine, daha "geleneksel" (ssh) docker attacholacaktır ve nihayetinde sistemler ve sürümlerde daha 'taşınabilir' olacaktır.


Lütfen, nasıl yapılacağına basit bir yol ekleyin. Dürüst olmak gerekirse, buna gerçekten ihtiyacım var, ancak bunun için en basit çözümü aramaya vaktim yok. Cevabınızı buraya gönderebilir misiniz? Harika olurdu ..
Timur Fayzrakhmanov

2
Bunu başarmanın 2 yolu var, fakat bu basit değil ve büyük bir görev haline geldi. Boru hattını veya bu bağlantıyı kullanmak için bu bağlantıyı kendi başınıza kontrol edebilirsiniz , cadı Pipework ile aynı şekilde çalışır ve biraz daha basittir, ancak bunu manuel olarak yapmanız gerekir. Bu yüzden konuşurken kaç sunucuya bağlı. Daha özel bir şey bulamıyorsan bana haber ver. Ancak tam bir rehber yazmak için de zamanım yok.
radriaanse

Haklısın - bunu yapmanın açık ve basit bir yolu yok (Bağlantılar için teşekkürler, daha sonra tekrar ziyaret edeceğimi düşünüyorum.
Timur Fayzrakhmanov



1

İÇERİ GİR

goinsidekomut satırı aracını aşağıdakilerle 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 bu out.


0

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

docker exec -t -i container_name /bin/bash

1
Bu olsa da @AdamKalnas aynı cevap
Bruni

0

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

docker start {id}
docker attach {id}

-1

kap, örneğin sadece veri içeren bir kap gibi durdurulursa, iyi bir çözüm, veri taşıyıcısına her eklemek istediğinizde atılabilir bir kap çalıştırmaktır. Bu durumda, veri kabının kendisi tamamen boş olabilir, çünkü geçici kabın işletim sistemi araçları olacaktır.

$ docker run --rm --volumes-from mydata -it ubuntu bash
root@645045d3cc87:/# ls /mydata
root@645045d3cc87:/# touch /mydata/foo
root@645045d3cc87:/# exit
exit
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.