Docker kabının kabuğuna nasıl girebilirim?


1162

Docker ile çalışmaya başlıyorum. WordPress temel görüntü ve docker-compose kullanıyorum.

İlk oluşturma sırasında oluşturulan dosyaları / dizinleri incelemek için kapsayıcılardan birine ssh deniyorum. Koşmaya çalıştım docker-compose run containername ls -la, ama hiçbir şey yapmadı. Olsa bile, tek bir komut çalıştırmak yerine dizin yapısını geçebileceğim bir konsola sahip olmayı tercih ederim. Docker ile bunu yapmanın doğru yolu nedir?


Yani cevap docker eklemek gibi geliyor. Ama docker-compose'den buna nasıl ulaşabilirim?
Andrew

3
docker exec Askubuntu.com/a/543057/35816 adresini kullanın . Kapsayıcı kimliğini kullanarak edinindocker ps
Mauricio Scheffer

26
sudo docker run -it --entrypoint /bin/bash <container_name>etkileşimli olarak konteyner içine alır. Sonra konteyner kullanarak dosya sistemi inceleyebilirsinizcd <path>
Sergei

Yanıtlar:


1732

docker attachDocker konteynerinize bağlanmanıza izin verir, ancak bu gerçekten aynı şey değildir ssh. Konteynırınız bir web sunucusu çalışıyorsa, örneğin, docker attachmuhtemelen size bağlayacak Stdout'a web sunucusu işleminin. Mutlaka size bir kabuk vermeyecektir.

docker execKomut Aradığınız muhtemelen ne; bu, varolan bir kapsayıcı içinde rasgele komutlar çalıştırmanıza izin verir. Örneğin:

docker exec -it <mycontainer> bash

Elbette, çalıştırdığınız komut ne olursa olsun, konteyner dosya sisteminde bulunmalıdır.

Yukarıdaki komutta <mycontainer>, hedef kapsayıcının adı veya kimliği bulunur. Kullanıp kullanmamanız önemli değildir docker compose; çalıştırın docker psve ya ID (ilk sütunda görüntülenen onaltılık bir dize) ya da adı (son sütunda görüntülenen) kullanın. Örneğin, verilenler:

$ docker ps
d2d4a89aaee9        larsks/mini-httpd   "mini_httpd -d /cont   7 days ago          Up 7 days                               web                 

Koşabilirim:

$ docker exec -it web ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
18: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.3/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe11:3/64 scope link 
       valid_lft forever preferred_lft forever

Aynı şeyi çalıştırarak da başarabilirim:

$ docker exec -it d2d4a89aaee9 ip addr

Benzer şekilde, kapta bir kabuk başlatabilirim;

$ docker exec -it web sh
/ # echo This is inside the container.
This is inside the container.
/ # exit
$

76
Ayrıca, docker execsadece akan konteynerlerde çalışır (aksi takdirde kullanım docker run -it --entrypoint /bin/bashveya benzeri).
L0j1k

59
size kolaylık sağlamak için, -itbir kombinasyonudur -ive -thangi --interactivesırayla ( "STDIN bağlı değil bile açmak koru") --tty( "sahte TTY'yi ayırma").
Adrian Föder

23
Alpine Linux tabanlı kaplarda bash olmayabilir, bu durumda sh yerine sh kullanın.
Robin Green

9
@ L0j1k docker run -it --entrypoint /bin/bash <imageid> --any --more --args, sadece insanlar için açıklığa kavuşturmak için
Alexander Mills

2
@AlexanderMills Evet ve daha fazla açıklığa kavuşturmak için, --any --more --argssahip olduklarınız görüntünün CMDDocker olarak değil , tanımlandığı her şeye beslenir (veya görüntünüz yalnızca bir ENTRYPOINTve hayır tanımlarsa CMD, bu seçenekler /bin/bashburada belirttiğiniz gibi beslenir. ). Yani, örneğin başka docker runseçenekler (örneğin --net "host") ihtiyaç kala <imageid>.
L0j1k

302

Çalışan bir kapsayıcıya bash yazmak için şunu yazın:

docker exec -t -i container_name /bin/bash

veya

docker exec -ti container_name /bin/bash

veya

docker exec -ti container_name sh

Bir Linux kapsayıcısı olduğunu varsayın?
Peter Mortensen

5
/ bin / bash gerekli değildi sadece bash benim için yaptı
Anand Varkey Philips

6
docker exec -itdocker exec -t -i
Onun

fark nedir @VaTo
AATHITH RAJENDRAN

@AATHITHRAJENDRANI sadece iki bayrağa sahip olmak yerine komutun daha kısa bir biçimini tercih eder, bu iki seçeneği de -it argümanına dahil edebilirsiniz.
VaTo

