Vraag Hoe kun je bash of ssh in een actieve container krijgen in de achtergrondmodus?


Ik wil ssh of bash in een draaiende docker-container. Zie alsjeblieft het voorbeeld:

$ 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 

nu wil ik zoiets krijgen (ga in de lopende container):

$ 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:/#

Ik heb Vagrant gebruikt en ik zou graag een vergelijkbaar gedrag krijgen als vagrant ssh.


795
2017-08-01 16:19


oorsprong


alternatief sudo docker exec -i -t 665b4a1e17b6 /bin/sh apt-programma's en -pakketten kunnen installeren - fonjeekay


antwoorden:


Het antwoord is Docker's attach opdracht. Dus voor mijn voorbeeld hierboven is de oplossing:

$ sudo docker attach 665b4a1e17b6 #by ID
or
$ sudo docker attach loving_heisenberg #by Name
$ root@665b4a1e17b6:/#

Voor Docker versie 1.3 of later: dank aan de gebruiker WiR3D die een andere manier heeft voorgesteld om de schaal van een container te krijgen. Als we gebruiken attach we kunnen maar één exemplaar van de shell gebruiken. Dus als we een nieuwe terminal willen openen met een nieuw exemplaar van de shell van een container, moeten we alleen het volgende uitvoeren:

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

of

$ sudo docker exec -i -t loving_heisenberg /bin/bash #by Name
$ root@665b4a1e17b6:/#

1178
2017-08-05 06:01



Of voer het uit sudo docker attach loving_heisenberg - thiagowfx
de attach-opdracht werkt niet voor mij, het zorgt ervoor dat de docker te bevriezen .. eventuele ideeën waarom het gebeurt? - Mo J. Mughrabi
Een herinnering voor boot2docker-gebruikers: sudo verwijderen :) - Henno
-i -t is gelijk aan -it - pasha.zhukov
Dit is een gevaarlijk antwoord dat moet worden geselecteerd en zo sterk wordt gestemd. docker attachIn een MongoDB-instantie zal bijvoorbeeld de instantie worden gedood. Zoals in meer detail uitgelegd deze vraag  attach en exec zijn verschillende dieren. - fwc


Vanaf Docker 1.3:

docker exec -it <containerIdOrName> bash

Kortom, als de Docker-container is gestart met behulp van de /bin/bash opdracht die u kunt gebruiken met attach. Als dat niet het geval is, moet u de opdracht uitvoeren om een ​​Bash-instantie in de container te maken met exec.

Ook om Bash te verlaten zonder Bash in een rogue proces te laten lopen:

exit

Ja, zo simpel is het.


585
2017-10-29 07:46



nog steeds niet achterhaald hoe je nano kunt laten werken. Denk eraan dat het kan gaan om docker-ssh vanuit phusion - WiR3D
Is er een manier om bash standaard in dockers in te stellen? - ipeacocks
@ipeacocks Ja, als het RUN opdracht in het dockerbestand is /bin/bash. Maar hangt ervan af wat je bedoelt. Als u de container wilt uitvoeren en bash direct beschikbaar wilt hebben in die terminal dan met -it zou het moeten doen - WiR3D
Het gebruik van koppelgroep is een slechte praktijk. Elke gebruiker die zich in een koppelingsgroep bevindt, wordt hoofdzakelijk gebruikt met rootrechten zonder de noodzaak om sudo te gebruiken. projectatomic.io/blog/2015/08/... - Maiku Mori
Ik denk dat het vanuit het oogpunt van hostbeveiliging niet veel uitmaakt of je het gebruikt sudo vs docker groep. Hoe dan ook, er is een gat in de beveiliging ingebouwd in de docker die u volledige privileges in het hostbestandssysteem van de gast kan bieden, ongeacht of u de dockergroep of sudo om de container te lanceren. - nobar


Hoewel de auteur van de vraag specifiek zei dat ze geïnteresseerd zijn in een actieve container, is het ook de moeite waard om op te merken dat als de container niet wordt uitgevoerd, maar je wilt hem gebruiken om rond te snuffelen, je kunt uitvoeren:

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


101
2017-11-07 18:46



Dat levert een andere container op, net als het antwoord van @ kraxor. - Blaisorblade


Probeer dit:

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

Bron: https://docs.docker.com/articles/basics/#running-an-interactive-shell


