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
.
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]:/#
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é.
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>
Zkuste to:
Sudo docker run -i -t webserver /bin/bash
Zdroj: https://docs.docker.com/engine/reference/commandline/run/
Na základě odpovědi @ Timura jsem vytvořil následující praktický skript
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
.
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
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/
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
@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í
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.
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:
Podstata souboru Dockerfile je https://Gist.github.com/devbkhadka/98792f7bca57f9778793b2db758b3d07 .
docker run -it openjdk:8
Toto funguje :-)
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.
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}
Chcete-li bash do běžícího kontejneru, zadejte toto:
docker exec -t -i container_name /bin/bash