85

Diyelim ki kendi nedenleriniz için gerçekten SSH kullanmak istiyorsunuz. Birkaç adım alır, ancak yapılabilir. Ayarlamak için kabın içinde çalıştıracağınız komutlar ...

apt-get update
apt-get install openssh-server

mkdir /var/run/sshd
chmod 0755 /var/run/sshd
/usr/sbin/sshd

useradd --create-home --shell /bin/bash --groups sudo username ## includes 'sudo'
passwd username ## Enter a password

apt-get install x11-apps ## X11 demo applications (optional)
ifconfig | awk '/inet addr/{print substr($2,6)}' ## Display IP address (optional)

Artık SSH istemcisine X11 iletme kullanarak grafik uygulamaları (kapsayıcıda yüklenmişlerse) çalıştırabilirsiniz:

ssh -X username@IPADDRESS
xeyes ## run an X11 demo app in the client

İlgili bazı kaynaklar:


33

Burada benim gibi bir Docker Compose'ya özel cevap arıyorsanız, oluşturulan kapsayıcı kimliğini aramak zorunda kalmadan kolay bir yol sağlar.

docker-compose exechizmetin adını docker-compose.ymldosyanıza göre alır.

'Web' hizmetiniz için bir Bash kabuğu almak için şunları yapabilirsiniz:

$ docker-compose exec web bash

docker-compose runkonteyneriniz henüz mevcut değilse de çalışır.
Paul

23

Uyarı : Bu cevap yazdığım bir aracı teşvik ediyor.

Çalışan herhangi bir kapsayıcıya 'yapıştırabileceğiniz' kapsayıcı bir SSH sunucusu oluşturdum. Bu şekilde her kap ile kompozisyonlar oluşturabilirsiniz. Tek şart, kabın Bash'a sahip olmasıdır.

Aşağıdaki örnek, 'kapsayıcı' adlı bir kapsayıcıya eklenen bir SSH sunucusunu başlatır.

docker run -d -p 2222:22 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -e CONTAINER=my-container -e AUTH_MECHANISM=noAuth \
  jeroenpeeters/docker-ssh

ssh localhost -p 2222

Bu SSH hizmetine (seçtiğiniz SSH istemcinizle) bağlandığınızda kapsayıcıda 'kapsayıcı' adıyla bir Bash oturumu başlatılır.

Daha fazla işaretçi ve belge için bkz. Https://github.com/jeroenpeeters/docker-ssh


1
Çok tatlı. Bu şekilde yapmanın en büyük avantajı, tamamen işlevsel bir terminal elde etmenizdir. "Docker exec" yaklaşımını kullandığımda, terminal içeriğini temizleyemedim, lessher çalıştırdığımda bir uyarı gösteriyordum. Jeroen'in kapsayıcısını kullanmak bana şimdiye kadar çok daha iyi bir deneyim sunuyor. Sadece belgeleri kontrol ettiğinizden emin olun . Yanıttaki örnek komut artık geçerli görünmüyor.
Rafał

1
harika bir araç. Bir jenkins boru hattı liman işçisi ajan olarak nasıl kullanabilirim biliyor musunuz? Ben jenkins SCP tarafından uzak bir ana bilgisayara bazı dosyaları aktarmak ve SSH ile yürütmek istiyorum
Gilson

21

Windows'ta Docker kullanıyorsanız ve bir kapsayıcıya kabuk erişimi almak istiyorsanız, bunu kullanın:

winpty docker exec -it <container_id> sh

Büyük olasılıkla, Git Bash zaten yüklü. Yüklemezseniz, yüklediğinizden emin olun.


1
Linux Docker kapsayıcısı var mı?
Peter Mortensen

1
docker exec -ti <container_id> cmd iyi çalışıyor
PBo

17

Kapsayıcı zaten çıkmışsa (belki bazı hatalardan dolayı),

$ docker run --rm -it --entrypoint /bin/ash image_name

veya

$ docker run --rm -it --entrypoint /bin/sh image_name

veya

$ docker run --rm -it --entrypoint /bin/bash image_name

yeni bir kap oluşturmak ve içine bir kabuk almak. --Rm'yi belirttiğinizden, kabuktan çıktığınızda kap silinir.


16

Bazı durumlarda görüntünüz Alpine tabanlı olabilir. Bu durumda atacak:

OCI çalışma zamanı exec başarısız oldu: exec başarısız oldu: container_linux.go: 348: konteyner işleminin başlatılmasına "exec: \" bash \ "neden oldu: yürütülebilir dosya $ PATH içinde bulunamadı: bilinmiyor