24
2017-08-01 16:29



Het is niet geschikt, want ik krijg een andere CONTAINER ID (root@42f1e37bd0e5:/# en niet root@665b4a1e17b6:/#) - Timur Fayzrakhmanov
link is dood, je zou moeten updaten - Ahmet Karakaya


Op basis van het antwoord van @ Timur heb ik het volgende gemaakt handig script

Opstelling

Leggen docker-ssh bestand in uw $PATH met de volgende inhoud

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

Notitie: Sommige containers bevatten geen bash, maar ash, sh etc. In deze gevallen bash zal in het bovenstaande script worden vervangen.

Gebruik

Als u één actieve instantie heeft, gewoon uitvoeren

$> docker-ssh 

Anders geef je het een docker id parmeter die je krijgt docker ps (eerste col)

$> docker-ssh 50m3r4nd0m1d

13
2018-04-20 11:39



Mag ik weten waarom we -lan aan het einde nodig hebben? - Nam G VU
start bash als inlogshell, lees de omgevingsparameters (beschreven in de regel boven het commando) - Matyas


Ik heb een gecontaineriseerde SSH-server gemaakt die SSH-mogelijkheden biedt voor elke actieve container. U hoeft uw container niet te veranderen. De enige vereiste is dat de container bash heeft.

Als u een container heeft met de naam 'web-server1'. De volgende opdracht voor het uitvoeren van koppelaars start een tweede container die SSH voor de eerste container zou bieden.

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

Voor meer verwijzingen, afrekenen https://github.com/jeroenpeeters/docker-ssh


8
2017-10-03 16:20



Dit zou het geaccepteerde antwoord moeten zijn ^ - Nam G VU
By the way, hoe kunnen we hebben. Bashrc auto geladen bij het starten van een SSH-sessie met behulp van uw oplossing? Heeft ook een probleem op github gepost github.com/jeroenpeeters/docker-ssh/issues/30 - Nam G VU


@jpetazzo heeft een geweldige post over dit onderwerp. Het korte antwoord zou zijn om te gebruiken nsenter:

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

P.S .: Vergeet niet om de discussie in de commentaren van de post te bekijken ...

Proost


5
2018-03-14 10:12



Dat is een vrij oud bericht dat is niet langer echt noodzakelijk. @ WiR3D's docker exec oplossing is eerder handiger. - drevicko


Als uw container niet op bash is geïnstalleerd (bijvoorbeeld consul), kunt u sh proberen:

docker exec -it CONTAINER /bin/sh

Of zoek eerst naar shells in / bin:

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

3
2017-07-29 13:40



Wat is "consul"? Heb je er een referentie voor? Bedoel je "troosten"? - Peter Mortensen


U kunt de Docker-container ook een routeerbaar IP-adres geven met Pipework, en daarna SSH in de machine met dat nieuwe IP-adres.

Dit zal meer "traditioneel" (ssh) zijn, in plaats van het gebruik van een toepassingsspecifieke opdracht zoals docker attach, en zal het uiteindelijk meer 'draagbaar' maken voor verschillende systemen en versies.


3
2017-10-29 11:58



Voeg alsjeblieft de simpele manier toe hoe je het moet doen. Als ik eerlijk ben, heb ik het echt nodig, maar ik heb geen tijd om de eenvoudigste oplossing hiervoor te zoeken. Zou je hier je antwoord kunnen plaatsen? Het zou geweldig zijn.. - Timur Fayzrakhmanov
Er zijn 2 manieren om dit te bereiken, maar het is niet eenvoudig en zou een grote functie worden. Je zou dit kunnen bekijken link door uzelf, voor het gebruik van leidingen of dit link, waarbij heks in essentie hetzelfde doet als Pipework en een beetje eenvoudiger is, maar je moet het handmatig doen. Het hangt dus af van hoeveel servers waar praten. Als je iets specifieks niet kunt achterhalen, laat het me weten. Maar ik heb ook geen tijd om een ​​volledige tutorial te schrijven. - radriaanse
Je hebt gelijk - er is geen voor de hand liggende en eenvoudige manier om het te doen (bedankt voor links, ik denk dat ik het later opnieuw zal bekijken. - Timur Fayzrakhmanov


docker run -it openjdk:8

Dit werkt :-)


2
2017-09-06 15:11