it-swarm.com.de

Wie komme ich in die Shell eines Docker-Containers?

Ich arbeite gerade mit Docker. Ich verwende das WordPress-Basisbild und das Docker-Compose.

Ich versuche, ssh in einen der Container zu setzen, um die Dateien/Verzeichnisse zu überprüfen, die während des Erstellens erstellt wurden. Ich habe versucht, docker-compose run containername ls -la auszuführen, aber das hat nichts getan. Selbst wenn es so wäre, hätte ich lieber eine Konsole, auf der ich die Verzeichnisstruktur durchlaufen kann, anstatt einen einzelnen Befehl auszuführen. Was ist der richtige Weg, um dies mit Docker zu tun?

730
Andrew

Mit docker attach können Sie eine Verbindung zu Ihrem Docker-Container herstellen, dies ist jedoch nicht wirklich dasselbe wie ssh. Wenn in Ihrem Container beispielsweise ein Webserver ausgeführt wird, verbindet docker attach Sie wahrscheinlich mit stdout des Webserverprozesses. Es wird Ihnen nicht unbedingt eine Shell geben.

Der docker exec-Befehl ist wahrscheinlich das, wonach Sie suchen. Dadurch können Sie beliebige Befehle in einem vorhandenen Container ausführen. Zum Beispiel:

docker exec -it <mycontainer> bash

Jeder Befehl, den Sie ausführen, muss natürlich im Container-Dateisystem vorhanden sein.

Im obigen Befehl ist <mycontainer> der Name oder die ID des Zielcontainers. Es spielt keine Rolle, ob Sie docker compose verwenden oder nicht. Führen Sie einfach docker ps aus und verwenden Sie entweder die ID (eine in der ersten Spalte angezeigte hexadezimale Zeichenfolge) oder den Namen (in der letzten Spalte angezeigt). ZB gegeben:

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

Ich kann rennen:

$ 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

Ich könnte dasselbe erreichen, indem ich renne:

$ docker exec -it d2d4a89aaee9 ip addr

Ebenso könnte ich eine Shell im Container starten;

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

Geben Sie Folgendes ein, um in einen laufenden Container einzugreifen:

docker exec -t -i container_name /bin/bash
227

Sagen wir, aus Gründen, die Sie selbst haben, möchten Sie wirklich SSH verwenden. Es dauert ein paar Schritte, aber es ist möglich. Hier sind die Befehle, die Sie im Container ausführen würden, um ihn einzurichten ...

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)

Jetzt können Sie sogar grafische Anwendungen (wenn sie im Container installiert sind) mit X11-Weiterleitung an den SSH-Client ausführen:

ssh -X [email protected]
xeyes ## run an X11 demo app in the client

Hier einige verwandte Ressourcen:

67
nobar

Notice: Diese Antwort fördert ein von mir geschriebenes Werkzeug.

Ich habe einen containerisierten SSH-Server erstellt, den Sie an jeden laufenden Container "anhängen" können. Auf diese Weise können Sie mit jedem Container Kompositionen erstellen. Die einzige Voraussetzung ist, dass der Container Bash hat.

Das folgende Beispiel würde einen SSH-Server starten, der an einen Container mit dem Namen 'my-container' angehängt ist.

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

Wenn Sie eine Verbindung zu diesem SSH-Dienst herstellen (mit Ihrem SSH-Client Ihrer Wahl), wird eine Bash-Sitzung mit dem Namen 'my-container' im Container gestartet.

Weitere Hinweise und Dokumentation finden Sie unter: https://github.com/jeroenpeeters/docker-ssh

19
Jeroen Peeters

SSH in einen Docker-Container mit folgendem Befehl:

Sudo docker exec -i -t (container ID) bash
14
Tjs

Wenn Sie hier nach einer Docker-Compose-spezifischen Antwort suchen, ist dies ein einfacher Weg, ohne die generierte Container-ID nachschlagen zu müssen.

docker-compose exec nimmt den Namen des Dienstes gemäß Ihrer docker-compose.yml-Datei an.

Um eine Bash-Shell für Ihren "Web" -Dienst zu erhalten, können Sie Folgendes tun:

$ docker-compose exec web bash
14
bcmcfc

Wenn Sie Docker unter Windows verwenden und Shell-Zugriff auf einen Container erhalten möchten, verwenden Sie Folgendes:

winpty docker exec -it <container_id> sh

Wahrscheinlich haben Sie bereits Git Bash installiert. Wenn nicht, stellen Sie sicher, dass Sie es installieren.

11
Cosmin Ababei

In einigen Fällen kann Ihr Image auf Alpen basieren. In diesem Fall wird es werfen:

OCI-Laufzeit-Exec fehlgeschlagen: Exec fehlgeschlagen: container_linux.go: 348: Starten von Containerprozess verursacht "exec: \" bash ": ausführbare Datei nicht gefunden in $ PATH": unbekannt

Weil /bin/bash nicht existiert. Stattdessen sollten Sie Folgendes verwenden:

docker exec -it 9f7d99aa6625 ash

oder

docker exec -it 9f7d99aa6625 sh
7
Deoxyseia

Es ist einfach !

Listen Sie alle Ihre Docker-Bilder auf:

Sudo docker images

Auf meinem System wurde folgende Ausgabe angezeigt:

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

Ich habe zwei Docker-Images auf meinem PC. Nehmen wir an, ich möchte den ersten laufen lassen.

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

Dies gibt Ihnen die Terminalkontrolle des Containers. Jetzt können Sie alle Arten von Shell-Vorgängen im Container ausführen. Wie ls werden alle Ordner im Stammverzeichnis des Dateisystems ausgegeben.

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