Çünkü /bin/bashmevcut değil. Bunun yerine şunları kullanmalısınız:

docker exec -it 9f7d99aa6625 ash

veya

docker exec -it 9f7d99aa6625 sh

15

SSH'yi şu komutu kullanarak bir Docker kapsayıcısına:

sudo docker exec -i -t (container ID) bash

12

Bir Windows kapsayıcısında cmd'ye bağlanmak için şunu kullanın:

docker exec -it d8c25fde2769 cmd

Burada d8c25fde2769 kapsayıcı kimliği.


11

Çok basit !

Tüm Docker görüntülerinizi listeleyin:

sudo docker images

Sistemimde şu çıktıyı gösterdi:

REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
bash                latest              922b9cc3ea5e        9 hours ago
14.03 MB
ubuntu              latest              7feff7652c69        5 weeks ago         81.15 MB

Bilgisayarımda iki Docker görüntüsü var. Diyelim ki ilkini çalıştırmak istiyorum.

sudo docker run -i -t ubuntu:latest /bin/bash

Bu konteynerin terminal kontrolünü verecektir. Artık konteynerin içindeki her türlü kabuk işlemini yapabilirsiniz. Bunu yapmak gibi ls, dosya sisteminin kökündeki tüm klasörleri çıktılar.

bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

11

Dosyaları incelemek docker run -it <image> /bin/shiçin etkileşimli bir terminal almak üzere çalıştırın . Görüntülerin listesi ile elde edilebilir docker images. docker execBu çözümün aksine , bir görüntünün başlamaması (veya çalıştırıldıktan hemen sonra kapanması) durumunda da çalışır.


Linux Docker görüntüsü var mı?
Peter Mortensen

10

GOINSIDE ÇÖZÜM

goinsidekomut satırı aracını aşağıdakilerle yükle :

sudo npm install -g goinside

ve uygun terminal boyutuna sahip bir yükleme istasyonu konteynerinin içine gidin:

goinside docker_container_name

eski cevap

Bu snippet'i yerleştirdik ~/.profile:

goinside(){
    docker exec -it $1 bash -c "stty cols $COLUMNS rows $LINES && bash";
}
export -f goinside

Bu sadece herkesin çalışan bir konteynerin içine girmesini sağlamakla kalmaz:

goinside containername

Ayrıca, sabit Docker konteyneri terminal boyutları hakkında uzun süredir devam eden bir sorunu da çözmektedir . Eğer yüzleşirseniz çok sinir bozucu.

Ayrıca bağlantıyı izlerseniz docker kapsayıcı adlarınız için de komut tamamlamanız gerekir.


1
Teşekkürler. En azından bash zaten dahil olan görüntüler için bir cazibe gibi çalışır. Bununla birlikte, alpin bazlı görüntüler için işe yaramayabilir, özellikle sh / ash vb için yazılmış farklı bir işlevle sabitlenebilir
Gaurav Bhaskar

8
$ docker exec -it <Container-Id> /bin/bash

Veya kabuğa bağlı olarak,

$ docker exec -it <Container-Id> /bin/sh

Sen alabilirsiniz konteyner-Id aracılığıyla docker pskomuta

-i = etkileşimli

-t = bir psuedo-TTY tahsis etmek


8

Kabın terminaline daha kolay erişim için bir terminal fonksiyonu oluşturdum. Belki sizin için de yararlıdır:

Sonuç, yazmak yerine:

docker exec -it [container_id] /bin/bash

yazacaksın:

dbash [container_id]

Aşağıdakileri ~ / .bash_profile (veya sizin için işe yarayan herhangi bir şey) içine koyun, ardından yeni bir terminal penceresi açın ve kısayolun tadını çıkarın:

#usage: dbash [container_id]
dbash() {
    docker exec -it "$1" /bin/bash
}

7

-ti seçeneğini geçirerek docker kapsayıcısındaki terminalle etkileşim kurabilirsiniz

docker run --rm -ti <image-name>
eg: docker run --rm -ti ubuntu

-t terminal standları -i interaktif standlar


6

docker execkesinlikle bir çözüm olacaktır. Sorduğunuz soru ile çalışmanın kolay bir yolu, Docker içindeki dizini yerel sistemin dizinine monte etmektir .

Böylece yerel yoldaki değişiklikleri anında görüntüleyebilirsiniz.

docker run -v /Users/<path>:/<container path> 

1
komutunuz aslında ana bilgisayarın dizinini kaba bağlar.
Demonbane

Evet! Başka bir dizine yedek alın ve birimi bağlayın, ardından yedeklemeyi bağlı klasöre taşıyın.
Pratik

