it-swarm-eu.dev

Jak se dostat bash nebo ssh do běžícího kontejneru v režimu na pozadí?

Chci ssh nebo bash do běžícího doku. Viz příklad:

$ 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 

Teď chci něco takového získat (jít do běžícího kontejneru):

$ Sudo docker run -t -i webserver (nebo možná 665b4a1e17b6 namísto)
$ [email protected]:/#

Když však spustím řádek výše, dostanu nové ID KONTAINERU:

$ [email protected]:/#

Použil jsem Vagrant a chtěl bych získat podobné chování jako vagrant ssh.

953

Odpověď je Dockerův attach příkaz. Takže v mém příkladu výše bude řešením:

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

Pro Docker verze 1.3 nebo novější: Díky uživateli WiR3D , který navrhl jiný způsob, jak získat Shell kontejneru. Pokud použijeme attach, můžeme použít pouze jednu instanci Shell. Pokud tedy chceme otevřít nový terminál s novou instancí Shell kontejneru, stačí spustit následující:

$ Sudo docker exec -i -t 665b4a1e17b6 /bin/bash #by ID

nebo

$ Sudo docker exec -i -t loving_heisenberg /bin/bash #by Name
$ [email protected]:/#
1328

Od Dockeru 1.3 a následujících:

docker exec -it <containerIdOrName> bash

V zásadě, pokud byl kontejner Docker spuštěn pomocí příkazu /bin/bash, Můžete k němu přistupovat pomocí attach. Pokud ne, musíte provést příkaz k vytvoření instance Bash uvnitř kontejneru pomocí exec.

Také ukončete Bash, aniž byste museli Bash běžet v nepoctivém procesu:

exit

Jo, je to tak jednoduché.

690
WiR3D

Přestože autor otázky konkrétně uvedl, že má zájem o běžící kontejner, stojí za zmínku, že pokud kontejner neběží, ale chtěli byste ho spustit tak, aby se kolem vás hrabali:

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

127
Adam Kalnas

Zkuste to:

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

Zdroj: https://docs.docker.com/engine/reference/commandline/run/

28
kraxor

Na základě odpovědi @ Timura jsem vytvořil následující praktický skript

Založit

Dát docker-ssh soubor ve vašem $PATH s následujícím obsahem

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

Poznámka : Některé kontejnery neobsahují bash, ale ash, sh atd. V těchto ve výše uvedeném skriptu budou nahrazeny případy bash.

Používání

Pokud máte pouze jednu spuštěnou instanci, jednoduše spusťte

$> docker-ssh 

V opačném případě zadejte parametr docker id, který získáte od docker ps (první sloupec)

$> docker-ssh 50m3r4nd0m1d
19
Matyas

Pokud váš kontejner nemá nainstalován bash, můžete zkusit sh:

docker exec -it CONTAINER /bin/sh

Nebo nejprve hledejte skořápky v/bin:

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

Vytvořil jsem kontejnerizovaný server SSH, který poskytuje možnosti SSH každému spuštěnému kontejneru. Nemusíte měnit svůj kontejner. Jediným požadavkem je, aby kontejner měl bash.

Pokud máte kontejner s názvem 'web-server1'. Následující příkaz pro spuštění doku by spustil druhý kontejner, který by poskytl SSH pro první kontejner.

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

Další ukazatele najdete u pokladny https://github.com/jeroenpeeters/docker-ssh

9
Jeroen Peeters

@jpetazzo má skvělý příspěvek na toto téma . Krátkou odpovědí by bylo použití nsenter:

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

P.S .: Nezapomeňte zkontrolovat diskusi v komentářích příspěvku ...

Na zdraví

6
Richard

Můžete také dát kontejneru Docker rutinní IP adresu pomocí Pipework a poté SSH do stroje s touto novou IP adresou.

Bude to spíše „tradiční“ (ssh), namísto použití příkazu pro konkrétní aplikaci, jako je docker attach, a nakonec to učiní „přenosnějším“ napříč systémy a verzemi.

4
radriaanse

Někdy bude užitečné, aby bylo možné zasáhnout do kontejneru Docker, zejména během vývoje. Následující obrázek Docker umožňuje ssh do kontejneru pomocí soukromého klíče:

buntuWithSSH-Docker

Podstata souboru Dockerfile je https://Gist.github.com/devbkhadka/98792f7bca57f9778793b2db758b3d07 .

3
Dev Khadka
docker run -it openjdk:8

Toto funguje :-)

2
Kishan B

JDI DOVNITŘ

nainstalovat nástroj příkazového řádku goinside s:

Sudo npm install -g goinside

a jít dovnitř kontejnerového kontejneru se správnou velikostí terminálu s:

goinside docker_container_name

pro více informací zkontrolujte toto out.

1
Soorena

Jen pro informaci. Pokud se potřebujete přihlásit v jednoduchém kontejneru, který není démonem, musíte použít následující příkazy:

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

Chcete-li bash do běžícího kontejneru, zadejte toto:

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