GOINSIDE-LÖSUNG

installieren Sie goinside Befehlszeilenprogramm mit:

Sudo npm install -g goinside

und gehen Sie in einen Docker-Container mit der richtigen Terminalgröße mit:

goinside docker_container_name

alte Antwort

Wir haben diesen Ausschnitt in ~/.profile eingefügt:

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

Dies ermöglicht es nicht nur jedem, in einen laufenden Container einzusteigen:

goinside containername

Es löst auch ein langlebiges Problem bei festen Docker-Containerterminalgrößen . Was sehr ärgerlich ist, wenn man es sieht.

Wenn Sie dem Link folgen, haben Sie auch die Befehlsbeendigung für die Docker-Containernamen.

5
Soorena

Um eine Verbindung zu cmd in einem Windows-Container herzustellen, verwenden Sie

docker exec -it d8c25fde2769 cmd

Wobeid8c25fde2769die Container-ID ist.

5
Aqeel Qureshi

Verwenden Sie diesen Befehl:

docker exec -it containerid /bin/bash
4
Admin Hack

Benutzen:

docker attach <container name/id here>

Die andere Möglichkeit, auch wenn die Gefahr besteht, besteht darin, attach zu verwenden, aber wenn Sie Ctrl + C Um die Sitzung zu beenden, stoppen Sie auch den Container. Wenn Sie nur sehen möchten, was gerade passiert, verwenden Sie 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
rbrooker

docker exec wird definitiv eine Lösung sein. Mit der Frage, die Sie gestellt haben, können Sie ganz einfach arbeiten, indem Sie das Verzeichnis in Docker an das Verzeichnis des lokalen Systems anhängen .

Damit können Sie die Änderungen im lokalen Pfad sofort anzeigen.

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

Um Dateien zu untersuchen, führen Sie docker run -it <image> /bin/bash aus, um ein interaktives Terminal zu erhalten. Die Liste der Bilder kann über docker images abgerufen werden. Im Gegensatz zu docker exec funktioniert diese Lösung auch für den Fall, dass ein Bild nicht startet (oder unmittelbar nach dem Ausführen beendet wird).

3
igo

Wenn Sie Docker mit Kitematic installiert haben, können Sie die GUI verwenden. Öffnen Sie Kitematic über das Docker-Symbol und wählen Sie im Fenster Kitematic Ihren Container aus. Klicken Sie dann auf das Symbol exec.

Das Containerprotokoll und viele Containerinformationen (auf der Registerkarte Einstellungen) können Sie auch in dieser GUI sehen.

 Select Kitematic from menu

 Click on exec

3
Alireza Fattahi

Wenn der Container bereits beendet wurde (möglicherweise aufgrund eines Fehlers), können Sie dies tun

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

oder

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

oder

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

um einen neuen Container zu erstellen und eine Shell einzubinden. Da Sie --rm angegeben haben, wird der Container beim Beenden der Shell gelöscht.

2
user674669

In meinem Fall muss ich aus irgendeinem Grund alle Netzwerkinformationen in jedem Container überprüfen. Die folgenden Befehle müssen also in einem Container gültig sein ...

ip
route
netstat
ps
...

Ich habe alle diese Antworten durchgesehen, keine war hilfreich für mich. Ich habe auf anderen Websites nach Informationen gesucht. Ich füge hier keinen Superlink hinzu, da er nicht in englischer Sprache verfasst ist. Deshalb habe ich diesen Beitrag mit einer zusammenfassenden Lösung für Menschen veröffentlicht, die dieselben Anforderungen wie ich haben. 

Angenommen, Sie haben einen laufenden Container namens light-test. Folgen Sie den unteren Schritten. 

  • docker inspect light-test -f {{.NetworkSettings.SandboxKey}}. Dieser Befehl erhält eine Antwort wie /var/run/docker/netns/xxxx.
  • Dann ln -s /var/run/docker/netns/xxxx /var/run/netns/xxxx. Das Verzeichnis ist möglicherweise nicht vorhanden, zuerst mkdir /var/run/netns.
  • Jetzt können Sie ip netns exec xxxx ip addr show ausführen, um die Netzwerkwelt im Container zu erkunden. 

PS. xxxx ist immer der gleiche Wert, der vom ersten Befehl erhalten wurde. Natürlich sind auch andere Befehle gültig, d. H. ip netns exec xxxx netstat -antp|grep 8080

1
Light.G

Ich habe eine Terminalfunktion für den einfacheren Zugriff auf das Containerterminal erstellt. Vielleicht ist es auch für euch nützlich:

Das Ergebnis ist also, anstatt Folgendes einzugeben:

docker exec -it [container_id] /bin/bash

du wirst schreiben:

dbash [container_id]

Fügen Sie Folgendes in Ihr ~/.bash_profile ein (oder was auch immer für Sie funktioniert), öffnen Sie dann ein neues Terminalfenster und genießen Sie die Verknüpfung:

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

sie können mit dem Terminal im Docker-Container interagieren, indem Sie die Option -ti übergeben

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

-t steht für terminal -i steht für interaktiv

1
Alwin

Wenn Sie Docker Compose verwenden, gelangen Sie in einen Docker-Container.

docker-compose run container_name /bin/bash

Im Container gelangen Sie zu WORKDIR, das in der Dockerfile definiert ist. Sie können Ihr Arbeitsverzeichnis mit ändern

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

Eine andere Option ist die Verwendung von nsenter .

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

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

Oder abhängig von der Shell kann es sein 

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

Sie können den Befehl container-Id über den Befehl docker ps erhalten

-i = interaktiv

-t = um einen Pseudo-TTY zu vergeben

0