6

kullanın:

docker attach <container name/id here>

Diğer bir yol da, bunun için bir tehlike olsa da, kullanmaktır attach, ancak oturumdan Ctrl+ Cçıkmak için kapsayıcıyı da durduracaksınız. Sadece ne olduğunu görmek istiyorsanız, kullanın docker logs -f.

:~$ docker attach --help
Usage:  docker attach [OPTIONS] CONTAINER

Attach to a running container

Options:
      --detach-keys string   Override the key sequence for detaching a container
      --help                 Print usage
      --no-stdin             Do not attach STDIN
      --sig-proxy            Proxy all received signals to the process (default true)


4

Docker yüklüyse Kitematic, GUI'yi kullanabilirsiniz. KitematicDocker simgesinden açın ve Kitematicpencerede kapsayıcınızı seçin ve ardından execsimgeye tıklayın .

Kapsayıcı günlüğünü ve çok sayıda kapsayıcı bilgisini (ayarlar sekmesinde) bu GUI'de de görebilirsiniz.

Menüden Kitematic'i seçin

Exec tıklayın


2

Benim durumumda, bazı nedenlerden ötürü, her kaptaki ağla ilgili tüm bilgileri kontrol etmem gerekiyor. Bu nedenle, aşağıdaki komutların bir kapta geçerli olması gerekir ...

ip
route
netstat
ps
...

Tüm bu cevapları kontrol ettim, hiçbiri bana yardımcı olmadı. Diğer web sitelerinde bilgi aradım. İngilizce yazılmadığından buraya süper bir bağlantı eklemeyeceğim. Bu yazıyı benimle aynı gereksinimleri olan insanlar için özet bir çözümle koydum.

Işık testi adlı bir çalışan kabınız olduğunu varsayalım. Aşağıdaki adımları takip et.

  • docker inspect light-test -f {{.NetworkSettings.SandboxKey}}. Bu komut şöyle cevap alacak/var/run/docker/netns/xxxx .
  • Sonra ln -s /var/run/docker/netns/xxxx /var/run/netns/xxxx. Dizin olmayabilir, yapınmkdir /var/run/netns önce yapın.
  • Artık ip netns exec xxxx ip addr showağ dünyasını kapsayıcıda keşfetmeye çalışabilirsiniz .

PS. xxxxher zaman ilk komuttan alınan değerle aynıdır. Ve elbette, diğer komutlar da geçerlidir ip netns exec xxxx netstat -antp|grep 8080.


1

Başka bir seçenek nsenter kullanmaktır .

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

2
İle ilgili bir takım sorunlar var nsenter. Birincisi, verili olmayan docker ana bilgisayarına fiziksel erişime sahip olmanızı gerektirir (bir uzak docker API'sı ile çalışıyor olabilirsiniz). Ayrıca, altında çalışmak nsentersizi Docker'ın koyduğu güvenlik ve kaynak kısıtlamalarından muaftır (bu, ortamınıza bağlı olarak bir profesyonel veya con olabilir).
larsks

1
Nsenter'in yazarı bile bu günleri kullandığını söylüyordocker exec .
L0j1k

1
@larsks Evet, her ikisinin de kendi yararları var. Örneğin, bu nsenter'in bir yararıdır docker exec. docker execbenim için daha zarif görünüyor.
xuhdev

2
@ L0j1k Daha az kafa karıştırıcı olmak için: bahsettiğiniz gönderi nsenter'in yazarı değil, nsenter'ı çalıştıran bir Docker görüntüsünün yazarıdır.
xuhdev

1

Docker Compose kullanıyorsanız, bu sizi Docker konteynerinin içine götürür.

docker-compose run container_name /bin/bash

Kapsayıcı içinde sizi Dockerfile içinde tanımlanan WORKDIR'e götürür. Çalışma dizininizi şu şekilde değiştirebilirsiniz:

WORKDIR directory_path # E.g  /usr/src -> container's path

0

Adlı çalışan bir kapsayıcıda yürütmek testiçin aşağıdaki komutlar aşağıdadır

Kapta bashkabuk varsa

docker exec -it test /bin/bash

Kabın bournekabuğu varsa ve çoğu durumda mevcutsa

docker run -it test /bin/sh

-3

Liman işçisi oluşturma için (Docker4Drupal)

docker-compose exec php bash

Kullandığım Drupal için Docker Linux dizüstü. Konteyneri çalıştırdıktan sonra konteynere docker-compose exec php bashbağlanmak için ' ' tuşunu kullanıyorum , böylece drush komandolarını çalıştırabiliyorum. Benim için iyi çalışıyor.

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.